PRNG를 사용하여 물건을 마술처럼 압축 할 수 있습니까?


38

이 아이디어는 프로그램을 배우고 처음 PRNG를 만난 어린 시절에 나에게 일어났다. 나는 아직도 그것이 얼마나 현실적인지 알지 못하지만 이제 스택 교환이 있습니다.

놀라운 압축 알고리즘을위한 14 살짜리 계획은 다음과 같습니다.

PRNG s를 가져와 시드 로 시드 하여 긴 일련의 의사 난수 바이트를 얻습니다. 이 시퀀스를 다른 당사자에게 전송하려면 PRNG에 대한 설명, 적절한 시드 및 메시지 길이 만 전달하면됩니다. 충분히 긴 시퀀스의 경우 해당 설명은 시퀀스 자체보다 훨씬 짧습니다.

이제 프로세스를 반전시킬 수 있다고 가정하십시오. 충분한 시간과 계산 리소스가 주어지면 무차별 검색을 수행하여 원하는 시퀀스를 생성하는 시드 (및 PRNG 또는 다른 말로하면 프로그램)를 찾을 수 있습니다 (고양이의 재미있는 사진은 장난 스럽습니다).

PRNG는 충분한 수의 비트가 생성 된 후에 반복되지만 "일반적인"주기와 비교할 때 제 메시지는 매우 짧아서 별 문제가되지 않습니다.

Voila는 데이터를 압축하는 효과적인 방법입니다.

따라서 가정 :

  • 압축하려는 시퀀스는 유한하며 미리 알려져 있습니다.
  • 현금이나 시간이 부족하지 않습니다 (유한 한 금액이 필요한 한)

알고 싶습니다 :

  • 이 계획의 추론에 근본적인 결함이 있습니까?
  • 이러한 종류의 사고 실험을 분석하는 표준 방법은 무엇입니까?

요약

좋은 답변이 답변뿐만 아니라 내가 실제로 묻는 것임을 분명히하는 경우가 종종 있습니다. 모두의 인내심과 상세한 답변에 감사드립니다.

다음은 답변 요약에 대한 n 번째 시도입니다.

  • PRNG / 시드 각도는 아무 것도 기여하지 않으며, 원하는 시퀀스를 출력으로 생성하는 프로그램에 지나지 않습니다.
  • 비둘기 구멍 원리 : 길이 <= k의 (메시지 생성) 프로그램보다 더 많은 길이> k의 메시지가 있습니다. 따라서 일부 시퀀스는 단순히 메시지보다 짧은 프로그램의 출력이 될 수 없습니다.
  • 프로그램의 해석기 (메시지)가 반드시 미리 고정되어 있다는 것은 언급 할 가치가 있습니다. 또한 길이 k의 메시지가 수신 될 때 생성 될 수있는 메시지의 작은 하위 집합을 결정합니다.

이 시점에서 원래 PRNG 아이디어는 이미 죽었지 만 해결해야 할 마지막 질문이 하나 이상 있습니다.

  • Q : 운이 좋으면서 긴 (그러나 유한 한) 메시지가 길이 <k 비트의 프로그램 출력이라는 것을 알 수 있습니까?

엄밀히 말하면, 가능한 모든 메시지 (프로그램)의 의미를 미리 알아야하므로 우연이 아닙니다. 어느 것이 <k 비트의 일부 메시지의 의미 또는 그렇지 않다 .

무작위로> = k 비트의 무작위 메시지를 선택하면 (왜 내가?) k 비트 미만을 사용하여 메시지를 보낼 수 있다는 소멸 가능성과 거의 보낼 수 없다는 확실성이 있습니다. k 비트 미만을 사용합니다.

OTOH, k 비트보다 작은 프로그램의 출력 인 메시지에서> = k 비트의 특정 메시지를 선택하면 (그러한 메시지가 있다고 가정) 실제로는 이미 전송 된 비트를 이용합니다. 전송 된 메시지의 일부로 계산되는 수신자 (인터프리터의 설계)

