5

出于纯粹的兴趣,我很好奇如何按顺序创建 PI,以便在生成过程本身时显示数字,而不是在过程结果之后生成数字。如果是这种情况,那么数字可以自己产生,我可以对以前看到的数字实施垃圾收集,从而创建一个无限系列。结果只是在 Pi 系列之后每秒生成一个数字。

这是我通过互联网筛选的结果:

这是流行的计算机友好算法,类似机器的算法:

def arccot(x, unity)
   xpow = unity / x
   n = 1
   sign = 1
   sum = 0
   loop do
       term = xpow / n
       break if term == 0
       sum += sign * (xpow/n)
       xpow /= x*x
       n += 2
       sign = -sign
   end
   sum
end

def calc_pi(digits = 10000)
   fudge = 10
   unity = 10**(digits+fudge)
   pi = 4*(4*arccot(5, unity) - arccot(239, unity))
   pi / (10**fudge)
end

digits = (ARGV[0] || 10000).to_i
p calc_pi(digits)
4

2 回答 2

4

也许您可以使用十六进制?David Bailey、Peter Borwein 和 Simon Plouffe 在 pi 的十六进制扩展中发现了小数点后第 n 位的公式。

公式为:

pi 的十六进制扩展
(来源:sciencenews.org

你可以在这里阅读更多信息:http ://www.andrews.edu/~calkins/physics/Miracle.pdf

以 10 为底的公式是否存在的问题仍然悬而未决。

更多信息:http ://www.sciencenews.org/sn_arc98/2_28_98/mathland.htm

于 2010-06-29T05:10:16.387 回答
4

扩展“白痴”的答案:Bailey-Borwein-Plouffe 公式为您所做的是,它可以让您计算 pi 的二进制(或等效的十六进制)数字,而无需计算它之前的所有数字。十年前,这个公式被用来计算圆周率的万亿分之一。是 0。(我敢肯定你已经迫不及待想知道了。)

这与计算 pi 的位或数字的低内存、动态算法不同,我认为你可以用“顺序”来表示。我认为没有人知道如何在 base 10 或 base 2 中做到这一点,尽管 BPP 算法可以被视为部分解决方案。

好吧,pi 的一些迭代公式也有点像顺序算法,在某种意义上说,每轮都有一个迭代产生更多的数字。但是,这也只是部分解决方案,因为通常每一步数字的数量都会增加一倍或三倍。所以你会用很多数字等待一段时间,然后很快就会有更多的数字出现。

事实上,我不知道是否有任何低内存、高效的算法来产生任何标准无理数的数字。即使对于 e,您也会认为标准的无限级数是一个有效的公式并且它的内存不足。但它只是一开始看起来内存不足,实际上还有更快的算法来计算 e 的多位数。

于 2010-06-29T06:10:57.833 回答