7
PRNG可以用来魔术压缩东西吗?
这个想法是我小时候学习编程的想法,并且是第一次接触PRNG。我仍然不知道它有多现实,但是现在有了堆栈交换。 这是14岁的人使用的一种出色的压缩算法方案: 取一个PRNG并用种子s进行种子处理,以获得长序列的伪随机字节。要将序列发送给另一方,您只需要传达PRNG的说明,适当的种子和消息的长度。对于足够长的序列,该描述将比序列本身短得多。 现在,假设我可以反转该过程。如果有足够的时间和计算资源,我可以进行蛮力搜索,找到可以产生所需序列的种子(和PRNG,或者换句话说:一个程序)(比方说,一张有趣的猫调皮的照片)。 在生成足够多的比特之后,PRNG会重复,但是与“典型”周期相比,我的消息非常短,因此这似乎不是一个很大的问题。 Voila,一种有效的压缩数据方式(如果是rube-Goldbergian)。 因此,假设: 我希望压缩的序列是有限的,并且事先知道。 我的现金或时间并不短缺(只要两者都需要有限的金额) 我想知道: 该计划背后的推理是否存在根本缺陷? 分析这类思想实验的标准方法是什么? 摘要 通常,好的答案不仅可以弄清楚答案,而且可以弄清楚我真正要问的是什么。感谢大家的耐心配合和详细的答案。 这是我对答案的第n次尝试: PRNG /种子角度没有任何作用,只不过是生成所需序列作为输出的程序。 信鸽原理:长度大于k的消息比长度小于等于k的(消息生成)程序多。因此,某些序列根本不能成为比消息短的程序输出。 值得一提的是,程序(消息)的解释程序必须事先确定。它的设计确定了接收到长度为k的消息时可以生成的(小)消息子集。 至此,原始的PRNG想法已经死了,但是至少还有一个最后的问题需要解决: 问:我能幸运地发现我的长(但有限)消息恰好是长度小于k位的程序的输出吗? 严格来说,这不是偶然的问题,因为必须事先知道所有可能的消息(程序)的含义。要么是 <k位的一些信息的含义或它不是。 如果我随机选择一个随机消息,该消息>> k位(为什么?),无论如何我都将拥有使用少于k位发送消息的可能性,并且几乎可以肯定无法发送它完全使用不到k位。 OTOH,如果我从少于k位的程序输出中选择大于等于k位的特定消息(假设有这样的消息),那么实际上我是在利用已经传输到接收方(解释程序的设计),它被视为已传输消息的一部分。 最后: 问:熵 / kolmogorov复杂度业务到底是什么? 最终,两者都告诉我们与(简单的)信鸽原理告诉我们的一样,我们可以压缩的程度:也许一点也没有,也许有些,但是肯定不如我们想象的那么多(除非我们作弊)。