드디어:

궁극적으로 둘 다 (간단한) 비둘기 구멍 원리가 우리가 압축 할 수있는 양에 대해 알려주는 것과 같은 것을 알려줍니다.


6
질문을 약간 조정해도 여전히 모든 문자열을 압축 할 수는 없지만 (아래 답변에 설명 된대로) 알고리즘 정보 이론 ( en.wikipedia.org/wiki/Kolmogorov_complexity ) 을 얻습니다 . "PRNG"를 "universal Turing machine"으로 바꾸고 "seed"를 "원하는 출력을 생성하는 프로그램이 들어있는 입력 테이프"로 바꾸십시오. 대부분의 입력 테이프는 생성 된 출력보다 길지만 모든 출력에 대해 해당 출력을 생성하는 입력이 하나 이상 있습니다.
방황 논리

아니요, 그러나 압축 된 크기는 출처의 엔트로피입니다. ^ _ ^
Navin

5
실제로 이것을 구현하면 흥미로운 것을 발견 할 수 있습니다. 임의의 입력을 재구성하려면 평균적으로 원본 데이터의 모든 비트 인 seed + rng가 필요합니다. 죄송합니다.
Mark

이것이 작동하지 않는 이유를 이해하는 또 다른 방법 : PRNG가 임의로 출력을 생성 할 수 있지만 임의의 출력을 생성 할 수는 없습니다 . (PRNG의 출력은 항상 고정 된주기 또는 패턴이며 상태의 크기에 의해 제한됩니다.)
Pi Delport

@PietDelport, 모든 n에 대해주기가 훨씬 더 큰 PRNG가 있으며 제기 된 문제는 사전에 알려지지 않았습니다. 따라서 PRNG가 주기적이라는 사실이 직접적으로 문제를 해결한다고 확신하지 않습니다.

답변:


43

당신은 훌륭하고 새로운 압축 체계를 가지고 있습니다. 그럼 ...

♫ 엔트로피 게임을 모두합시다 ♫

간단히 말해서, 고정 된 대해 정확히 비트의 메시지를 압축한다고 가정합니다 . 그러나 더 긴 메시지에 사용할 수 있으려면 첫 번째 메시지와 두 번째 메시지를 구분하는 방법이 필요합니다 (압축 된 내용이 모호 할 수는 없음).nn

따라서 당신의 계획은 일부 PRNG / seed 제품군을 결정하여 압축하려는 경우 과 같이 숫자 만 쓰면 됩니다. 쿼리. 좋구나. 길이 의 다른 비트 열 은 몇 개입니까? ( 과 두 항목 중에서 n 개의 선택 사항이 있습니다 ). 즉 ,이 콤보의 을 계산 해야합니다. 문제 없어요. 그러나 를 바이너리 로 쓰면 읽을 수 있습니다. 는 얼마나 클 수 있습니까? 글쎄, 그것은 만큼 클 수 있습니다01000111001knn2n012nkk2n. 을 쓰려면 몇 비트가 필요 합니까? 입니다.2nlog2n=n

죄송합니다! 압축 방식은 압축하는 한 메시지가 필요합니다!

"하하!"라고 말하지만 "최악의 경우입니다! 내 메시지 중 하나가 매핑됩니다.이 비트를 나타내는 데 비트 만 필요합니다 . 승리!"01

예,하지만 메시지는 분명해야합니다! 떨어져 어떻게 알 수 다음에 에서 ? 일부 키의 길이가 이므로 모든 키가 있어야합니다. 그렇지 않으면 시작하고 중지 한 위치를 알 수 없습니다.1010n

"하하!"라고 말하지만 "이진 문자열의 길이를 먼저 이진수로 넣을 수 있습니다! 비트로 표현할 수있는 까지만 계산하면 됩니다 . 이제 접두사가 붙습니다. 비트 만 있어도 여전히 승리합니다! "nlogn0logn

