PRNG可以用来魔术压缩东西吗?


38

这个想法是我小时候学习编程的想法,并且是第一次接触PRNG。我仍然不知道它有多现实,但是现在有了堆栈交换。

这是14岁的人使用的一种出色的压缩算法方案:

取一个PRNG并用种子s进行种子处理,以获得长序列的伪随机字节。要将序列发送给另一方,您只需要传达PRNG的说明,适当的种子和消息的长度。对于足够长的序列,该描述将比序列本身短得多。

现在,假设我可以反转该过程。如果有足够的时间和计算资源,我可以进行蛮力搜索,找到可以产生所需序列的种子(和PRNG,或者换句话说:一个程序)(比方说,一张有趣的猫调皮的照片)。

在生成足够多的比特之后,PRNG会重复,但是与“典型”周期相比,我的消息非常短,因此这似乎不是一个很大的问题。

Voila,一种有效的压缩数据方式(如果是rube-Goldbergian)。

因此,假设:

  • 我希望压缩的序列是有限的,并且事先知道。
  • 我的现金或时间并不短缺(只要两者都需要有限的金额)

我想知道:

  • 该计划背后的推理是否存在根本缺陷?
  • 分析这类思想实验的标准方法是什么?

摘要

通常,好的答案不仅可以弄清楚答案,而且可以弄清楚我真正要问的是什么。感谢大家的耐心配合和详细的答案。

这是我对答案的第n次尝试:

  • PRNG /种子角度没有任何作用,只不过是生成所需序列作为输出的程序。
  • 信鸽原理:长度大于k的消息比长度小于等于k的(消息生成)程序多。因此,某些序列根本不能成为比消息短的程序输出。
  • 值得一提的是,程序(消息)的解释程序必须事先确定。它的设计确定了接收到长度为k的消息时可以生成的(小)消息子集。

至此,原始的PRNG想法已经死了,但是至少还有一个最后的问题需要解决:

  • 问:我能幸运地发现我的长(但有限)消息恰好是长度小于k位的程序的输出吗?

严格来说,这不是偶然的问题,因为必须事先知道所有可能的消息(程序)的含义。要么 <k位的一些信息的含义或它不是

如果我随机选择一个随机消息,该消息>> k位(为什么?),无论如何我都将拥有使用少于k位发送消息的可能性,并且几乎可以肯定无法发送它完全使用不到k位。

OTOH,如果我从少于k位的程序输出中选择大于等于k位的特定消息(假设有这样的消息),那么实际上我是在利用已经传输到接收方(解释程序的设计),它被视为已传输消息的一部分。

最后:

最终,两者都告诉我们与(简单的)信鸽原理告诉我们的一样,我们可以压缩的程度:也许一点也没有,也许有些,但是肯定不如我们想象的那么多(除非我们作弊)。


6
稍微调整您的问题,您仍然无法压缩每个字符串(如下面的答案中所述),但是您会收到算法信息论(en.wikipedia.org/wiki/Kolmogorov_complexity)。将“ PRNG”替换为“通用图灵机”,将“种子”替换为“包含要生成所需输出的程序的输入磁带”。大多数输入磁带比它们生成的输出长,但是对于每个输出,至少存在一个生成该输出的输入。
Wandering Logic

否,但是压缩后的大小是来源^ _ ^的熵
Navin 2014年

5
如果您确实实现了这一点,那么您会发现一件有趣的事情:为了重构任意输入,您将需要一个seed + rng,平均而言,它的大小与原始数据一样大。哎呀。
2014年

理解为什么这种方法行不通的另一种方式:即使PRNG可以生成任意长的输出,也无法生成任意输出。(PRNG的输出始终是某个固定的周期或模式,受其状态的大小限制。)
Pi Delport 2014年

@PietDelport,对于任何n,都有一个PRNG,其周期要大得多,并且提出的问题已经预先知道n。因此,我不认为PRNG本身是循环的这一事实直接解决了这个问题。

Answers:


43

您有一个很棒的新压缩方案,是吗?好吧那...

all让我们一起玩,熵游戏♫

nn

01000111001knn2n012nkk2n2nlog2n=n

