Bu fikir, programlamayı öğrenen bir çocuk olarak ve ilk olarak PRNG'lerle karşılaştığımda ortaya çıktı. Ne kadar gerçekçi olduğunu hala bilmiyorum, ama şimdi yığın değişimi var.
İşte şaşırtıcı bir sıkıştırma algoritması için 14 yaşında bir şema:
Bir PRNG alın ve s
uzun bir sahte rastgele bayt dizisi elde etmek için tohumla birlikte tohumlayın . Bu sırayı başka bir tarafa iletmek için yalnızca PRNG'nin bir tanımını, uygun tohumlamayı ve mesajın uzunluğunu iletmeniz yeterlidir. Yeterince uzun bir sekans için, bu açıklama sekansın kendisinden çok daha kısa olacaktır.
Şimdi, süreci tersine çevirebileceğimi varsayalım. Yeterli zaman ve hesaplama kaynakları göz önüne alındığında kaba kuvvet araştırması yapabilir ve istediğim diziyi üreten bir tohum (ve PRNG veya başka bir deyişle: bir program) bulabilirim (kedilerin yaramaz olduğu eğlenceli bir fotoğraf diyelim).
PRNG'ler yeterli sayıda bit üretildikten sonra tekrar ederler, ancak "tipik" çevrimlerle karşılaştırıldığında mesajım oldukça kısadır, bu yüzden bu doz bir sorun gibi görünmüyor.
Voila, verileri sıkıştırmanın etkili (rube-Goldbergian ise) yolu.
Diyelim ki:
- Sıkıştırmak istediğim dizi sonlu ve önceden bilinmektedir.
- Nakit veya süre konusunda kısa değilim (Sadece her ikisinin sonlu bir miktarı gerekli olduğu sürece)
Bilmek isterdim:
- Planın arkasındaki gerekçede temel bir kusur var mı?
- Bu tür düşünce deneylerini analiz etmenin standart yolu nedir?
özet
İyi cevapların sadece cevabı açıkça ortaya koymadığı, gerçekte ne sorduğumun net olduğu durumdur. Herkesin sabrı ve ayrıntılı cevapları için teşekkür ederiz.
İşte benim cevapları bir özeti benim inci girişimi:
- PRNG / tohum açısı hiçbir şeye katkıda bulunmaz, istenen diziyi çıktı olarak üreten bir programdan başka bir şey değildir.
- Güvercin deliği prensibi: <> k uzunluktaki (mesaj üreten) programlardan daha fazla> k uzunluk mesajı vardır. Dolayısıyla bazı diziler mesajdan daha kısa bir programın çıktısı olamaz.
- Programın tercümanının (mesajının) önceden kesin olarak belirlendiğinden söz etmek gerekir. Ve tasarımı, k uzunluğunda bir mesaj alındığında üretilebilecek (küçük) mesaj alt kümesini belirler.
Bu noktada orijinal PRNG fikri çoktan öldü, ancak çözüme kavuşturması gereken en az bir son soru var:
- S: Şanslı olabilir ve uzun (ama sonlu) mesajımın <k bit uzunluğunda bir programın çıktısı olduğunu görebilir miyim?
Açıkçası, olası her mesajın (programın) anlamı önceden bilinmesi gerektiğinden, bu bir şans meselesi değildir. Ya olduğunu <k bitlik bazı mesajın anlamı ya da yoktur .
Eğer> = k bit rasgele bir mesaj seçersem rastgele (neden ben?)? Her durumda, onu k bitten daha az kullanarak gönderememe konusunda kaybedilme ihtimalim ve neredeyse gönderemememe konusunda kesin bir kesinliğe sahip olurdum. K bitlerinden daha az kullanarak.
OTOH, k bitlerinden daha düşük bir programın çıktısı olanlardan (= böyle bir mesaj olduğu varsayılarak) belirli bir> = k bitlik bir mesaj seçersem, o zaman aslında, aktarılan mesajın bir parçası olarak kabul eden alıcı (tercümanın tasarımı).
En sonunda:
- S: Bütün bu entropi / kolmogorov karmaşıklığı işi nedir?
Sonuçta, her ikisi de bize (daha basit) güvercin deliği ilkesiyle aynı şeyi anlatıyor: bize ne kadar sıkıştırabileceğimizi anlatıyor: belki de hiç değil, belki biraz, ama kesinlikle istediğimiz kadar değil (hile yapmazsak).