Questa idea mi è venuta in mente da bambino che impara a programmare e al primo incontro con PRNG. Non so ancora quanto sia realistico, ma ora c'è lo scambio di stack.
Ecco uno schema di 14 anni per un incredibile algoritmo di compressione:
Prendi un PRNG e seminalo con seed s
per ottenere una lunga sequenza di byte pseudo-casuali. Per trasmettere quella sequenza a un'altra parte, devi solo comunicare una descrizione del PRNG, il seme appropriato e la lunghezza del messaggio. Per una sequenza abbastanza lunga, tale descrizione sarebbe molto più breve della sequenza stessa.
Supponiamo ora di poter invertire il processo. Dato abbastanza tempo e risorse computazionali, potrei fare una ricerca della forza bruta e trovare un seme (e PRNG, o in altre parole: un programma) che produca la sequenza desiderata (diciamo una foto divertente di gatti maliziosi).
I PRNG si ripetono dopo che è stato generato un numero sufficiente di bit, ma rispetto ai cicli "tipici" il mio messaggio è piuttosto breve, quindi questo dosaggio non sembra un gran problema.
Voila, un modo efficace (se rube-goldbergiano) per comprimere i dati.
Quindi, supponendo:
- La sequenza che desidero comprimere è limitata e nota in anticipo.
- Non sono a corto di contanti o di tempo (solo se è richiesto un importo limitato di entrambi)
Mi piacerebbe sapere
- C'è un difetto fondamentale nel ragionamento alla base del regime?
- Qual è il modo standard per analizzare questo tipo di esperimenti mentali?
Sommario
Spesso le buone risposte chiariscono non solo la risposta, ma quello che stavo chiedendo davvero. Grazie per la pazienza di tutti e risposte dettagliate.
Ecco il mio ennesimo tentativo di riepilogo delle risposte:
- L'angolo PRNG / seed non contribuisce a nulla, non è altro che un programma che produce la sequenza desiderata come output.
- Il principio del buco del piccione: ci sono molti più messaggi di lunghezza> k di quanti siano i programmi (generazione di messaggi) di lunghezza <= k. Quindi alcune sequenze semplicemente non possono essere l'output di un programma più breve del messaggio.
- Vale la pena ricordare che l'interprete del programma (messaggio) è necessariamente fissato in anticipo. E il suo design determina il (piccolo) sottoinsieme di messaggi che può essere generato quando viene ricevuto un messaggio di lunghezza k.
A questo punto l'idea del PRNG originale è già morta, ma c'è almeno un'ultima domanda da risolvere:
- D: Potrei essere fortunato e scoprire che il mio messaggio lungo (ma finito) è solo l'output di un programma di lunghezza <k bit?
A rigor di termini, non è una questione di probabilità poiché il significato di ogni possibile messaggio (programma) deve essere conosciuto in anticipo. O è il significato di qualche messaggio di <k bit o non lo è .
Se scelgo un messaggio casuale di> = k bit in modo casuale (perché dovrei?), Avrei comunque una probabilità evanescente di poterlo inviare usando meno di k bit, e quasi la certezza di non essere in grado di inviare usando assolutamente meno di k bit.
OTOH, se scelgo un messaggio specifico di> = k bit da quelli che sono l'output di un programma inferiore a k bit (supponendo che ci sia un tale messaggio), allora in effetti sto sfruttando i bit già trasmessi al destinatario (il design dell'interprete), che conta come parte del messaggio trasferito.
Finalmente:
- D: Cos'è tutto questo business di complessità entropia / kolmogorov ?
Alla fine, entrambi ci dicono la stessa cosa del principio (più semplice) del buco del piccione ci dice su quanto possiamo comprimere: forse per niente, forse alcuni, ma certamente non tanto quanto immaginiamo (a meno che non imbrogliamo).