糟糕!只要您要压缩的内容,您的压缩方案就需要消息!

01

1010n

nlogn0logn

logn1

2n2nn

2n

a=0000000011010b=111111110101000a0b1n=1

“哈哈!”,你说,“但是我可以简单地确定那些愚蠢的消息是稀有的!我将稀有的消息设为大,将普通的消息设为小!然后我平均获胜!”

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

声称击败熵的任何事物都可能没有提供足够的信息来明确检索压缩消息,或者只是错误。熵是一个强大的概念,我们可以使用它来下限(有时甚至上限)运行某些算法,因为如果它们运行得非常快(或非常慢),那么它们一定在做一些违反熵的事情。


13
男孩,当你假装自己时我听起来很傻。谢谢上帝,我为发现熵感到自豪。撇开玩笑,这是一个很好的答案-如果只是这种语调不那么带有嘲讽色彩。

6
我并不想嘲笑,只是想着“ 14岁的惊人压缩算法方案”。:)
亚历克西斯·贝辛斯纳

3
听起来也不是在嘲笑我:)这是解释流行科学(以及其他一些领域)问题的一种很常见的方案,尽管确实“提问者”通常是爱丽丝或鲍勃,而不是“真实的”人:D看看您能多么容易地突然理解问题的真正复杂性!(更不用说,当我在脑海中思考一个复杂的问题时,我使用相同的过程-内部对话非常擅长于模拟“更多的人知道更多”)
Luaan 2014年

2
@SteveJessop,这是错误的二分法,让我们不要去那里。这是一个很好的答案,我也许过于敏感了。

3
@chipmonkey,我认为亚历克西斯关于“熵博弈”的答案仍然涵盖了这一点。可能需要这样做的算法数量会很大,以至于指定使用哪个算法所需的位数会抵消其好处。

21

2N1N2NN

在现实生活中,我们经常对正在压缩的序列有所了解,比如说是声音还是图片。在无损压缩的情况下,Shannon的源编码定理表明,最佳压缩率等于源的熵。对于有损编码,信息理论(速率失真理论)中还有其他定理。因此,即使在这种情况下,您也可以压缩多少数据。


我从来没有这样看过,但这只是我的意思:基本上,香农说,即使是最好的情况也不能任意压缩,而鸽子洞原则保证了必须有最坏的情况不能压缩完全没有 这是明智的表征吗?
约尔格W¯¯米塔格

1
最好的情况总是可以被压缩,因为您可以包括一些字符串作为压缩算法的特殊情况。此参数不仅适用于最坏情况,而且适用于平均情况,表明平均压缩最多为2位。
Yuval Filmus 2014年

嗯当然了 if input.empty? then output_very_long_string最好的情况是给出无限的压缩比。实际上,甚至有一个压缩算法使用它。(名字我忘了,很可惜。)它适用于很短的字符串,它有硬编码子之类的特殊编码http://www..com等等。
约尔格W¯¯米塔格

如果我有办法设计PRNG家族,使它们无法表达的序列成为我事先排除的序列,我可以否决这个论点?(浮现在脑海)。

3
H=ipilog1/pipiH

7

sk2kn2nns

(如另一个答案所述,对于您选择的任何压缩功能,都会发生这种情况。)


就其本身而言,这不能证明我不能构造一个PRNG,而恰好会生成我选择的序列作为其可能的输出之一,而这样做所需的位数要少得多。正如我从其他答案中所了解的,熵可证明地对所需位数进行了下限限制。就是说,对于我选择的顺序,我根本做不成好事。

所有这些说明是,如果您组成自己喜欢的PRNG,那么可以用它不会产生的序列来找您,这已经破坏了您的想法。更有说服力的是,有些序列根本不被任何短得多的程序发出。(换句话说,即使让我在看完我的序列后更改功能,您仍然会迷失方向。这就是Yuval所说的“ Kolmogorov复杂性”。)
2014年

4

除了其他已经意识到的要点之外,我只想添加此链接:https ://www.schneier.com:443/blog/archives/2009/09/the_doghouse_cr.html

