圆周率的数值计算
圆周率的定义
-
最初等的定义即为周长与直径的比
-
可以利用三角函数定义:
是正弦函数的最小正零点。 注意到三角函数的定义并不一定需要依赖于几何,它们可以独立依赖于微分方程的解来定义,从而避免循环定义。 -
可以利用积分公式来定义
-
还可以通过偏微分方程的特征值来定义,很多模型问题的特征值都是
的形式,这和第二种定义本质上是一样的。 -
还有很多基于连分数的定义/展开式,这里略去。
圆周率的计算历史
-
古代:自然产生的割圆法
-
近代:
-
16世纪开始的无穷级数法(包括梅钦类公式),基于一些含
的无穷级数公式 -
统计模拟算法,即蒙特卡洛模拟,只是一类理论上可以计算的方法,实践中并不适合用来计算
-
-
现代(计算机时代):
-
迭代算法,早期提出了迭代法,收敛速度比无穷级数快很多,有效位数在每一次迭代之后会增加数倍,但是占用内存较大
-
快速收敛级数,以拉马努金的那些公式为代表,收敛速度和迭代算法相当,并且内存和复杂度更低,但是背后的代数背景很复杂
-
阀门算法(1995年提出),与前面的所有算法不同,阀门算法每计算出一位数字,该数字就会像流过阀门的水一样不会再出现在后续的计算过程中,甚至有的算法可以计算十六进制下
的指定位数片段,被称为位数萃取算法。
-
Remark
近现代的数值算法获得的有效精度会很快超过双精度/四精度浮点数的有效位数,因此在算法实现时对于
割圆法及加速技巧
割圆法的简要历史如下:
-
第一个有记录的割圆法记录,来自古希腊的阿基米德,他得到的结果为
-
中国古代的割圆法源自曹魏时期的刘徽,他使用正3072边形得到了近似值
-
祖冲之使用割圆法和其它未知的加速技巧,得到的结果为
,并提出约率和密率 (如果不使用其它技巧,单纯依靠割圆法,需要使用正12288边形,这个量级的精确测量并不太可能)
割圆法的原理很简单,直接构造内接和外接正n边形即可得到
这里的正多边形边长数,通常从
Remark
割圆法实际没有上面这么简单,根据文献分析,刘徽和祖冲之在实践中应该都使用了一些加速技巧。
定义
基于泰勒展开可以得到
因此它们都是
基于这两个直接测量可得的数列,有几种常见的提高阶数的技巧可以用来提升
-
加权平均:由于我们已知上下界数据,基于上界和下界某种加权平均,就可以得到
的 量级的近似 这里的加权系数
可以通过精确公式推出,但是在实践中表达式可能是未知的,我们也可以通过已知计算数据近似获得,例如其中
是趋于 的数列,使用上述近似等式可以解得加权系数的近似值 用近似的加权系数代入计算并不影响阶数
-
预估校正:在展开式中用已知数据近似替代精确值
,可以得到 的 量级的近似 -
外推:外推是一种通用的加速技巧,利用展开式自身性质来消去自身的低阶项。 下面只使用
做外推,对于 也是类似的。 例如一阶外推可以得到 的 量级的近似 继续二阶外推,可以得到
的 量级的近似
无穷级数法
在微积分之前的时代,数学家就已经发现了几个关于
还有名为沃利斯乘积的表达式
在微积分建立之后,更多关于
取
这个公式被称为格雷果里-莱布尼茨公式,形式非常简单,但是取
还有一些比格雷果里-莱布尼茨公式更快收敛的无穷级数,例如
有一类基于反正切但是形式比较独特的梅钦类公式(Machin-like formula),例如最经典的一个公式为
注意这个式子是精确成立的,在实际计算时通过对右侧的
假设满足
那么就可以得到
反复使用这个式子就可以推导得到梅钦类公式。具体过程如下,首先准备
因此
最终得到
拉马努金(Ramanujan)提出了很多涉及
下面的楚德诺夫斯基(Chudnovsky)公式相当于对拉马努金公式的改进,每计算一项就能得到
Remark
这两个公式的证明显然超出了本文的讨论范围。
迭代算法
有很多形式类似的迭代算法,这里记录一个典型的高斯-勒让德算法:
-
初始化
-
迭代计算
-
的近似值可以取为
Remark
高斯-勒让德算法并没有明确的迭代终止判定,选取一个足够大的迭代次数即可。高斯-勒让德算法的证明需要用到含有椭圆积分的恒等式,超出了本文的讨论范围。
关于这套算法,有一个更一般性的例子。
Example
给定两个正数
那么,这两个数列会收敛到同一个极限,称为
Proof
由归纳法容易证明:
又因为
因此,两个数列都收敛,并且收敛到同一个极限。
Note
可以用椭圆积分表示
阀门算法
阀门算法是一类非常新颖的算法,在提出时曾震惊学界,因为它不再需要保存整个
贝利—波尔温—普劳夫公式(BBP公式) 是阀门算法的典型
基于这个公式可以容易地设计出一种萃取算法来计算十六进制下的指定片段,因此这个公式主要被用来检查其它算法得到的新纪录的结果是否正确,将其它算法的结果转换到16进制并与之比较。
虽然阀门算法的思路非常新颖,但是 BBP 公式本身的证明并不困难:首先,对于
取几个不同的
BBP 公式得证。