예,하지만 이제는 실제로 큰 숫자 앞에 비트 가 붙습니다 . 압축 체계가 일부 메시지를 더 길게 만들었습니다! 그리고 당신의 모든 숫자의로 시작 , 그래서 귀하의 메시지가 더 이상!logn1

그런 다음 종료 문자, 숫자 gzipping 및 길이 자체 압축과 같은 더 많은 아이디어를 던지지 만 결과 메시지가 더 긴 경우가 있습니다. 실제로 일부 메시지에 저장하는 모든 비트에 대해 다른 메시지가 더 오래 응답합니다. 일반적으로 메시지의 "비용"을 바꾸려고합니다. 짧게 만들면 다른 사람이 더 길어집니다. 길이가 이진 문자열을 쓰는 것보다 적은 공간에서 다른 메시지를 넣을 수 없습니다 .2n2nn

"하하!"라고 말하지만 "일부 메시지를 '어리 석음'으로 선택하여 불법으로 만들 수 있습니다. 그런 다음 많은 메시지를 지원하지 않기 때문에 까지 계산할 필요 가 없습니다! "2n

당신 말이 맞지만 실제로 이기지 못했습니다. 지원하는 메시지 세트를 축소했습니다. 보내는 메시지로 및 만 지원했다면 , 코드를 사용 정확히 내가 말한 것과 정확히 일치합니다. 여기서 입니다. 메시지의 실제 길이는 중요하지 않습니다.a=0000000011010b=111111110101000a0b1n=1

"하하!"라고 말하지만 "단순히 그 멍청한 메시지가 드문 것이라고 판단 할 수 있습니다! 나는 희귀 한 메시지를 크게 만들고 일반적인 메시지를 작게 만들 것입니다. 그러면 평균적으로 이깁니다!"

네! 축하합니다, 당신은 엔트로피를 발견했습니다 ! 당신이있는 경우 메시지, 일 메시지가 확률이 전송되는의를, 당신은 엔트로피까지 예상되는 메시지의 길이를 얻을 수있는 이의 메시지 세트. 그것은 이상한 표현이지만, 당신이 정말로 알아야 할 것은 모든 메시지가 똑같이 가능성이 높을 때 가장 크다는 것입니다. 극단적으로, 기본적으로 모든 메시지는 이 될 것 입니다. 그런 다음이 매우 효율적인 코드를 사용할 수 있습니다 : ,np i H = n i = 1 p i log ( 1 / p i ) a = 000111010101 a 0 x 1 x 1 H HipiH=i=1npilog(1/pi)a=000111010101a0x1x그렇지 않으면. 그런 다음 예상 메시지 길이는 기본적으로 이며 대단합니다. 엔트로피 와 거의 비슷합니다 . 그러나 는 하한이며, 당신이 아무리 노력해도 실제로 그것을 이길 수 없습니다.1HH

엔트로피를 이길 것이라고 주장하는 것은 압축 된 메시지를 명확하게 검색 할 수있는 충분한 정보를 제공하지 못하거나 잘못되었습니다. 엔트로피는 일부 알고리즘의 실행 시간을 하한 (때로는 상한 )으로 설정할 수있는 강력한 개념입니다. 실제로 매우 느리게 (또는 느리게) 실행되면 엔트로피를 위반하는 무언가를 수행해야하기 때문에 .


13
당신이 나인 척 할 때 바보처럼 들리나요? 엔트로피를 발견 한 것에 자부심을 가질 수있는 신께 감사드립니다. 농담은 제쳐두고, 이것은 정답입니다. 톤만 조롱으로 물들지 않았다면.

6
나는 "놀라운 압축 알고리즘을위한 14 살짜리 계획"이라는 아이디어와 함께 놀려고하지 않았습니다. :)
Alexis Beingessner

