PRNGを使用して魔法のように圧縮できますか?


38

この考えは、プログラミングを学び、最初にPRNGに出会った子供として私に思いつきました。どれほど現実的かはまだわかりませんが、今ではスタック交換があります。

これは驚くべき圧縮アルゴリズムのための14歳のスキームです:

PRNG sを取得し、シードでシードして、疑似ランダムバイトの長いシーケンスを取得します。そのシーケンスを別のパーティに送信するには、PRNGの説明、適切なシード、およびメッセージの長さを伝えるだけです。十分に長いシーケンスの場合、その説明はシーケンス自体よりもはるかに短くなります。

ここで、プロセスを逆にできると仮定します。十分な時間と計算リソースがあれば、ブルートフォース検索を実行して、目的のシーケンスを生成するシード(およびPRNG、つまりプログラム)を見つけることができました(猫のいたずらの面白い写真を見てみましょう)。

PRNGは十分な数のビットが生成された後に繰り返されますが、「典型的な」サイクルと比較すると、私のメッセージは非常に短いので、これは問題のようには見えません。

Voila、データを圧縮する効果的な(ルーベゴールドバーグ式の場合)方法。

したがって、仮定:

  • 圧縮したいシーケンスは有限であり、事前にわかっています。
  • 現金も時間も不足していません(両方の有限量が必要である限り)

知りたい:

  • スキームの背後にある推論に根本的な欠陥はありますか?
  • この種の思考実験を分析する標準的な方法は何ですか?

概要

良い答えが答えを明らかにするだけでなく、私が本当に求めていたのは何であるかを明らかにすることはしばしばあります。皆の忍耐と詳細な回答に感謝します。

答えの要約に対する私のn回目の試みは次のとおりです。

  • PRNG /シード角度は何も寄与せず、目的のシーケンスを出力として生成するプログラムにすぎません。
  • ピジョンホールの原則:長さ<= kの(メッセージを生成する)プログラムよりも、長さ> kのメッセージが多くあります。そのため、一部のシーケンスは、メッセージよりも短いプログラムの出力にはなり得ません。
  • プログラム(メッセージ)のインタープリターが必ず事前に修正されていることに言及する価値があります。そして、その設計は、長さkのメッセージが受信されたときに生成できるメッセージの(小さな)サブセットを決定します。

この時点で、元のPRNGのアイデアはすでに消滅していますが、解決すべき最後の質問が少なくとも1つあります。

  • Q:幸運にも、長い(しかし有限の)メッセージがたまたま<kビットの長さのプログラムの出力であることがわかりますか?

厳密に言えば、可能性のあるすべてのメッセージ(プログラム)の意味を事前に知っておく必要があるため、偶然ではありません。それ <kビットのメッセージの意味であるかそうでないかです。

> = kビットのランダムメッセージをランダムに選択した場合(なぜですか?)、いずれの場合でも、kビット未満で送信できる確率はゼロになり、送信できないことはほぼ確実になります。使用するビット数はkビット未満です。

OTOH、kビット未満のプログラムの出力であるメッセージからkビット以上の特定のメッセージを選択すると(そのようなメッセージがあると仮定して)、実際にはすでに送信されたビットを利用していますレシーバー(インタープリターの設計)。転送されたメッセージの一部としてカウントされます。

最後に:

最終的に、両方とも、(より単純な)鳩の巣の原理が圧縮できる量について教えているのと同じことを教えてくれます:おそらくまったくない、おそらくいくつかですが、確かに私たちが空想するほどではありません(チートしない限り)。


6
質問を少し調整しても、すべての文字列を圧縮することはできません(以下の回答を参照)が、アルゴリズム情報理論(en.wikipedia.org/wiki/Kolmogorov_complexity)が得られます。「PRNG」を「ユニバーサルチューリングマシン」に、「シード」を「必要な出力を生成するプログラムを含む入力テープ」に置き換えます。ほとんどの入力テープは、生成する出力よりも長くなりますが、出力ごとに、その出力を生成する入力が少なくとも1つ存在します。
さまよう論理14年

