Esta ideia me ocorreu quando criança aprendendo a programar e encontrando PRNG pela primeira vez. Ainda não sei o quão realista é, mas agora há troca de pilhas.
Aqui está o esquema de uma criança de 14 anos para um incrível algoritmo de compactação:
Pegue um PRNG e faça o seed com seed s
para obter uma longa sequência de bytes pseudo-aleatórios. Para transmitir essa sequência para outra parte, você só precisa comunicar uma descrição do PRNG, a semente apropriada e o tamanho da mensagem. Por uma sequência suficientemente longa, essa descrição seria muito mais curta que a própria sequência.
Agora, suponha que eu possa inverter o processo. Com tempo e recursos computacionais suficientes, eu poderia fazer uma busca por força bruta e encontrar uma semente (e PRNG, ou seja, um programa) que produz a sequência desejada (digamos, uma foto divertida de gatos sendo travessos).
Os PRNGs se repetem após a geração de um número suficientemente grande de bits, mas, comparada aos ciclos "típicos", minha mensagem é bastante curta e, portanto, isso não parece ser um problema.
Voila, uma maneira eficaz (se bem que rube-Goldbergiana) de compactar dados.
Então, assumindo:
- A sequência que desejo compactar é finita e conhecida antecipadamente.
- Não tenho pouco dinheiro ou tempo (desde que seja necessária uma quantidade finita de ambos)
Eu gostaria de saber:
- Existe uma falha fundamental no raciocínio por trás do esquema?
- Qual é a maneira padrão de analisar esse tipo de experimento mental?
Sumário
Frequentemente, boas respostas deixam claro não apenas a resposta, mas o que realmente estava perguntando. Obrigado pela paciência de todos e respostas detalhadas.
Aqui está a minha enésima tentativa de resumo das respostas:
- O ângulo PRNG / semente não contribui com nada, não passa de um programa que produz a sequência desejada como saída.
- O princípio do pigeonhole: existem muito mais mensagens de comprimento> k do que programas (geradores de mensagens) de comprimento <= k. Portanto, algumas seqüências simplesmente não podem ser a saída de um programa menor que a mensagem.
- Vale ressaltar que o intérprete do programa (mensagem) é necessariamente corrigido previamente. E seu design determina o subconjunto (pequeno) de mensagens que podem ser geradas quando uma mensagem de comprimento k é recebida.
Nesse ponto, a idéia original do PRNG já está morta, mas há pelo menos uma última pergunta a ser resolvida:
- P: Posso ter sorte e descobrir que minha mensagem longa (mas finita) é apenas a saída de um programa de comprimento <k bits?
Estritamente falando, não é uma questão de sorte, pois o significado de toda mensagem possível (programa) deve ser conhecido com antecedência. Ou é o significado de alguma mensagem de <k bits ou não é .
Se eu escolher uma mensagem aleatória de> = k bits aleatoriamente (por que eu faria isso?), Em qualquer caso, eu teria uma probabilidade de desaparecer de poder enviá-la usando menos de k bits e uma quase certeza de não ser capaz de enviar usando menos de k bits.
OTOH, se eu escolher uma mensagem específica de> = k bits dentre aquelas que são a saída de um programa com menos de k bits (supondo que exista essa mensagem), então, de fato, estou aproveitando os bits já transmitidos ao receptor (o design do intérprete), que conta como parte da mensagem transferida.
Finalmente:
- P: O que é todo esse negócio de complexidade de entropia / kolmogorov ?
Por fim, ambos nos dizem a mesma coisa que o princípio (mais simples) do buraco de pombo nos diz sobre o quanto podemos comprimir: talvez nem um pouco, talvez alguns, mas certamente não tanto quanto imaginamos (a menos que trapacemos).