PRNG'ler eşyaları sihirli bir şekilde sıkıştırmak için kullanılabilir mi?


38

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 suzun 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:

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).


6
Sorunuzu biraz düzeltin ve hala her dizeyi sıkıştıramıyorsunuz (aşağıdaki cevaplarda açıklandığı gibi), ancak Algoritmik Bilgi Teorisi ( en.wikipedia.org/wiki/Kolmogorov_complexity ) alıyorsunuz . "PRNG" yi "universal Turing machine" ve "seed" ile "istediğim çıktıyı üreten bir program içeren giriş bandı" ile değiştirin. Çoğu giriş bandı ürettikleri çıktılardan daha uzundur, ancak her çıktı için bu çıktıyı üreten en az bir girdi vardır.
Wandering Logic

Hayır, ancak sıkıştırılmış boyut kaynağın entropisidir ^ _ ^
Navin

5
Bunu gerçekten uygularsanız, ilginç bir şey bulacaksınız: rastgele girdiyi yeniden oluşturmak için, ortalama olarak her veri orijinal veri kadar büyük bir tohum + rng'ye ihtiyacınız olacak. Hata.
Mark

Bunun neden işe yaramayacağını anlamanın başka bir yolu: Bir PRNG keyfi olarak uzun çıktılar üretse bile , keyfi çıktılar üretemez . (Bir PRNG'nin çıktısı her zaman durumunun büyüklüğü ile sınırlandırılmış bir sabit döngü ya da kalıp olacaktır.)
Pi Delport

@PietDelport, Herhangi bir n için döngüsü çok daha büyük olan bir PRNG vardır ve sorulan soru önceden bilinmemektedir. Bu yüzden PRNG'lerin kendi başlarına döngüsel oldukları gerçeğinin doğrudan soruyu çözdüğüne ikna olmadım.

Yanıtlar:


43

Yeni, harika bir sıkıştırma planın var, ha? Tamam o zaman...

♫ Hepimiz oynayalım, entropi oyunu ♫

nn

01000111001knn2n012nkk2n2nlog2n=n

Hata! Sıkıştırma planınız, ne sıkıştığınız sürece mesajlara ihtiyaç duyar!

01

1010n

nlogn0logn

logn1

2n2nn

2n

a=0000000011010b=111111110101000a0b1n=1

“Haha!” Diyorsunuz, “basitçe bu aptal mesajların nadir olduğunu belirleyebiliyorum! Nadir olanları büyük ve ortak olanları küçük yapacağım! O zaman ortalama kazanırım!”

nipiH=i=1npilog(1/pi)a=000111010101a0x1x1HH

Entropiyi yendiğini iddia eden herhangi bir şey muhtemelen sıkıştırılmış mesajı açıkça almak için yeterli bilgi vermiyordur ya da sadece yanlış. Entropi o kadar güçlü bir kavram ki bazı algoritmaların çalışma zamanını daha düşük (hatta bazen üst sınırlara) bağlayabiliriz, çünkü eğer gerçekten hızlı çalışırlarsa (veya gerçekten yavaşsa), o zaman entropiyi ihlal eden bir şey yapıyor olmalılar. .


13
Benim gibi davrandığın zaman aptalca geliyor muyum? Tanrıya şükür entropiyi keşfettiğim için gurur duyabilirim. Şaka bir yana, bu iyi bir cevaptı - Eğer sadece tonu alaycılığa karıştıramadıysa.

6
Sadece "14 yaşında bir çocuk için inanılmaz bir sıkıştırma algoritması şeması" fikri ile oynaşmaya niyetli değildim. :)
Alexis Beingessner

