-
圆周率计算历史
[1] [2] [3] [4]给出详尽的关于圆周率p计算的历史。我们这里仅给出几个有代表性的事件。
1.1第一个将p计算到小数点后2位数字的是古希腊数学家阿基米德(Archimedes),阿基米德是有史以来最伟大的三个数学家之一,另外两个是牛顿和高斯。
1.2.第一个将p计算到小数点后7位以上者是中国南北朝时期的数学家祖冲之,他的记录保持了1000多年,直到1424年才被中亚数学家阿尔卡西(AI-Kashi)打破.
1.3.第一个将p计算到100位以上者,是英国数学家梅钦(John Machin),他在1706将p计算到100位。
1.4.第一个突破500位,是威廉·香克斯( William Shanks),他在1874年,将p计算至707位,但只有527位是正确的。
1.5.p的手工计算最高纪录由是英国的弗格森(DF Ferguson),1948他和美国的伦奇共同发表了p的808位小数值。
1.6第一个突破1000位的是DF Ferguson和JohnWrench,他们使用台式计算器将p计算至1120位,这也是计算机出现之前的最高纪录。
1.7第一个突破10000位,Francois Genuys, 他在1958年1月用一台IBM 704将p计算到1万位。
1.8.第一个突破1亿位的,是日本人金田康正(Yasumasa Kanada),他在1987年1月,他在一台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方法使得计算效率更高。这个公式非常好用,甚至在2002年12月,金田康正首次将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),是一位杰出的软件工程师,FFmpeg和QEMU软件的创建者。他用自己开发的软件在一台CPU为Core i7 CPU 2.93GHz台式机上运行了90多天,将p算到小数点后27000亿位,创造了新的世界纪录。
4.4近藤茂(Shigeru Kondo),近藤茂是一名*的p爱好者。他并非数学家,他总是使用别人写的程序来计算p。在近几年,他使用余智恒(Alexander Yee)开发的y-cruncher程序创造了3次世界纪录,分别将p计算到5万亿,10万亿,和12万亿位。他也曾用另一个程序PiFast创造了在PC上p计算位数的世界纪录,但计算位数没有超过当时的巨型机,故在[2]中没有提及。在[3]中,他的名字出现了23次,比如在2003年9月,他在一台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. PiFast,Xavier Gourdon的PiFast是2003年MicrosoftWindows最快的程序。据其作者称,它可以在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其他计算圆周率的程序,除了上述几个程序外,还有其他一个程序同样可计算圆周率,这里就不在重点介绍了。他们有wPrime,IntelBurnTest,Prime95,Montecarlo superPI,OCCT等。
6.y-cruncher和Pifast的性能比较,由于PiFast是32位程序,仅仅运行单线程模式。所以我的测试仅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的速度是PiFast的7倍 |
测试结果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的速度是PiFast的1.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