3
나에게 조롱하는 것처럼 들리지 않았다. :) 이것은 대중 과학 (그리고 다른 몇 가지 분야)에서 문제를 설명하는 매우 일반적인 체계이지만, "공개 자"는 일반적으로 "실제"라기보다는 Alice 또는 Bob이라는 것이 사실이다. person : D 문제가 실제로 얼마나 복잡한 지 갑자기 쉽게 이해할 수있는 방법을 확인하십시오! (내 머리 속의 복잡한 문제를 생각할 때도 같은 과정을 사용합니다. 내부 대화는 놀랍게도 "더 많은 머리가 더 많은 것을 알고 있습니다"를 시뮬레이트하는 데 도움이됩니다)
Luaan

2
@SteveJessop, 그것은 잘못된 이분법이며 거기에 가지 않겠습니다. 좋은 대답이며 아마도 과민 반응을 보일 것입니다.

3
@chipmonkey, 나는 아직도 "엔트로피 게임"에 대한 alexis의 대답으로 덮여 있다고 생각합니다. 아마도 그렇게하는 데 필요한 알고리즘의 수가 너무 커서 사용 된 알고리즘을 지정하는 데 필요한 비트 수가 이익을 상쇄 할 수 있습니다.

21

거기 미만의 길이의 이진 스트링 과 정확히 길이의 이진 스트링 . 이것은 압축 알고리즘이 무엇이든 , 원래 문자열에서 압축 문자열로의 매핑이 주입식 (일대일)이어야하기 때문에 압축 할 수없는 문자열이 있어야 함을 의미합니다. 이것이 Kolmogorov 복잡성의 많은 응용의 원동력입니다.N 2 N N2N1N2NN

실생활에서 우리는 종종 우리가 압축하는 시퀀스에 대해 무언가를 알고 있습니다. 무손실 압축의 경우, Shannon의 소스 코딩 정리는 최적 압축률이 소스의 엔트로피와 같다는 것을 보여줍니다. 손실 인코딩의 경우 정보 이론 (속도 왜곡 이론)에 다른 이론이 있습니다. 따라서이 경우에도 데이터를 압축 할 수있는 양에는 제한이 있습니다.


나는 이런 식으로 그것을 보지 못했지만 이것은 나에게 왔습니다. 기본적으로 Shannon은 최고의 경우조차도 임의로 압축 할 수 없으며 비둘기 구멍 원리는 압축 할 수없는 최악의 경우가 있음을 보장합니다 조금도. 그것은 합리적인 특성입니까?
Jörg W Mittag

1
압축 알고리즘의 특수한 경우로 일부 문자열을 포함 할 수 있으므로 최상의 경우를 항상 압축 할 수 있습니다. 이 인수는 최악의 경우뿐만 아니라 평균적인 경우에도 작동하며 평균 압축이 최대 2 비트임을 보여줍니다.
Yuval Filmus

아 물론 이죠 if input.empty? then output_very_long_string가장 좋은 경우로 무한 압축 비율을 제공합니다. 실제로 이것을 사용하는 압축 알고리즘도 있습니다. (나는 불행하게도, 이름을 잊어 버렸습니다.) 그것은 매우 짧은 문자열을위한 것, 그리고 같은 하드 코딩 된 문자열에 대한 특별한 인코딩이됩니다 http://, www., .com등등을.
Jörg W Mittag

PRNG 패밀리를 설계 할 수없는 방법으로 미리 표현할 수없는 시퀀스를 미리 배제 할 수 있다면이 주장을 이길 수 있습니까? (잡음 형성 스프링을 염두에 두십시오).

3
@ foo1899, 일부 문자열이 다른 문자열보다 가능성이 높다고 판단하면 평균적으로 더 잘 수행 할 수 있습니다. 일반적으로 하한은 예상 압축 메시지 크기가 이길 수 없다는 것 입니다. 여기서 는 i 번째 가능한 메시지가 전송 될 확률입니다. 모든 메시지가 똑같이 가능하면 는 최대이고 그렇지 않으면 작습니다. 거의 모든 메시지가 "hello"이고 다른 모든 메시지가 드물면 극단적 인 평균 성능을 얻을 수 있습니다. "hello"-> 0을 설정하고 그렇지 않으면 x-> 1x를 설정하십시오. p i HH=ipilog1/pipiH
Alexis Beingessner