いいえ、ただし圧縮サイズはソースのエントロピーです^ _ ^
Navin 14年

5
実際にこれを実装すると、興味深いことがわかります。任意の入力を再構築するには、平均して元のデータと同じビット数のseed + rngが必要です。おっとっと。
マーク14年

これが機能しない理由を理解する別の方法:PRNGは任意の長い出力を生成できますが、任意の出力は生成できません。(PRNGの出力は常に一定のサイクルまたはパターンであり、その状態のサイズに制約されます。)
Pi Delport 14年

@PietDelport、任意のnについて、サイクルがはるかに大きいPRNGがあり、提起された質問はnが事前にわかっています。したがって、PRNGが周期的であるという事実自体が問題を直接解決するとは思いません。

回答:


43

すばらしい新しい圧縮スキームを手に入れましたよね?じゃあ...

allみんなで遊ぼう、エントロピーゲーム♫

簡単にするために、固定nに対して、正確にビットのメッセージを圧縮することを想定します。ただし、長いメッセージに使用できるようにするには、最初のメッセージと2番目のメッセージを区別する何らかの方法が必要です(圧縮した内容を曖昧にすることはできません)。nn

したがって、あなたのスキームはPRNG /シードのいくつかのファミリーを決定し、たとえばを圧縮する場合、数kを書き込むだけで、その後にそれらのビットを生成する事前計算(および共有)シード/ PRNGコンボを識別しますn個のクエリ。わかった。長さnのビットストリングはいくつありますか?2 n(2つの項目の間でnの選択肢があります; 01)。つまり、これらのコンボの2 nを計算する必要があります。問題ない。ただし、kを読み取るにはバイナリで書き込む必要があります。kはどれくらい大きくできますか?まあ、それは2と同じくらい大きくすることができます01000111001knn2n012nkk2nを書き込むには何ビット必要ですか?log 2 n = n2nlog2n=n

おっとっと!圧縮している限り、圧縮スキームにはメッセージが必要です!

「ハハ!」とあなたは言うが、「それは最悪のケースだ!私のメッセージの1つはにマッピングされ、それを表すのに1ビットしか必要としない!勝利!」01

はい、ただしメッセージは明確でなければなりません!続いて10から0を区別するにはどうすればよいですか?キーの一部は長さnであるため、すべてのキーはそうでなければなりません。さもないと、どこで開始および停止したかわかりません。1010n

「ハハ!」と言いますが、「しかし、文字列の長さを最初にバイナリに入れることができます!それはに数えるだけでよく、nビットでます!したがって、私の 0に log nのみがプレフィックスとして追加されますビット、私はまだ勝ちます!」logn0logn

はい、しかし今では、これらの本当に大きな数字の前にビットが付いています。圧縮スキームにより、メッセージの一部がさらに長くなりました!そして、半分あなたの数字のすべてのはで始まる1ので、半分のあなたのメッセージのは、そのはるかに長いです!logn1

次に、終了文字、数字のgzip、長さ自体の圧縮などのアイデアをさらに展開しますが、それらはすべて結果のメッセージが長くなる場合があります。実際、メッセージを保存するたびに、応答で別のメッセージが長くなります。一般に、あなたはあなたのメッセージの「コスト」をシフトするだけです。いくつかを短くすると、他の部分が長くなります。長さnの2 n個のバイナリ文字列を書き出すよりも少ないスペースに異なるメッセージを収めることはできません。2n2nn

「ハハ!」と言いますが、「一部のメッセージを「愚かな」ものとして選択し、違法にすることができます。そうすれば、までカウントする必要はありません。それほど多くのメッセージをサポートしていないからです!」2n

