今天是圆周率节,赶工怒发博文!
在古代,为了计算高精度的圆周率,数学家们往往要用纸和笔辛苦计算几个月甚至几年。而今天我们点点鼠标就可以悠闲的分分秒把圆周率计算到几百万甚至上亿位。这一章我们来看看,在现代计算机上,如何在最短时间里计算出最长的圆周率。
不少人想到计算圆周率可能会联想到SuperPi这个邪恶小程序。这个程序是日本人金田康正在1995年写的,可以在家用电脑Windows系统上把圆周率计算到2**32位。国内很多的装机商攒机商,都用这个程序来测试新装机的超频性能。这其实是很不科学的。首先这个程序是1995年开发的,距离今天已经有快20年,很多新CPU的特性都没有利用上。第二,这个程序是用单线程开发的,对于现代CPU多核的特性也没法支持。第三,单一的用Superpi做超频测试,也容易让硬件厂商进行有针对性的作弊。现在其实有比较新的 Hyper PI 可以做为Superpi的替代品。
Superpi 和 Hyper PI 远远不是现在在家用电脑上计算圆周率的主流和先锋。他们采用的是高斯-勒让德算法。其算法也早已过时,有更好的可以替代。
由于圆周率的计算算法实在是五花八门,如果都总结下来的话,作者可能可以骗几十章博客更新,读者可能也懒得再看直接关窗口。那么这里只说一个目前为止最先进和最好的算法。这就是楚德诺夫斯基(Chudnovsky)算法。
楚德诺夫斯基是生于乌克兰的美国数学家,1992年纽约人杂志把楚德诺夫斯基评为世界上最厉害的数学家之一。1987年他发明的计算圆周率的楚德诺夫斯基算法,一直到今天仍然保持着圆周率的最佳计算记录。
该算法是如何来的,请看专业论文,这里直接给出公式:
看上去超级复杂是不是?其实不然,通过简化,代码只有短短的几行。该算法的特色就是,整个计算过程只用最后做一次除法和一次平方根运算。其余全都是加法和乘法!
a = lambda i: (1,1,13591409) if i==0 else ((6*i-5)*(2*i-1)*(6*i-1),i**3*10939058860032000, (6*i-5)*(2*i-1)*(6*i-1)*(13591409+545140134*i)*(-1 if i&1 else