7

씨앗 길이가 이라고 가정하십시오 . PRNG는 시드의 결정 론적 기능이므로 최대 길이의 시퀀스 합니다. 이 중 이 있으므로 대응하는 가 없을 때 전체 비트 문자열을 보내는 것만으로 돌아 가지 않으면 스키마가 작동하지 않습니다 .k 2 k n 2 n n ssk2kn2nns

(다른 답변에서 언급했듯이, 이것은 선택한 압축 기능에 대해 발생합니다.)


그 자체로는 증명할 수없는 PRNG를 만들 수 없습니다. 선택한 시퀀스를 가능한 출력 중 하나로 생성하여 훨씬 적은 비트를 요구합니다. 다른 답변에서 알 수 있듯이 엔트로피는 필요한 비트 수에 하한을 적용합니다. 즉, 선택한 시퀀스에 대해 임의로 잘 수행 할 수 없습니다.

이 말씀은 모두 당신이 좋아하는 PRNG를 구성하는 경우, 다음이다 나는 이미 당신의 생각을 나누기가 발생하지 않는 순서로 당신에게 올 수 있습니다. 더 강한 진술은 더 짧은 프로그램에서 전혀 생성되지 않는 시퀀스가 ​​있다는 것입니다. (즉, 시퀀스를 본 후에 함수를 변경해도 여전히 손실됩니다. 그것이 Yuval이 "콜 모고 로프 복잡성"이라고 암시하는 것입니다.)
Louis

4

이미 알고있는 다른 포인트 외에도이 링크를 추가하고 싶습니다. https://www.schneier.com:443/blog/archives/2009/09/the_doghouse_cr.html

이제 우리 태양의 연간 에너지 생산량은 약 1.21 × 10 ^ 41 에르그입니다. 이것은 이상적인 컴퓨터에서 약 2.7 × 10 ^ 56 단일 비트 변경에 전원을 공급하기에 충분합니다. 모든 값을 통해 187 비트 카운터를 배치하기에 충분한 상태 변경. 우리가 태양 주위에 다이슨 구체를 만들고 32 년 동안 모든 에너지를 손실없이 포착한다면, 컴퓨터에 2 ^ 192까지 세도록 힘을 실을 수 있습니다. 물론,이 카운터로 유용한 계산을 수행하기 위해 에너지가 남아 있지 않을 것입니다.

따라서 원하는 데이터의 유효한 187 비트 성상도를 찾기 위해 반복 (비교)하지 않으면 이상적인 조건에서 태양이 1 년 동안 방출하는 것보다 더 많은 에너지를 얻을 수 있습니다.


1

범용 압축기가 존재할 수 없다는 매우 빠른 증거. 하나를 만들고 입력을 압축한다고 가정 해 봅시다. 이제 프로그램의 출력을 반복적으로 압축하십시오. 항상 크기를 줄일 수 있으면 1 비트가 될 때까지 모든 단계에서 크기가 점점 작아집니다.

아마도 알고리즘의 출력은 더 압축 할 수없는 구조를 가지고 있지만 다시 압축하기 전에 결정 성있는 셔플 *을 적용 할 수 있다고 주장 할 수 있습니다.

각주 : 일부 결정 론적 셔플 링은 실제로 일부 압축 방식에 도움이됩니다. http://pytables.github.io/usersguide/optimization.html?highlight=shuffling#shufflingoptim


각 압축 메시지에 s관련된 시드가 있다고 생각하지 않습니다. ´s´가 2348 인 01001011 메시지는 3924가 ´s 인 동일한 메시지와 다릅니다. foo1899의 알고리즘을 어떤 식 으로든 오해하지 않는 한.
Azeirah

1

"압축"에 PRNG를 사용하는 것은 한 가지 상황에서 기본적으로 유용합니다. "무작위"데이터를 사용해야하고 사용 된 데이터를 간결하게 기록해야합니다. 대부분의 의사 난수 생성기는 가능한 적은 수의 가능한 시퀀스 만 생성 할 수 있지만, 보통에서 적은 수의 "무작위"시퀀스 만 필요한 경우 PRNG가 생성 할 수있는 가능한 시퀀스의 비율은 종종 충분합니다.

