也谈圆周率计算

来源:互联网 发布:基地阅读顺序知乎 编辑:程序博客网 时间:2024/05/31 04:03
  1. 圆周率计算历史

[1] [2] [3] [4]给出详尽的关于圆周率p计算的历史。我们这里仅给出几个有代表性的事件。

1.1第一个将p计算到小数点后2位数字的是古希腊数学家阿基米德(Archimedes),阿基米德是有史以来最伟大的三个数学家之一,另外两个是牛顿和高斯。

1.2.第一个将p计算到小数点后7位以上者是中国南北朝时期的数学家祖冲之,他的记录保持了1000多年,直到1424年才被中亚数学家阿尔卡西(AI-Kashi)打破.

1.3.第一个将p计算到100位以上者,是英国数学家梅钦(John Machin,他在1706p计算到100位。

1.4.第一个突破500位,是威廉·香克斯( William Shanks),他在1874年,将p计算至707位,但只有527位是正确的。

1.5.p的手工计算最高纪录由是英国的弗格森(DF Ferguson)1948他和美国的伦奇共同发表了p808位小数值。

1.6第一个突破1000位的是DF FergusonJohnWrench,他们使用台式计算器将p计算至1120位,这也是计算机出现之前的最高纪录。

1.7第一个突破10000位,Francois Genuys, 他在19581月用一台IBM 704p计算到1万位。

1.8.第一个突破1亿位的,是日本人金田康正(Yasumasa Kanada),他在19871月,他在一台NEC SX-2电脑上,将p计算到134,214,700位。

1.9第一个突破1万亿位的,也是日本人金田康正,他使用的就是一种Machine公式。

 

2.p的算法

2.1.多边型法在文艺复兴时代(或者说17世纪)之前,p都是通过计算多边形的周长来近似得到的。这类算法很慢,祖冲之将p算至小数点后7位花了15年时间。

2.2梅钦公式或类梅钦公式,这个公式是英国数学家梅钦(John Machin)提出,1706年梅钦计算p值突破100位小数大关,他利用了如下公式:



这个公式有2项,每项都是一个常数乘以arctan(1/p)形式的数。而arctan(1/p)的展开式是一个级数形式,可以使用普通的方法来计算,也可以使用Binarysplitting方法使得计算效率更高。这个公式非常好用,甚至在200212月,金田康正首次将p计算到1万亿位以上时,他使用的就是一种Machine公式,这个公式是挪威人Størmer提出来的,见[3]和[7]

2.3拉马努金公式和Chudnovsky公式

印度传奇数学家给出多个计算p的公式,见[10],这里我们贴出至今仍被广为使用的那个公式



楚德诺夫斯基(Chudnovsky)公式,楚德诺夫斯基兄弟是美国数学家和工程师,楚德诺夫斯基兄弟发明了一个新的公式,称之为Chudnovsky公式, 这个公式是Ramanujan公式改良的基础上改良而成的。1994年Chudnovsky兄弟利用这个公式计算到了4,044,000,000位。

Chudnovsky公式的另一个更方便于计算机编程的形式是:

2.3 AGM算法

1976年,理查德·布兰特(R.P.Brent)和尤金·萨拉明(Eugene Salamin)独立的发表了新的计算p的算法。称之为布伦特-萨拉明(或萨拉明-布伦特)算法。这个算法是一个迭代算法,每迭代一次,有效数字增加1倍。这个算法用到高斯-勒让德AGM迭代算法。其方法见下

初值:

重复计算:

最后计算:

4.当代p计算的几个重要人物

4.1金田康正(Kanada Yasumasa)。金田康正是一位日本数学家,东京大学信息科学系教授,在过去30年中他的21次计算中,创造了11次世界纪录。他的名字出现在[2]中多19次。

4.2 Chudnovsky兄弟,是美国数学家和工程师,他们开发了Chudnovsky算法,并多次创造了p的计算纪录。在[2]中,他们的名字出现了5次。

4.3法布里斯•贝拉(Fabrice Bellard),是一位杰出的软件工程师,FFmpegQEMU软件的创建者。他用自己开发的软件在一台CPUCore i7 CPU 2.93GHz台式机上运行了90多天,将p算到小数点后27000亿位,创造了新的世界纪录。

4.4近藤茂(Shigeru Kondo,近藤茂是一名狂热的p爱好者。他并非数学家,他总是使用别人写的程序来计算p。在近几年,他使用余智恒(Alexander Yee)开发的y-cruncher程序创造了3次世界纪录,分别将p计算到5万亿,10万亿,和12万亿位。他也曾用另一个程序PiFast创造了在PCp计算位数的世界纪录,但计算位数没有超过当时的巨型机,故在[2]中没有提及。在[3]中,他的名字出现了23次,比如在20039月,他在一台P4-3.2GHZ的电脑上,将p计算到250亿位,见[3].

4.5.余智恒(Alexander Yee)是一位年轻的计算机天才,在2010年,近藤茂用他的程序创造了新的世界记录时,他仅仅22岁。如今,他的程序世界上计算p最快的程序。

5.几种计算圆周率的软件

5.1.   SuperPi,是金田康正基于运行巨型机上的程序改写的,可运行在普通PC的版本。Super Pi在超频社区非常流行,既可以作为测试这些系统性能的基准,也可以作为压力测试来检查它们是否仍然正常工作。该程序使用浮点FFT算法来做大数乘法,使用AGM算法来计算圆周率。相对于后来者,这个程序的速度并不是很快。我自己编写的仅仅使用Toom-4乘法和AGM算法的计算p的程序居然可和SuperPi打成平手。关于SuperPi,请参见[4]

5.2. PiFastXavier GourdonPiFast2003MicrosoftWindows最快的程序。据其作者称,它可以在2.4 GHz Pentium 4上以3.5秒计算一百万位数。PiFast还可以计算其它无理数等e√2。它也可以在效率较低的情况下以很少的内存工作(低至几十兆以计算十亿位以上的数字),PiFast可使用拉马努金公式和Chudnovsky公式来计算p,比SuperPi要快很多,但它是一个单线程的程序,运行在32位的操作系统,不能充分发挥CPU的计算能力。

5.3. Steve Pagliarulo写的QuickPiye也是同样优秀的计算p的程序,当计算精度在4亿位以下时,他的速度快于PiFast。像PiFast一样,QuickPi也可以计算其他的无理数,比如e,√2和√3

5.4. y-cruncher,他是余智恒写的一个计算p的程序,可运行在32位或者64位操作系统,可工作于多线程模式或者单线程模式,可充分发挥CPU的计算能力。当然,这个程序也是最复杂的。[8]提到,这个程序的源码竟包含47万行以上的代码。[9]中提到,这个程序使用了多至9种计算大数乘法的算法。

5.5其他计算圆周率的程序,除了上述几个程序外,还有其他一个程序同样可计算圆周率,这里就不在重点介绍了。他们有wPrimeIntelBurnTestPrime95Montecarlo superPIOCCT等。

6.y-cruncherPifast的性能比较,由于PiFast32位程序,仅仅运行单线程模式。所以我的测试仅Focus在单线程模式,测试计算2500万位圆周率的运行时间,时间单位为秒。

测试结果1

运行环境

Win7 64bit, CPU: i7-4700HQ @ 2.40GHz, 8G RAM

程序

y-cruncher

PiFast

命令行或参数

y-cruncher custom pi -dec:25m -TD:1 -PF:none

0,0,25000000,2048,1

Final Multiply

0.213

1.51

Total time

8.039

45.55

Note:

Total time不包括从2进制转化10进制的时间。以Final Multiply步骤为参照。y-cruncher的速度是PiFast7

 

测试结果2

运行环境

Win7 32bit, CPU: i7-2600K @ 3.40GHz, 16G RAM

程序

y-cruncher

PiFast

命令行或参数

y-cruncher custom pi -dec:25m -TD:1 -PF:none

0,0,25000000,2048,1

Final Multiply

0.704

1.29

Total time

22.513

40.34

Note:

Total time不包括从2进制转化10进制的时间,Final Multiply步骤为参照y-cruncher的速度是PiFast1.8

 

 

[1]https://en.wikipedia.org/wiki/Approximations_of_%CF%80π的近似值

[2]https://en.wikipedia.org/wiki/Chronology_of_computation_of_%CF%80π计算年表

[3]http://numbers.computation.free.fr/Constants/PiProgram/computations.htmlp and its computation through the ages

[4]https://baike.baidu.com/item/%E5%9C%86%E5%91%A8%E7%8E%87/139930百度百科圆周率

[5]https://en.wikipedia.org/wiki/Super_PI

[6]https://en.wikipedia.org/wiki/Yasumasa_Kanada

[7]https://en.wikipedia.org/wiki/Carl_St%C3%B8rmer

[8]http://www.numberworld.org/y-cruncher/algorithms.html

[9]http://www.numberworld.org/y-cruncher/internals/multiplication.html乘法

[10]http://numbers.computation.free.fr/Constants/Pi/piSeries.html




原创粉丝点击