所以,不久前我读了一个像这样的笑话:
"永远不要用二进制计算pi - 因为它无限地进行并且是随机的,它理论上包含每个有限位串。因此,您将拥有所有受版权保护的材料,并承担一些严重的罚款。"
这显然是幽默的,但它让我思考。如果每个有限位字符串都存在于pi的二进制表示中,是否可以将其用作传输数据的方法?
例如,我想说我想传输一个可以解释为jpeg图像的位字符串。我不是直接发送信息,而是在pi的数字内找到它的位置,只需发送pi数字中第一位的位置,以及字符串的长度。
这对我来说似乎很简单,但这里显而易见的问题是,即使是前几万亿个数字内找到这个字符串的概率非常小。因此,最终可能需要花费大量时间才能找到。
我的想法是,几台机器可以专门用于在pi中搜索大文件,然后创建所有起始位置的索引。因此,每次计算只需要发生一次,然后从那时起可以非常快速地传输该信息。
那么,您怎么看?这是否可行,或者这些计算需要花费太多时间?
感谢阅读!如果我忽略了任何发布指南,我会道歉,如果我在这个论坛中提出第一个问题。
编辑:
感谢您的快速回复,伙计们!我认为我的推理有错误,很高兴知道为什么!
答案 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复杂度渐近地小于它们的大小。因此,尚未证明它包含每一个有限的字符串(我不知道)。