现在,我们太阳的年能量输出约为1.21×10 ^ 41 ergs。这足以为我们理想的计算机提供约2.7×10 ^ 56的单个位更改;进行足够的状态更改,以通过其所有值放入一个187位计数器。如果我们在太阳周围建立一个戴森球,并捕获其全部能量32年而没有任何损失,那么我们可以为一台计算机供电,使其计数高达2 ^ 192。当然,使用此计数器进行任何有用的计算都不会剩下能量。

因此,只有迭代(不进行比较...)才能找到所需数据的有效187位星座图,这是在(无法达到的)理想条件下(比一年中太阳发射的能量更多)获得的。


1

一个非常迅速的证明,通用压缩机不存在。假设您确实制作了一个,然后压缩了一个输入。现在,迭代压缩程序的输出。如果您始终可以减小大小,则每一步都会越来越小,直到减小到1位为止。

您可能会争辩说,也许算法的输出具有无法进一步压缩的结构,但是您可以在重新压缩之前应用确定性的shuffle *。

脚注:确定性改组实际上有助于某些压缩方案:http : //pytables.github.io/usersguide/optimization.html? highlight=shuffling#shufflingoptim


我认为您会丢失每个压缩消息都有一个s与之关联的种子。带有“ s”为2348的消息01001011与带有“ s”为3924的相同消息将有所不同。除非我自己以任何方式误解了foo1899的算法。
Azeirah 2014年

1

在一种情况下,使用PRNG进行“压缩”基本上很有用:当有必要使用“随机”数据束并紧凑地记录所使用的数据时。大多数伪随机生成器只能生成一小部分可能的序列,但是如果只需要少量到中等数量的“随机”序列,PRNG可以生成的可能序列的比例通常会绰绰有余。

如果希望存储的数据序列碰巧发生以匹配给定正确种子的某个PRNG将生成的数据,则存储种子可能是存储数据的一种紧凑选择。但是,除非有可能发生此类匹配的数据源,否则它们将很少出现,以至于不值得进行搜索。


PRNG以此方式紧凑地表示(伪)随机数据,例如,出于实验可重复性的考虑。
Yuval Filmus 2014年

1
@YuvalFilmus:是的。它们还可以用于某些情况下,例如视频游戏级别生成,在这种情况下,一小部分生成的级别被认为是可以接受的,但是视频游戏设计人员可以随机生成级别,直到他发现自己喜欢的级别并记录种子。产生那些。从历史上来看,这是一个非常有用的概念,当为具有128字节RAM的视频游戏机编码时,尝试将程序装入具有4096字节ROM的盒式磁带中。
超级猫2014年

这是一个很好的例子,它与我描述的搜索“好的”种子的方案相匹配,但是利用了在这种情况下许多可能的消息都是好的的事实。

@ foo1899:顺便说一句,游戏“陷阱” en.wikipedia.org/wiki/陷阱!使用上述技术在具有128字节RAM的计算机上的4K游戏卡带上生成256屏幕地图。
2014年

1

需要考虑的问题是,为什么要定义一些字符串,因为从定义上讲,解压缩的内射性质以及从中选择用来表示消息的压缩字符串的范围有限,使得某些字符串不能被压缩是:大多数字符串无法压缩,因为高熵,无序字符串要比低熵和结构化字符串多得多,因此在实践中产生了这样的条件:压缩在大多数情况下都是有用的,因为消息最经常希望压缩的是那些最常拥有一些等分的顺序和结构的文件,并且通过这种方式,它们是非常小的较低熵对象宇宙的一部分。这意味着通过选择合适的输出长度,我们可以压缩较小的结构化世界中的所有内容。术语“结构化”,“熵”和“有序”在此刻意不精确,以反映我们可能希望压缩的消息的语义和有用性的主观定义。

直接回答提问者的请求:*是的,您当然可以幸运地发现PRN​​G的输出是您希望压缩的确切消息,只是您经常找不到这种情况,因为PRNG的特征就是它具有生产(几乎)无休止的各种弦的能力,因此很难生产出您的PRNG。

当然,您可以通过使用PRNG遍历单词间过渡的“域图”来减轻这种可能性,并且大大增加了消息出现的可能性,并且还发现您现在必须将域图添加到压缩的消息中长度。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.