关于算法:如何确定我的圆周率计算是否准确?

How do I determine whether my calculation of pi is accurate?

我尝试了各种方法来实现一个按顺序给出圆周率数字的程序。我尝试了泰勒级数方法,但它的收敛速度非常慢(一段时间后我将结果与在线值进行比较)。总之,我正在尝试更好的算法。

所以,在编写程序的时候,我遇到了一个问题,就像所有的算法一样:我怎么知道我计算的n数字是准确的?


因为我是圆周率最高位数的世界纪录保持者,我会加上我的两分钱:

除非你真的要创造一个新的世界纪录,否则通常的做法只是根据已知的值来验证计算出来的数字。所以这就足够简单了。

事实上,我有一个网页列出了数字片段,目的是根据它们来验证计算:http://www.numberworld.org/digits/pi/

但当你进入世界纪录领域时,没有什么可比的。

历史上,验证计算数字是否正确的标准方法是使用第二个算法重新计算数字。所以如果两个计算结果都不好,那么末尾的数字就不匹配了。

这通常是所需时间的两倍以上(因为第二个算法通常较慢)。但这是唯一一种验证计算数字的方法,一旦你进入了从未有过的计算数字和新的世界记录的未知领域。

在超级计算机设置记录的时代,通常使用两种不同的AGM算法:

  • 高斯-勒让德算法
  • 博文算法

这两种算法都是很容易实现的O(N log(N)^2)算法。

然而,现在情况有所不同。在过去的三个世界记录中,我们使用最快的已知公式(chudnovsky公式)只执行了一次计算,而不是执行两次计算:

Enter image description here

这一算法很难实现,但比AGM算法快得多。

然后,我们使用BBP公式对二进制数字进行了验证。

Enter image description here

此公式允许您计算任意二进制数字,而不需要计算前面的所有数字。所以它被用来验证最后几个计算出来的二进制数字。因此,它比完整的计算要快得多。

这样做的好处是:

  • 只需要一个昂贵的计算。
  • 缺点是:

  • 需要实现贝利-博文-普劳夫(BBP)公式。
  • 需要另外一个步骤来验证从二进制到十进制的基数转换。
  • 我已经详细介绍了为什么验证最后几个数字意味着所有数字都是正确的。但很容易看到这一点,因为任何计算错误都会传播到最后一位。

    现在,最后一步(验证转换)实际上相当重要。以前的一位世界纪录保持者实际上是这样打电话给我们的,因为起初,我没有充分描述它是如何运作的。

    所以我从我的博客中提取了这个片段:

    1
    2
    N = # of decimal digits desired
    p = 64-bit prime number

    Enter image description here

    以10为基数计算a,以二进制计算b。

    Enter image description here

    如果是A = B,那么在"非常高的概率"下,转换是正确的。

    欲了解更多信息,请参阅我的博客文章pi-5万亿数字。


    毫无疑问,为了您的目的(我认为这只是一个编程练习),最好的方法是对照Web上的任何PI数字列表检查您的结果。

    我们怎么知道这些值是正确的呢?我可以说,有很多计算机科学的方法可以证明算法的实现是正确的。

    更切合实际的是,如果不同的人使用不同的算法,并且他们都同意(选择一个数字)1000(百万,无论什么)个小数位,这应该会给你一种温暖的模糊的感觉,他们得到了正确的。

    历史上,威廉·山克斯在1873年出版了小数点后707位。可怜的家伙,他犯了一个错误,从小数点后528位开始。

    非常有趣的是,1995年,一种算法被发布,它具有直接计算π的第n位(以16为基数)而不必计算所有之前的数字的特性!

    最后,我希望您的初始算法不是pi/4 = 1 - 1/3 + 1/5 - 1/7 + ...,这可能是最简单的编程方法,但也是最慢的编程方法之一。查看维基百科上的pi文章,了解更快的方法。


    您可以使用多个方法,看看它们是否收敛到同一个答案。或者从"网"中抓一些。Chudnovsky算法通常是一种非常快速的计算圆周率的方法。http://www.craig-wood.com/nick/articles/pi-chudnovsky/


    泰勒级数是求圆周率的一种方法。如前所述,它收敛缓慢。

    泰勒级数的部分和可以证明在下一项的某个乘数内,远离π的真值。

    其他近似PI的方法也有类似的方法来计算最大误差。

    我们知道这是因为我们可以用数学证明它。


    您可以尝试使用(相当)为sin和cos快速聚合的幂级数来计算sin(pi/2)cos(pi/2)。(更好的是:使用各种加倍公式计算更接近的x=0,以便更快地收敛。)

    顺便说一句,在计算上说,cos(x)是一个黑匣子(例如,你可以使用上面提到的泰勒级数),比在tan(x)上使用series更好的方法是通过牛顿进行根查找。当然有更好的算法,但是如果你不想验证大量的数字,这就足够了(而且实现起来并不那么困难,你只需要一点微积分就可以理解它的工作原理)。