可以在合理的时间内在pi中找到任何有限位串吗?

时间:2012-07-06 18:36:55

标签: algorithm complexity-theory communication pi

所以,不久前我读了一个像这样的笑话:

  

"永远不要用二进制计算pi - 因为它无限地进行并且是随机的,它理论上包含每个有限位串。因此,您将拥有所有受版权保护的材料,并承担一些严重的罚款。"

这显然是幽默的,但它让我思考。如果每个有限位字符串都存在于pi的二进制表示中,是否可以将其用作传输数据的方法?

例如,我想说我想传输一个可以解释为jpeg图像的位字符串。我不是直接发送信息,而是在pi的数字内找到它的位置,只需发送pi数字中第一位的位置,以及字符串的长度。

这对我来说似乎很简单,但这里显而易见的问题是,即使是前几万亿个数字内找到这个字符串的概率非常小。因此,最终可能需要花费大量时间才能找到。

我的想法是,几台机器可以专门用于在pi中搜索大文件,然后创建所有起始位置的索引。因此,每次计算只需要发生一次,然后从那时起可以非常快速地传输该信息。

那么,您怎么看?这是否可行,或者这些计算需要花费太多时间?

感谢阅读!如果我忽略了任何发布指南,我会道歉,如果我在这个论坛中提出第一个问题。

编辑:

感谢您的快速回复,伙计们!我认为我的推理有错误,很高兴知道为什么!

5 个答案:

答案 0 :(得分:48)

扩展我的评论。这里有一个非常重要的概念叫做 information entropy

在完全披露之后,我是目前世界纪录保持的Pi数字为10万亿位数(10 ^ 13)。

我有大约10,000份每个人的social security number

然而,这并不意味着我可以侵入每个人的账户并窃取他们的身份。因为我不知道 哪里 每个人的SSN开始。对于典型的9位SSN,Pi中将出现SSN的第一个数字将是9位数的长度。换句话说,有关SSN的信息保存在地址中,而不是保存在Pi本身中。


例如,如果有人拥有SSN: 938-93-3556

从Pi的偏移 597,507,393 开始。该数字597,507,393大约与SSN本身一样长。换句话说,我们通过使用Pi获得了什么。
(我不确定它出现的是否有较早的偏移量,但是随着偏移量的减小,概率会呈指数级下降。)


为了概括这一点,即使你有无限数量的Pi(理论上它包含所有可能的信息),保存数据XXX的地址(极有可能)将与XXX本身一样大。

换句话说,信息不是保存在Pi本身的数字中,而是保存在信息开始的地址。

答案 1 :(得分:23)

因为我们对Lounge感到无聊,所以我继续进行搜索,以找出特定长度的“消息”的平均偏移量。

我下载了1 million digits of Pi并查找了固定长度的所有子序列(例如00..99)。根据消息长度,您将获得以下输出:

 Digits    Avg.Offset    Unfound

 1            8.1        0
 2          107.07       0
 3          989.874      0
 4         9940.46       0
 5        99959.4        8 <-- note

请注意,在搜索的数字位数的10%处,我们已经开始点击不合格的模式。

另请注意,正如信息熵定律所预测的那样,平均偏移量大致与消息长度成正比。


原始输出和时间:

运行

for a in 10 100 1000 10000 100000; do \make -B CFLAGS=-DNUMRANGE=$a && time ./test; done

显示

g++ -DNUMRANGE=10 -std=c++0x -g -O3 -fopenmp -march=native test.cpp -o test && ./test
0 unfound
81 cumulative, 8.1 average

real    0m0.008s
user    0m0.008s
sys 0m0.004s
g++ -DNUMRANGE=100 -std=c++0x -g -O3 -fopenmp -march=native test.cpp -o test && ./test
0 unfound
10707 cumulative, 107.07 average

real    0m0.004s

g++ -DNUMRANGE=1000 -std=c++0x -g -O3 -fopenmp -march=native test.cpp -o test && ./test
0 unfound
989874 cumulative, 989.874 average

real    0m0.010s

g++ -DNUMRANGE=10000 -std=c++0x -g -O3 -fopenmp -march=native test.cpp -o test && ./test
0 unfound
9.94046e+07 cumulative, 9940.46 average

real    0m0.081s

g++ -DNUMRANGE=100000 -std=c++0x -g -O3 -fopenmp -march=native test.cpp -o test && ./test
8 unfound
9.99594e+09 cumulative, 99959.4 average

real    0m7.387s

完整代码,makefile和pi数字: https://gist.github.com/3062541

答案 2 :(得分:5)

不,有效地在随机序列中找到任意序列是不可能的 - 从“随机”的定义开始。 (如果有办法预测序列发生的位置,则不会是随机的。)

至于索引所有地点,那么,你获得了什么?你实际上是说“跳转到起点0 ......”然后你必须说“......然后用π计算下一个JPEG大小的位......”(没有胜利,因为你必须使用准备计算的能量)或“......然后在mega-π指数中查找下一个JPEG大小的数据块。” (在这种情况下,你可以,你知道,加载JPEG文件。)

你不能赢,你不能收支平衡(而且,为了它的价值,你无法摆脱游戏)。

更新:@Mysticial的回答比我好。他的观点

  

例如,如果有人拥有SSN:938-93-3556

     

起始于Pi的597,507,393。这个数字597,507,393与SSN本身一样长。换句话说,我们通过使用Pi获得了什么。

优雅地捕捉到根本问题。

答案 3 :(得分:5)

这种说法是错误的。 Pi是无限的,它的下一个数字是不可预测的,但这并不意味着每个可能的字符串都在那里。

例如,假设我创建了一个类似于pi的函数,但是只要有20个二进制零的序列,计算接下来的20位,并用它替换零。

该序列也是无限的,不可预测的 - 但我们可以肯定地知道它从不包含20个二进制零的序列。

无法证明PI包含所有可能的位序列。

这也可能有助于回答: http://www.youtube.com/watch?v=8PUJvAlD64k

答案 4 :(得分:1)

  

因为它无限地继续并且是随机的,它理论上包含每个有限位串

Pi继续无限,但绝对不是随机的 - 即。其数字可以由O(log n)大小的程序计算(因此,有限前缀可以由比前缀小得多的程序生成),这意味着Pi的前缀的Kolmogorov复杂度渐近地小于它们的大小。因此,尚未证明它包含每一个有限的字符串(我不知道)。