あなたは正しいですが、あなたは本当に勝っていません。サポートするメッセージのセットを縮小しました。送信するメッセージとしてa = 0000000011010b = 111111110101000のみをサポートして場合、コードa 0b 1のみを確実に持つことができ、これは私が言ったことと完全に一致します。ここで、n = 1です。メッセージの実際の長さは重要ではありません、それはいくつあるかです。a=0000000011010b=111111110101000a0b1n=1

「ハハ!」と言いますが、「しかし、私は単純に、それらの愚かなメッセージはまれであると判断することができます!まれなメッセージを大きくし、一般的なメッセージを小さくします!そして、平均して勝ちます!」

うん!おめでとうございます、あなたはエントロピーを発見しました!メッセージがあり、i番目のメッセージに送信される確率p iがある場合、予想されるメッセージの長さをエントロピーH = n i = 1 p i lognipiこのセット1 / p iメッセージの。それは一種の奇妙な表現ですが、あなたが本当に知っておく必要があるのは、すべてのメッセージが等しく発生する場合に最大であり、一部のメッセージが他のメッセージよりも一般的である場合にそれが小さくなることです。あなたが知っていれば、極端では、基本的にすべてのメッセージがあることを行っていますH=i=1npilog(1/pi)。次に、この非常に効率的なコードを使用できます。それ以外の場合は、 a 0 x 1 xです。その場合、予想されるメッセージの長さは基本的に 1であり、これはすごいことであり、エントロピー Hに非常に近くなります。ただし、 Hは下限であり、どんなに頑張っても、実際にそれを打ち負かすことはできません。a=000111010101a0x1x1HH

エントロピーを打ち負かすと主張するものはすべて、圧縮されたメッセージを明確に取得するのに十分な情報を提供していないか、単に間違っています。エントロピーは非常に強力な概念であるため、いくつかのアルゴリズムの実行時間を下限(場合によっては上限)することができます。なぜなら、それらが非常に高速(または非常に低速)で実行される場合、エントロピーに違反する何かを実行する必要があるためです。


13
少年、あなたが私であるふりをするとき、私は愚かに聞こえますか。エントロピーを発見したことに誇りを持っていることを神に感謝します。冗談はさておき、これは良い答えです-口調だけがm笑に色合いがなかったら。

6
私は、「驚くべき圧縮アルゴリズムのための14歳のスキーム」のアイデアと一緒に遊んで、モックするつもりはありませんでした。:)
アレクシスBeingessner 14年

3
私をあざけるようにも聞こえませんでした:)これは、一般的な科学(および他のいくつかの分野)の問題を説明する非常に一般的なスキームですが、「質問者」は通常「本物」ではなく、アリスまたはボブperson:D問題が実際にどれほど複雑であるかを突然簡単に理解できることを確認してください!(私は私の頭の中で複雑な問題を考えていたとき、私は、同じプロセスを使用することを言及しないように-内側の対話がシミュレートで驚くほど良い「以上のヘッドは、より多くのを知っている」)
Luaan

2
@SteveJessop、それは間違った二分法であり、そこに行かないようにしましょう。それは良い答えであり、私はおそらく過敏だ、それはそれだ。

3
@chipmonkey、それは「エントロピーゲーム」についてのアレクシスの答えでまだカバーされていると思います。おそらく、それを行うために必要なアルゴリズムの数が非常に多いため、どちらを使用するかを指定するのに必要なビット数が利益を相殺する可能性があります。

21

ある未満の長さのバイナリ文字列N、および2 Nの長さのバイナリ文字列が正確2N1N2N。これは、圧縮アルゴリズムが何であれ、元の文字列から圧縮文字列へのマッピングが単射(1対1)でなければならないという理由だけで、圧縮できない文字列が存在する必要があることを意味します。これは、コルモゴロフの複雑さの多くのアプリケーションの背後にある推進力です。N

実生活では、圧縮するシーケンスについて何かを知っていることがよくあります。たとえば、音声や画像などです。可逆圧縮の場合、シャノンのソースコーディング定理は、最適な圧縮率がソースのエントロピーに等しいことを示しています。非可逆符号化には、情報理論(レート歪み理論)に他の定理があります。したがって、この場合でも、データを圧縮できる量には制限があります。


