其他

割圆之术: 祖冲之是如何算圆周率的?

2017-10-22 作者| 张江敏 蝌蚪士

特别声明


本平台推出文稿均出于非商业性的教育和科研目的,旨在传播学术研究信息、净化大学教育与科研生态环境。但声明该文仅代表原作者的个人观点并不意味着本公众号赞同其观点或证实其内容的真实性。如有异议或侵权,本平台将在第一时间处理。期望读者关注点赞《蝌蚪士》公益事业: 为苦逼科民发声、并贡献正义的智力;且为平民大众免费科普,使之走进科学、传承科学、壮大科学——人人都能成为真才实学的蝌蚪士 (主编| 赛德夫).


南北朝时期的数学家祖冲之把圆周率算到了7位有效数字,这是中国古代数学的一座高峰。

这个记录保持了数百年才被在撒马尔干工作的穆斯林数学家阿尔-卡西(al-kashi)打破,他获得了16位有效数字。

据说祖冲之采用的是刘徽发明的割圆术,就是用内接正N边形接近圆周,取正N边形的周长为圆周长之近似。这大概也是阿基米德的做法。用现代的观点看,他们考虑的是数列

很显然,这个数列以pi为极限。问题是如何从这个数列的前几项中提取出pi。对我们现代人来讲,标准做法就是Richardson变换。利用sine函数的级数展开公式,我们有


写成这样的渐进展开形式后,我们就可以作Richardson变换了。我们考虑子数列


其中m可以为任意值,不过一般取m=6,因为相应的a取值为3,非常简单。这个子数列恰恰也是祖冲之他们考虑的。他们这样做的理由是,从a_n到a_n+1很难,正n边形与正n+1边形关系不大,但是从正n边形到正2n边形就简单得多。数学上,他们需要做的问题等价于已知角度A的sine值,需要计算角度A/2的sine值。这在现在看来,只需要解一个一元二次方程即可,计算上的麻烦之处在于需要开两次平方根。

无论是求平方根还是解一元二次方程,这对祖冲之他们而言都不容易。

不过,即便他们能够解决这些问题,还有一个困难有待解决。从上面a_n的展开式可以看出,每次倍增边数时,误差减小大概4倍。按照这个收敛速率,得作12次迭代才能达到祖冲之获得的精度。这个计算量太大了。

祖冲之肯定有某种聪明的办法从极其有限的数据中提取尽量多的信息。

他的做法不详,不过很可能跟现代标准技术类似。

下面的程序采用现代的Richardson方法提取pi,只需要取前3项,就几乎可以得到祖冲之的精度。也就是只需要从正六边形开始,先扩到12边形,然后再扩到24边形,


结果如下(右上角的那个值的前7位都是对的 ):


这样看来,祖冲之在集合各种技术之后,是完全可能获得他的结果的。

注1:据说巴比伦人在公元前2000年就会算平方根,他们这样算根号二,x_{n+1} = (x_n+2/x_n)/2。这其实就是现代的牛顿法,收敛超快!我们日常计算机就应该是用这个算法。不确定祖冲之是否用的这个聪明算法。

注2:据说巴比伦人也会解一元二次方程。这可以作为一个文明发展的标志。曾经有个老师跟博主讲蒙古人如何以野蛮战胜文明,他就说成成吉思汗灭花剌子模(就是阿尔-卡西的国家)的时候,花剌子模都已经能够解一元二次方程了。其实不止能解一元二次方程,他们还把pi算到了16位有效数字。

注3:我从来没见过祖冲之的圆周率的原始出处,据说在隋书-律历志。有这本书的同志,希望能够拍个照分享下,谢谢!

注4:博友尤明庆老师也研究过同样的问题。不过,他只做一次变换,没有对变换所得数列再作变换,所以需要割到192边形。

注5:其实一个更大的迷是,祖冲之是如何找到pi的有理近似355/113的。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存