3
Bana alaycı gibi gelmedi mi :) Bu, popüler bilimdeki (ve birkaç başka alanda) sorunları açıklamanın genel bir şemasıdır, ancak “asker” in “gerçek” değil, genellikle Alice veya Bob olduğu doğru. kişi: D Aniden, sorunun gerçekten ne kadar karmaşık olduğunu kolayca anlayabildiğinizi görün! (kafamda karmaşık bir mesele düşündüğümde, aynı işlemi kullandığımdan bahsetmiyorum - bir iç diyalog "daha fazla kafa daha fazlasını bilir"
u simüle etmede

2
@SteveJessop, bu sahte bir ikiliktir ve oraya gitmeyelim. Bu iyi bir cevap ve belki de aşırı hassasım, o kadar.

3
@ chipmonkey, sanırım bu hala "entropi oyunu" hakkındaki alexis'in cevabıyla kaplı. Muhtemelen, bunu yapmak için gereken algoritmaların sayısı o kadar büyük olacaktı ki hangisinin kullanılacağını belirtmek için gereken bit sayısı faydayı iptal edecektir.

21

2N1N2NN

Gerçek hayatta, sıkıştığımız dizi hakkında bir şeyler biliyoruz, ses veya resim. Kayıpsız sıkıştırma durumunda, Shannon'un kaynak kodlama teoremi, optimal sıkıştırma oranının kaynağın entropisine eşit olduğunu gösterir. Kayıp kodlama için bilgi teorisinde başka teoremler de var (oran-bozulma teorisi). Bu durumda bile, verileri ne kadar sıkıştırabileceğinizin bir sınırı vardır.


Buna hiç bu şekilde bakmadım, ama bu bana geldi: temel olarak, Shannon en iyi durumun bile keyfi olarak sıkıştırılamayacağını ve Güvercin Deliği Prensibi'nin sıkıştırılamayacak en kötü bir durum olduğunu garanti etti. hiç. Bu mantıklı bir karakterizasyon mu?
Jörg W Mittag

1
En iyi durum her zaman sıkıştırılabilir, çünkü bazı dizeleri sıkıştırma algoritmanızın özel bir hali olarak ekleyebilirsiniz. Bu argüman sadece en kötü durum için değil, aynı zamanda ortalama durum için de işe yarar, ortalama sıkıştırmanın en fazla 2 bit olduğunu gösterir.
Yuval Filmus

Ah, elbette. if input.empty? then output_very_long_stringEn iyi durum olarak sonsuz bir sıkıştırma oranı verirdi. Aslında, bunu kullanan bir sıkıştırma algoritması bile var. (Ne yazık ki, adını unuttum.) Çok kısa dizeleri yönelik ve bu gibi kodlanmış altdizgelerin için özel kodlamalar vardır http://, www., .comvb.
Jörg W Mittag

Bir PRNG ailesi tasarlayabilecek bir yolum varsa, ifade edemedikleri dizilerin önceden dışlayacağım diziler olacaksa, bu tartışmayı yenebilir miyim? (akla gürültü şekillendirme yayları).

3
H=ipilog1/pipiH

7

sk2kn2nns

(Başka bir cevabın işaret ettiği gibi, bu, seçtiğiniz herhangi bir sıkıştırma işlevi için geçerli olacaktır.)


Kendisini kanıtlamayan kendi başıma, sadece seçtiğim diziyi olası çıktılarından biri olarak üreten bir PRNG inşa edemiyorum, bunun için çok daha az bit gerekiyor. Diğer cevaplardan anladığım kadarıyla entropi, gereken bit sayısı üzerinde daha düşük bir sınırlama sağlamıştır. Yani, sadece seçilen dizilim için keyfi olarak iyi yapamam.

Bu diyor tüm favori PRNG makyaj, sonra olmasıdır Ben zaten fikir kırar o üretmeyen bir sekans ile size gelebilir. Daha güçlü bir ifade, çok daha kısa bir program tarafından yayılmayan dizilerin olduğu yönündedir. (Başka bir deyişle, dizimi gördükten sonra işlevinizi değiştirmenize izin versem bile hala kaybediyorsunuz. Yuval'ın "Kolmogorov karmaşıklığı" ndan bahsettiği şey bu.)
Louis

4

Diğer cevaplanmış noktaların yanı sıra, sadece bu linki eklemek istiyorum: https://www.schneier.com:443/blog/archives/2009/09/the_doghouse_cr.html

Şimdi, güneşimizin yıllık enerji çıkışı yaklaşık 1.21 × 10 ^ 41 erg'dir. Bu, ideal bilgisayarımızdaki yaklaşık 2.7 × 10 ^ 56 tek bitlik değişikliklere güç sağlamak için yeterlidir; 187 bitlik bir sayacı tüm değerleri boyunca koymak için yeterli durum değişikliği. Güneşin etrafına bir Dyson küresi kurduğumuzda ve tüm enerjisini 32 yıl boyunca hiçbir kayıp olmadan yakalarsak, bir bilgisayarı 2 ^ 192'e kadar sayabiliriz. Tabii ki, bu sayaçla faydalı hesaplamalar yapmak için enerjinin geri kalanı olmazdı.

Bu nedenle, yalnızca istediğiniz yinelemenin geçerli bir 187bit takımyıldızını bulması için yinelemek (karşılaştırmak yok ...), ideal şartlar altında güneşin bir yıl boyunca yaydığından daha fazla enerji alacaktır.


1

Evrensel bir kompresörün var olamayacağına dair çok hızlı bir kanıt. Bir tane yaptığınızı ve bir girişi sıkıştırdığınızı varsayalım. Şimdi, programınızın çıktısını yinelemeli olarak sıkıştırın. Her zaman boyutu küçültebilirseniz, her adımda, 1 bit'e kadar küçülecek ve küçülecektir.

Belki de, algoritmanızın çıktısının, daha fazla sıkıştırılamayacak bir yapıya sahip olduğunu iddia edebilirsiniz, ancak daha sonra, yeniden sıkıştırma işleminden önce sadece deterministik bir karışıklık uygulayabilirsiniz *.

Dipnot: Bazı deterministik karışıklıklar aslında bazı sıkıştırma programlarında yardımcı olur: http://pytables.github.io/usersguide/optimization.html?highlight=shuffling#shufflingoptim


Sıkıştırılmış her iletinin skendisiyle ilişkilendirilmiş bir tohumu olduğunu özlüyorum . 2348’li bir 01001011 mesajı 3924’lü bir mesajla aynı olacaktır. Foo1899’un algoritmasını herhangi bir şekilde yanlış anlamadığım sürece.
Azeirah

1

"Sıkıştırma" için bir PRNG kullanımı bir durumda temel olarak kullanışlıdır: "rastgele" bir demet veri kullanılması gerektiğinde ve hangi verilerin kullanıldığını kompakt bir şekilde kaydetme gerektiğinde. Çoğu sahte rastgele üretici, olası dizilerin sadece küçük bir kısmını oluşturabilir, ancak yalnızca küçük ila orta dereceli bir "rastgele" dizi gerekiyorsa, bir PRNG'nin üretebileceği olası dizilerin kesimi çoğu zaman yeterli olandan daha fazla olacaktır.

Bir kişinin saklamak istediği veri dizisi, doğru bir tohum verilen belirli bir PRNG'nin ürettiği ile eşleşecek şekilde tesadüfen gerçekleşirse, tohumun depolanması verilerin depolanmasına kompakt bir alternatif olabilir. Veri kaynağı bu tür eşleşmelerin gerçekleşmesi muhtemel olmadığı sürece, ancak, onları aramanın faydası olmayacak kadar nadir olacaktır.


PRNG'ler bu şekilde , örneğin deneylerin tekrarlanabilirliği uğruna, (sözde) rastgele verileri kompakt bir şekilde temsil etmek için kullanılır .
Yuval Filmus

1
@ YuvalFilmus: Kesinlikle. Ayrıca, üretilen seviyelerin küçük bir kesiminin kabul edilebilir sayılacağı, ancak bir video oyun tasarımcısının istediği bazılarını bulana kadar rastgele seviyeler üretebileceği ve tohumlarını kaydettirdiği video oyunu seviyesi oluşturma gibi bazı durumlarda kullanılabilir. Bunları üretti. Tarihsel olarak, 128 bayt RAM'lı bir video oyun makinesini kodlarken, programı 4096 bayt ROM'lu bir kartuşa sığdırmaya çalışırken çok faydalı bir kavram.
supercat

Bu çok iyi bir örnek, "iyi" bir tohum aramak için tarif ettiğim şemaya uyuyor, ancak bu senaryoda birçok olası mesajın iyi olması gerçeğinden faydalanıyor.

@ foo1899: Bu arada, oyun "Pitfall" en.wikipedia.org/wiki/Pitfall ! 128 byte RAM'e sahip bir makinede 4K oyun kartuşu üzerinde 256 ekranlı bir harita oluşturmak için yukarıda bahsedilen tekniği kullandı.
Supercat

1

Nedeniyle, sıkıştırmaya neden olamayan bazı dizgilerin olduğunu belirten cevapların kosfonisine eklemeyi düşünecek bir şey, tanım gereği, dekompresyonun enjekte edici doğası ve sıkıştırılmış dizelerin sınırlı bir evrenidir; çoğu dize sıkıştırılamaz çünkü daha düşük entropi ve yapılandırılmış olanlardan çok daha yüksek entropi, düzensiz dizgiler vardır, bu nedenle pratikte gördüğümüz koşullara yol açar: sıkıştırma çoğu zaman yararlıdır; en sık sık sıkılaştırma isteği, en çok bazı düzen ve yapı alikotuna sahip olanlardır ve bu dint tarafından, alt entropi nesnelerinin çok daha küçük evreninin bir parçasıdır. Bu, uygun bir çıkış uzunluğu seçerek, mümkün olduğu anlamına gelir daha küçük, yapısal evrendeki her şeyi sıkıştırabiliriz. Burada yapılandırılmış, entropi ve sipariş edilen terim, anlambilimin öznel tanımlarını ve sıkıştırmak isteyebileceğimiz mesajların kullanışlılığını yansıtmak için bilerek kesin değildir.

Ve soru sorucunun isteğine doğrudan cevap verirken: * evet, elbette sadece şanslı olabilirsiniz ve PRNG'nizin çıktısını bulmak istediğiniz tam mesajdır, bu sadece sizin sık sık bu durumda olmadığını görmenizdir. Bir PRNG'yi karakterize eden özellik, yani (neredeyse) bitmeyen bir dizi farklı dizge üretme kabiliyeti, eşzamanlı olarak kendinizinkileri üretme ihtimalinizi düşürür.

Tabii ki, bu olasılıksızlığı, kelimenin tam anlamıyla kelime geçişleri için bir "etki alanı grafiği" üzerinde gezinmek için bir PRNG kullanarak hafifletebilir ve mesajınızın görünme olasılığını büyük ölçüde artırabilir ve ayrıca artık etki alanı grafiğini sıkıştırılmış iletiye eklemeniz gerektiğini de görebilirsiniz. uzunluğu.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.