저장하고자하는 데이터 시퀀스가 ​​특정 시드가 올바른 시드가 제공하는 것과 일치하도록 일치하게 발생하는 경우, 시드를 저장하는 것이 데이터를 저장하는 간단한 대안이 될 수 있습니다. 데이터 소스가 그러한 일치가 발생할 가능성이 높지 않은 한, 데이터 검색이 가치가없는 경우는 드 in니다.


PRNG는 이러한 방식으로 예를 들어 실험의 반복성을 위해 (의사) 랜덤 데이터 를 콤팩트하게 표현 하는 데 사용됩니다 .
Yuval Filmus

1
@ YuvalFilmus : 정확합니다. 비디오 게임 레벨 생성과 같은 일부 상황에서 사용할 수 있습니다. 생성 된 레벨의 작은 부분이 허용 가능한 것으로 간주되지만 비디오 게임 디자이너는 자신이 좋아하는 레벨을 찾을 때까지 임의로 레벨을 생성하고 시드를 기록 할 수 있습니다. 그것들을 생성했습니다. 역사적으로 매우 유용한 개념은 128 바이트의 RAM이있는 비디오 게임기를 코딩 할 때 4096 바이트의 ROM이있는 카트리지에 프로그램을 맞추려고 시도하는 것입니다.
supercat

아주 좋은 예입니다. "좋은"시드를 검색 할 때 설명한 구성과 일치하지만이 시나리오에서는 가능한 많은 메시지가 좋다는 사실을 이용합니다.

@ foo1899 : 우연히도 게임 "Pitfall" en.wikipedia.org/wiki/Pitfall ! 위에서 언급 한 기술을 사용하여 128 바이트 RAM이 장착 된 컴퓨터의 4K 게임 카트리지에서 256 화면 맵을 생성했습니다.
supercat

1

정의에 따라 압축 해제의 주입 특성 및 메시지를 나타내도록 선택할 수있는 압축 된 문자열의 제한된 유니버스로 인해 압축 할 수없는 문자열이있는 이유를 설명하는 응답의 음성 통화에 추가 할 사항은 다음과 같습니다. 엔트로피가 낮고 구조화 된 문자열보다 엔트로피가 높고 무질서한 문자열이 많기 때문에 대부분의 문자열을 압축 할 수 없으므로 실제로 다음과 같은 조건이 발생합니다. 가장 자주 압축하고 싶은 것은 대부분의 부분적 구조와 구조를 소유 한 것들이며,이 흠집에 의해, 훨씬 작은 우주 엔트로피 객체의 일부입니다. 즉, 적절한 출력 길이를 선택하면 더 작고 구조화 된 우주에서 모든 것을 압축 할 수 있습니다. 여기서 구조화, 엔트로피 및 정렬이라는 용어는 압축하려는 메시지의 의미 및 유용성의 주관적인 정의를 반영하기 위해 의도적으로 부정확합니다.

그리고 질문자의 요청에 대한 직접적인 대답 : * 예, 물론 운이 좋을 수도 있고 PRNG의 출력이 압축하려는 정확한 메시지라는 것을 알 수 있습니다. 단지 당신이 너무 자주 그것을 발견하지 못할 것입니다. PRNG를 특징 짓는 바로 그 속성, 즉 (거의) 끝없는 다양한 줄을 만들어내는 능력은 동시에 당신의 것을 만들어내는 것이 어리석지 않게 만듭니다.

물론 PRNG를 사용하여 단어 대 단어 전환의 "도메인 그래프"를 살펴보면 이러한 가능성을 완화 할 수 있으며 메시지가 나타날 가능성을 크게 높일 수 있으며 이제 압축 된 메시지에 도메인 그래프를 추가해야합니다. 길이.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.