Diese Idee kam mir als Kind, als ich das Programmieren lernte und PRNGs zum ersten Mal begegnete. Ich weiß immer noch nicht, wie realistisch es ist, aber jetzt gibt es Stapelaustausch.
Hier ist ein 14-jähriges Schema für einen erstaunlichen Komprimierungsalgorithmus:
Nehmen Sie ein PRNG und sortieren Sie es mit seed s
, um eine lange Folge von pseudozufälligen Bytes zu erhalten. Um diese Sequenz an eine andere Partei zu übertragen, müssen Sie nur eine Beschreibung des PRNG, den entsprechenden Startwert und die Länge der Nachricht mitteilen. Für eine ausreichend lange Sequenz wäre diese Beschreibung viel kürzer als die Sequenz selbst.
Angenommen, ich könnte den Prozess umkehren. Mit genügend Zeit und Rechenressourcen könnte ich eine Brute-Force-Suche durchführen und einen Samen (und PRNG, oder mit anderen Worten: ein Programm) finden, der meine gewünschte Sequenz erzeugt (sagen wir ein amüsantes Foto von Katzen, die boshaft sind).
PRNGs wiederholen sich, nachdem eine ausreichend große Anzahl von Bits generiert wurde, aber im Vergleich zu "typischen" Zyklen ist meine Nachricht ziemlich kurz, sodass dies kein großes Problem zu sein scheint.
Voila, eine effektive (wenn auch rube-goldbergische) Möglichkeit, Daten zu komprimieren.
Angenommen also:
- Die Sequenz, die ich komprimieren möchte, ist endlich und im Voraus bekannt.
- Ich habe nicht wenig Geld oder Zeit (nur solange eine begrenzte Menge von beiden benötigt wird)
Ich würde gerne wissen:
- Gibt es einen fundamentalen Fehler in der Begründung des Systems?
- Wie kann man diese Art von Gedankenexperimenten normalerweise analysieren?
Zusammenfassung
Oft machen gute Antworten nicht nur die Antwort deutlich, sondern auch, was ich wirklich gefragt habe. Vielen Dank für die Geduld und die ausführlichen Antworten.
Hier ist mein n-ter Versuch, eine Zusammenfassung der Antworten zu geben:
- Der PRNG / Seed-Winkel trägt nichts bei, es ist nur ein Programm, das die gewünschte Sequenz als Ausgabe erzeugt.
- Das Pigeonhole-Prinzip: Es gibt viel mehr Nachrichten der Länge> k als es (Nachrichten erzeugende) Programme der Länge <= k gibt. Einige Sequenzen können also einfach nicht die Ausgabe eines Programms sein, das kürzer als die Nachricht ist.
- Erwähnenswert ist, dass der Interpreter des Programms (Nachricht) unbedingt im Voraus festgelegt wird. Und sein Design bestimmt die (kleine) Teilmenge von Nachrichten, die generiert werden können, wenn eine Nachricht der Länge k empfangen wird.
Zu diesem Zeitpunkt ist die ursprüngliche PRNG-Idee bereits tot, aber es gibt mindestens eine letzte zu klärende Frage:
- F: Könnte ich Glück haben und feststellen, dass meine lange (aber endliche) Nachricht zufällig die Ausgabe eines Programms mit einer Länge von <k Bits ist?
Streng genommen ist es keine Zufallsfrage, da die Bedeutung jeder möglichen Nachricht (Programm) im Voraus bekannt sein muss. Entweder es ist die Bedeutung einiger Nachricht von <k Bits oder ist es nicht .
Wenn ich eine zufällige Nachricht von> = k Bits zufällig wähle (warum sollte ich das tun?), Hätte ich auf jeden Fall eine verschwindende Wahrscheinlichkeit, sie mit weniger als k Bits senden zu können, und eine fast Gewissheit, nicht senden zu können es überhaupt mit weniger als k Bits.
OTOH, wenn ich eine bestimmte Nachricht von> = k Bits aus jenen auswähle, die die Ausgabe eines Programms von weniger als k Bits sind (vorausgesetzt, es gibt eine solche Nachricht), dann nutze ich tatsächlich die Bits, die bereits an das übertragen wurden Empfänger (das Design des Interpreters), der als Teil der übertragenen Nachricht zählt.
Endlich:
- F: Was ist das ganze Geschäft mit Entropie / Kolmogorov-Komplexität ?
Letztendlich erzählen uns beide dasselbe, wie das (einfachere) Pigeonhole-Prinzip uns sagt, wie viel wir komprimieren können: vielleicht gar nicht, vielleicht einige, aber sicher nicht so viel, wie wir uns vorstellen (es sei denn, wir betrügen).