このように見たことはありませんが、これはちょうど私に来ました:基本的に、シャノンは最高のケースでさえも任意に圧縮することはできず、ピジョンホールの原理は圧縮できない最悪のケースがあることを保証していると言いますまったく。それは賢明な特性評価ですか?
ヨルグWミットタグ14年

1
圧縮アルゴリズムの特殊なケースとして文字列を含めることができるため、最良のケースは常に圧縮できます。この引数は、最悪の場合だけでなく平均的なケースでも機能し、平均的な圧縮が最大2ビットであることを示しています。
ユヴァルフィルマス14年

ああ、もちろん。if input.empty? then output_very_long_string最適なケースとして、無限の圧縮率が得られます。実際、これを使用する圧縮アルゴリズムもあります。(私は残念ながら、名前を忘れてしまった。)これは、非常に短い文字列を対象とし、それはのようなハードコーディングされたサブストリングのための特別なエンコード持っているhttp://www..comなどを。
ヨルグWミットタグ14年

PRNGファミリを設計する方法があり、それらが表現できないシーケンスが事前に除外されているシーケンスである場合、この議論に勝つことができますか?(ノイズシェーピングが頭に浮かぶ)。

3
H=ipilog1/pipiH

7

sk2kn2nns

(別の答えが指摘したように、これはあなたが選択したすべての圧縮関数で起こります。)


それ自体では、選択したシーケンスをその出力の1つとして生成するPRNGを構築できないことを証明しませんが、そうするために必要なビットははるかに少なくなります。私が他の答えから理解しているように、エントロピーは、必要なビット数の下限を確実に実施します。つまり、選択したシーケンスに対して勝手にうまくやることができません。

このすべては、あなたの好きなPRNGを構成する場合は、という点であると言う私はすでにあなたのアイデアを壊し、それは生産しない配列、とのあなたに来ることができます。より強力なステートメントは、非常に短いプログラムによってまったく放出されないシーケンスがあるということです。(言い換えれば、私のシーケンスを見た後に機能を変更させても、あなたはまだ失われます。それはユバルが「コルモゴロフの複雑さ」で暗示していることです。)
ルイ

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関連付けられていることを忘れていると思います。2348の 's'を持つメッセージ01001011は、3924の 's'を持つ同じメッセージとは異なります。foo1899のアルゴリズムを自分で誤解していない限り。
アゼイラ14年

1

「圧縮」にPRNGを使用すると、基本的に1つの状況で役立ちます。「ランダムな」データを使用し、使用されたデータをコンパクトに記録する必要がある場合です。ほとんどの擬似ランダムジェネレータは、可能なシーケンスのごく一部しか生成できませんが、少数から中程度の数の「ランダム」シーケンスのみが必要な場合、PRNGが生成できるシーケンスの一部は十分すぎる場合があります。

保存したいデータのシーケンスが偶然に発生し、正しいシードが与えられた特定のPRNGが生成するものと一致する場合、シードを保存することはデータを保存するためのコンパクトな代替手段です。ただし、データのソースがそのような一致が発生する可能性が高い場合を除き、それらは非常にまれであるため、それらを検索する価値はありません。


このようにPRNGを使用して、たとえば実験の再現性のために、(擬似)ランダムデータをコンパクトに表現します。
ユヴァルフィルマス14年

1
@YuvalFilmus:そのとおり。また、生成されたレベルのごく一部が許容されると見なされるビデオゲームレベル生成などの状況でも使用できますが、ビデオゲームデザイナーは自分の好みに合ったものを見つけるまでランダムにレベルを生成し、その種それらを生成しました。歴史的に非常に有用な概念で、RAMが128バイトのビデオゲームマシンをコーディングする場合、ROMが4096バイトのカートリッジにプログラムを収めようとします。
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.