标签归档:数值计算

简评围棋世纪大战

W020160309499767463096AlphaGo与李世石的世纪大战在3月15日落下了帷幕,李世石终于不敌AlphaGo,最后战成了1:4。其中可圈可点的第四盘,AlphaGo走出奇臭无比的黑79手,并没有像很多IT专家开赛前预测的横扫李世石,把无数“专家”们的脸都打肿了。

甚至有很多国内“专家”开始鼓吹人工智能已经战胜人类,甚至人类将要被人工智能统治等无知言论,让人实在看不下去。做为围棋爱好者和一个普通挨踢工作者,这里可以简单说一下AlphaGo的原理和机制。

AlphaGo是一个通用型人工智能程序?这个恐怕是今年最大的误解。

让我们看看背后的英国团队DeepMind的Aja Huang(黄士杰),从2003年硕士论文开始研究围棋打劫程序,到2011年博士论文研究围棋MCTS算法,一直是各大围棋程序研究的中坚力量,其本人也有业余6段水平。DeepMind的创始人Demis还是一个国际象棋13岁的天才大师。DeepMind团队中其他懂围棋的也不在少数,团队更是从去年就开始请欧洲冠军樊麾做他们的全职围棋顾问。

其所使用的算法,主要可以分为三大块:蒙特卡洛搜索(MCTS),快速走子,和深度神经网络。MCTS是目前非常针对围棋的博弈类搜索算法,快速走子是充分利用围棋定式和规则的在极短时间内下子的算法,深度神经网络是一个获取统计知识的训练学习模型。可以看到,只有深度神经网络勉强算作通用性算法,其余都是相当针对围棋这一课题的专业性特殊算法。

最近深度神经网络炒作的火热,甚至有人认为从深度神经网络就可以发展出真正的智能来了。深度神经网络是统计知识的学习算法,它并不具备逻辑知识,从目前应用来看,可以解决一些图像识别问题,但是离真正的人工智能还有十万八千里。

从对弈结果来看,我们也发现了AlphaGo极大的不足:大局观优秀,计算力不行。一个很尴尬的问题就是,为什么计算机还会计算力不行?这实际上还是因为围棋的棋盘太庞大,如果采用全盘搜索,即使深度再深,对于局部来说也搜不到几步。AlphaGo并不像其它围棋程序一样,在局部战斗的时候会临时缩小搜索范围,产生局部最大化的计算力,因此AlphaGo的局部往往会亏损,反而没有职业棋手算的清楚。

计算力不足导致的另一个严重问题是,一旦涉及到复杂的劫争,就会立刻陷入被动,导致崩盘。从对弈过程来看,AlphaGo有意的避免打劫的出现,是有目共睹的。实际上,大局观和局部计算力是任何一个围棋程序难以取舍的两个难点。要大局观,必须全盘搜索,使得局部计算力有一定缺陷。要计算力,必须在局部问题上加以限制,因此往往不会脱先去争别处的好点。

另一个问题是,自我训练(self-train)可以显著提高水平么?这一点在之前被专家们鼓吹的很凶猛,号称一直训练下去可以得到围棋上帝。实际上自己和自己下得到的谱,一般来说是有瓶颈存在的。在两个估价函数相同的程序看来,因为搜索深度和宽度局限,看不到的棋局依然看不到。随便举个例子,两个6岁小孩对下10000局可以提高到职业9段?只有和比你更厉害的高手对弈才可以显著提高水平。这也是AlphaGo团队请了樊麾去做围棋顾问,特训了几个月的原因所在。

Alp470e92b60339250b849feaf4802f0891haGo解决了围棋问题了么?AlphaGo就是围棋上帝?其实远远没有解决。人类研究围棋算法已有超过百年历史,最近十几年MCTS算法也给围棋程序注入了一股新鲜的活力,极大的提高了围棋程序的水平。然而,围棋由于状态空间的庞大,注定是需要更多更长时间来优化的。甚至如果说要完全“解决”围棋问题,搜索完全部的围棋状态空间,恐怕未来50年都看不到任何希望。

从世界范围来看,AlphaGo的算法改进创新上不见得很优秀,在我看来更像是利用了Google庞大的计算资源(相比之下其它围棋程序的可分配计算资源简直少的可怜)而取得的成果。本次对弈尽管从结果上来看非常的出色,机器程序有史以来第一次战胜了人类职业9段,但在我看来依然有着浓重的商业营销味。

围棋是个大问题,棋盘太大,可能性太大,职业棋手确实有时候都无法评价一步棋的好坏。未来几年,也许发展过后的围棋程序可以帮助职业棋手提高水平增强实力,不过如果要把围棋程序和人工智能生扯在一起,我觉得从目前来看依然是远远不够的。

到目前为止,没有任何迹象表明,深度神经网络对统计知识的学习可以表征人类智能,恰恰相反,深度神经网络其局限性也越来越多的被人了解。智能是非常复杂的统计知识的表征么?智能是什么,其实到现在依然是个谜。

 

圆周率之随笔(3)

今天是圆周率节,赶工怒发博文!

在古代,为了计算高精度的圆周率,数学家们往往要用纸和笔辛苦计算几个月甚至几年。而今天我们点点鼠标就可以悠闲的分分秒把圆周率计算到几百万甚至上亿位。这一章我们来看看,在现代计算机上,如何在最短时间里计算出最长的圆周率。

不少人想到计算圆周率可能会联想到Superpi这个邪恶小程序。这个程序是日本人金田康正在1995年写的,可以在家用电脑Windows系统上把圆周率计算到3000万位。国内很多的装机商攒机商,都用这个程序来测试新装机的超频性能。这其实是很不科学的。首先这个程序是1995年开发的,距离今天已经有快20年,不光算法过时,编译器也已经过时,很多新CPU的特性都没有利用上。第二,这个程序是用单线程开发的,现代CPU动不动就是4核8核,单线程的计算程序早已经无法反应CPU真实能力。第三,单一的用Superpi做超频测试,也容易让硬件厂商进行有针对性的作弊。现在其实有比较新的 Hyper PI 可以做为Superpi的替代品。

Superpi 和 Hyper PI 远远不是现在在家用电脑上计算圆周率的主流和先锋。他们采用的高斯-勒让德算法也早已过时,有更好的可以替代。

由于圆周率的计算算法实在是五花八门,如果都总结下来的话,作者可能可以骗几十章博客更新,读者可能也懒得再看直接关窗口。那么这里只说一个目前为止最先进和最好的算法。这就是楚德诺夫斯基(Chudnovsky)算法。

楚德诺夫斯基是生于乌克兰的美国数学家,1992年纽约人杂志把楚德诺夫斯基评为世界上最厉害的数学家之一。1987年他发明的计算圆周率的楚德诺夫斯基算法,一直到今天仍然保持着圆周率的最佳计算记录。

该算法是如何来的,请看专业论文,这里直接给出公式:

826dc7788dba249ee86fc0135e06b035

看上去超级复杂是不是?其实不然,通过简化,代码只有短短的几行。该算法的最大特色就是,整个计算过程只用最后做一次除法和一次平方根运算。其余全都是加法和乘法!

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%2 else 1))
b = lambda x,y: (x[0]*y[0], x[1]*y[1], y[1]*x[2]+x[0]*y[2])
bs = lambda i,j: a(i) if j-i==1 else b(bs(i,(i+j)/2),bs((i+j)/2,j))
sqrtC = lambda digits: isqrt(1823176476672000*10**(2*digits))
def isqrt(n):
    x,d = 2**(n.bit_length()-1),1
    while d:
        d = (n/x-x)/2
        x += d
    return x

def pi(digits):
    N = int(digits/14.1816474627254776555+1)
    P, Q, T = bs(0, N)
    return (Q*sqrtC(digits)) / T

这段代码在Python 2.X上可执行,运行print pi(100)看看?圆周率的前100位就出来咯。

对于这段代码稍作一些解释:上文看似复杂的公式,其实被拆成了两个函数:a 和 b。整个圆周率计算被简化成了一个mapreduce操作:reduce(b, map(a, range(N)),也就是 N 次 a 运算和 N-1 次 b 运算。为了继续优化,我们设计了 bs 函数,做的是二分切割,将每次计算区域切割两份,然后分头计算,最后做归并。这个计算量其实是一样的,还是 N 次 a 运算和 N-1 次的 b 运算。那么二分切割为什么会运行的更快呢?其主要原因是进行二分切割可以将高精度的大数乘法尽量拖后,执行的层数越低,数字的长度才成指数倍提高。

楚德诺夫斯基算法号称是目前计算圆周率最快的算法,然而这段代码在笔者的电脑上运行计算 pi(10000) 居然要 60 秒之久。问题出在哪呢?经过简单的 benchmark 我们发现,其主要时间消耗在了 isqrt 函数里。由于 python 默认没有高精度整数的平方根操作,所以这个用牛顿拉普森法模拟的平方根操作很慢。

为了快速求平方根,下面我们祭出高精度运算的大杀器 gmp。同时采用python可以用的 gmpy 来加速平方根操作。经过修改的代码如下:

from gmpy2 import *

a = lambda i: (1,1,13591409) if i==0 else (mpz((6*i-5)*(2*i-1)*(6*i-1)),mpz(i)**3*10939058860032000,
        mpz((6*i-5)*(2*i-1)*(6*i-1))*(13591409+545140134*i)*(-1 if i&1 else 1))
b = lambda x,y: (x[0]*y[0], x[1]*y[1], y[1]*x[2]+x[0]*y[2])
bs = lambda i,j: a(i) if j-i==1 else b(bs(i,(i+j)/2),bs((i+j)/2,j))
sqrtC = lambda digits: isqrt(1823176476672000*mpz(10)**(2*digits))

def pi(digits):
    N = int(digits/14.1816474627254776555+1)
    P, Q, T = bs(0, N)
    return (Q*sqrtC(digits)) / T

经过修改的代码也更短更简洁了,只有短短的10行。让我们测试一下速度如何?(需要先安装 gmpy2 的 python 包才可执行)

位数 时间
10,000 0.04s
100,000 0.11s
1,000,000 1.07s
10,000,000 17.76s

20秒内,在笔记本上轻松将圆周率计算到了 1000 万位!1987年在巨型超级计算机上才创造的圆周率世界纪录,在今天的任何一台个人电脑上,都可以轻松碾压了。

然而我们还不满足。这个代码依然没有把楚德诺夫斯基算法的优势发挥出来。楚德诺夫斯基算法最大的优势是可以很好的并行化。在多核时代,单线程运行的代码实在没法体现出CPU的优势出来。

然而由于python的GIL的设计问题,多线程的代码无法很好的利用多核。因此我们用多进程的方法实现了楚德诺夫斯基算法的并行化。下面是在4核CPU的笔记本的运行环境下比较不同进程数量的程序性能。计算位数依然是1000万位:

计算核心(进程数) 时间
单核版本 17.76s
1 18.58s
2 12.66s
3 10.39s
4 9.88s
5 9.79s
6 10.17s

可以看到,通过并行化代码,利用CPU的多核,我们将性能提升了1倍!在计算核心继续增加超过CPU本身的4核之后,性能不升反降,这也是预料之中的事。

有人会问,为什么用4个计算核心提升的性能不是4倍?这里其实牵扯到并行化算法中比较复杂的问题。4核心最理想的性能当然是4倍的提升,但是由于算法本身限制,以及任务细分之后之间的依赖关系,计算核心之间的数据交换,导致最理想情况很难做到。算法中的任务划分也非常有学问,分的太粗会对多内核利用率不高,分的太细又会大大增加进程/线程间的通讯和同步的消耗。这里就不做更深入探讨了。

在这里我们不得不提到 gmp 官方给的一个 C 语言实现的楚德诺夫斯基算法的圆周率计算程序。这个程序对算法细节进行了大量的优化和微调,代码长度接近800行。其中 pgmp 是利用多线程做的并行楚德诺夫斯基算法。有兴趣的同学可以阅读一下代码了解更多优化细节。

单核C: gmp-chudnovsky
并行C: pgmp-chudnovsky
作者的山寨并行Python版: pi-chudnovsky

下面我们用作者自己的无优化山寨 Python 版本和 gmp 官方给的 C 语言版本的圆周率计算程序进行一下性能测试比较。测试环境是一台8核的Amazon c1.xlarge虚拟机。测试位数是圆周率的前1亿位(100,000,000)。

计算核心(进程数) 时间(C版本) 时间(Python版本)
单核版本 242.3s 397.0s
1 309.4s 419.4s
2 192.3s 226.9s
3 159.9s 168.1s
4 137.2s 135.1s
5 137.5s 116.7s
6 130.8s 105.3s
7 129.7s 102.4s
8 126.4s 99.8s

可见尽管作者的 python 实现的山寨程序尽管算法所用的数据结构优化不够,因此在计算核心较少情况下表现不佳,不过在并行化方面还是做的很好,充分利用到了多核CPU的每一个计算核心。100多行的代码用 python 操作符重载的特性来简化了原本应该很复杂的并行算法的编写。

当然,这些还远远没有到极限。关于圆周率计算的竞赛自古到今一直在进行,在互联网时代越发的激烈。计算竞争的平台也从之前的大型机小型机转到了个人计算机。这里介绍一个著名的圆周率项目叫 y-cruncher

y-cruncher是目前的圆周率计算世界纪录保持者,经作者测试,在刚才的同样测试环境下,计算圆周率1亿位只需要 36.9 秒。y-cruncher 的基本圆周率算法依然还是楚德诺夫斯基算法,但是其代码长度已经到达了17万行!由于优化的足够好,其主要的计算上限还是在内存的大小,y-cruncher的实现主要精力也是在底层内存交换、CPU底层特性的利用以及基础高精度算法的优化上。具体细节大家还是去看他的主页吧。

最后,这篇断断续续写了很久的博客总算完成了。由于篇幅关系,关于博大精深的圆周率以及圆周率文化只是浅尝辄止,希望大家看完以后也能和我一样从此喜欢上深邃的圆周率。

 

 

圆周率之随笔(2)

让我们继续上一章的话题。圆周率是不是祖冲之发明的呢?显然不是。圆周率是一个数学常量,是世界存在以后就亘古不变的一个数字。在人类诞生以前,它就存在了,就一直静静的在那里等着聪明人去发现。所以,很多电视问答题的题目都是错的。那么祖冲之做了什么呢?他是世界上第一位把圆周率算到小数点后第七位的人,同时领先了西方1200多年!

01300000214331124022076846267祖冲之是一个小官二代。祖父是修土木的小官儿,自己一辈子最大也就混了个县令。然而却喜爱数学和工程,在和自己儿子的共同研究之下,研究了一辈子出了一本数学著作,名叫《缀术》。这本书写的是啥,也没人知道了,因为后世就失传了。我们看看唐朝人是怎么评价这本书的。当时唐朝将这本书列为数学教科书,给出的参考学习年数是4年。就是说一般学生要学4年才能把这本书看明白。还有更夸张的,唐朝的算学第一高人李淳风说,“这本书太难了,我们都看不懂!所以大家慢慢也就不去看了”。唐朝的另一个算历博士王孝通说,“有人说这本书很精妙,但是其实里面全都是错的!”。据说宋朝还有人拿着此书练书法。传说是在南宋年间失传的。真相到底如何呢?书已经失传,所以就不得而知了。

《缀术》虽然已经失传了,那我们从何而知祖冲之的圆周率的呢?这个描述来自于《隋书》的《律历志》。作者就是唐朝的算学大师李淳风。原文如下:

古之九数,圆周率三,圆径率一,其术疏舛。自刘歆、张衡、刘徽、王蕃、皮延宗之徒,各设新率,未臻折衷。宋末,南徐州从事史祖冲之,更开密法,以圆径一亿为一丈,圆周盈数三丈一尺四寸一分五厘九毫二秒七忽,朒数三丈一尺四寸一分五厘九毫二秒六忽,正数在盈朒二限之间。密率,圆径一百一十三,圆周三百五十五。约率,圆径七,周二十二。又设开差冪,开差立,兼以正圆参之。指要精密,算氏之最者也。所著之书,名为《缀术》,学官莫能究其深奥,是故废而不理。

翻译成白话文就是说,南朝的徐州从事史,祖冲之,非常厉害,把圆直径一丈分为一亿份,周长在三丈一尺四寸一分五厘九毫二秒六忽到七忽之间 (3.1415926 < π < 3.1415927),等等。

这里略让人产生疑惑的一点是,除了唐朝李淳风在《隋书》里提到这么一句之外,翻遍整个中国古籍,都找不到其它任何关于祖冲之圆周率的描述。甚至在祖冲之之后1000多年的所有古代数学家们,也都全部不知道祖冲之能有如此之高的圆周率精度。看下表:

年代  朝代 数学家 圆周率 精度
公元前100 战国 《周髀算经》 3 0
公元前50 刘歆 3.1547 1
公元78 张衡 730/232=3.1467
92/29=3.1724
sqrt(10)=3.162
1-2
公元133 蔡邕 3.125 1
公元228 三国 王蕃 142/45=3.155 1
公元300 魏晋 刘徽 157/50=3.14
3927/1250=3.1416
2-3
公元370 何承天 3.1429 3.1432 2
公元429 南朝 祖冲之 3.1415926~3.1415927
22/7 355/113
7
公元602 李淳风 22/7=3.1429 2
公元1208 秦九韶 sqrt(10)=3.162 1
陈荩谟 3.1525 1
公元1536 朱载堉 sqrt(2)/0.45=3.1427 2
邢云路 3.1213 3.126 1
公元1533 程大位 25/8=3.125 1
公元1611 方以智 52/17=3.0588 0
公元1714 王元启 sqrt(10)=3.162 1
顾长发 3.125 1
公元1728 钱大昕 3.16 1

祖冲之在中国古代2000多年的圆周率史上,如皓日当空那般耀眼,不仅仅是前无古人,而且当真做到了后无来者(西方数学家算出来的不算)。

为何唐朝人写的《隋书》中,明明写清楚了祖冲之的高精度的圆周率,但是后世1000多年,这些个算学大师们一个一个都闭口不提,而且反而用精度更差的圆周率呢?《梦溪笔谈》的作者沈括也因为使用了很差的圆周率,导致做出来的工具很快就坏了。可见后世人完全不知道祖冲之有了如此了不起的研究成果。

本人有下面几个猜测:ri08_01735_0164_p0030

  1. 可能古代算学家根本不重视圆周率。算个大概就不管了。古人的成果也压根没有人去看过。古代的科学基本没有传承。只有现代中国人才从古老典籍里挖掘出一点点古人的辉煌聊以慰藉。如果是这样,真的是很可悲的事。
  2. 《隋书》可能是造假的。唐朝人写的隋书原本早就在历史的尘嚣中烟飞云散了。宋朝刻印的《隋书》留下的又不全,只有残破的几章。目前能找到的最早版本有记载祖冲之圆周率的《隋书》,是明末的毛氏汲古阁本。是不是后人改的?如果是的话,恐怕更加的可怕。

让我们继续推测,祖冲之是怎么计算圆周率的?这已经成为了一个千古之迷。很多人猜测也是和阿基米德一样的割圆法。是的,这是最合理的猜测了,因为在公元400年的古代,割圆法只需要开方根和勾股定理的知识就可以计算。

借助现代的计算机,我们很容易可以模拟当年的先辈是怎么用外接割圆和内接割圆计算圆周率的:

s = 0.5
for i in xrange(n):
    s = (s*s+(1-(1-s*s)**0.5)**2)**0.5/2
t = (s*2/3)**0.5
for i in xrange(n):
    t = (t**2-((t**2+1)**0.5-1)**2)/t/2
r = 6*2**n
print r, s*r, t*r

这段简单的小程序不另作说明了,通过计算内接和外接割圆边长,我们分分秒就能计算出每一次切割能达到的圆周率精度,和计算过程中所需要保证的小数点后的精度个数:

n边形 到达小数点后精度 过程需要保持精度 结果
6 0 2 3.0<pi<3.4
12 0 3 3.11<pi<3.22
24 1 4 3.132<pi<3.158
48 1 5 3.1392<pi<3.1462
96 2 6 3.14102<pi<3.14268
192 3 7 3.141454<pi<3.141873
384 3 8 3.1415576<pi<3.1416626
768 3 9 3.14158389<pi<3.14161021
1536 5 10 3.141590466<pi<3.141597034
3072 6 12 3.1415921056<pi<3.1415937485
6144 6 12 3.14159251670<pi<3.14159292743
12288 6 13 3.141592619364<pi<3.141592722051
24576 7 14 3.1415926450333<pi<3.1415926707020

可以看到,阿基米德在公元前250年,通过切割96边形,那么他需要在计算过程中保持6位的小数点后精度,才可以计算出 3.14102<pi<3.14268 的结果。祖冲之在公元400多年,如果需要保留小数点后7位精度的圆周率精度,需要切割到24576边形,同时计算过程中要保持14位的小数点后精度!

下面再具体列举一下我们的革命好同志祖冲之计算圆周率之艰辛:

  1. 进行12次迭代(也有猜测是从4边形开始隔,这样只要11次迭代),每次迭代都需要计算3次平方根,若干次乘法除法,另外计算过程要保证14位的小数点后精度。
  2. 没有阿拉伯数字。无论计算过程用的是一二三还是壹贰叁,都麻烦的不得了。
  3. 没有算盘可以打。用的是算筹。把很多小树枝放在地上,拨过来拨过去的,拨错一个就完蛋。
  4. 没法合作完成。算法不能并行操作,没法团队完成,必须一个人自己默默的算。
  5. 至少得验算2-3次吧?历史上算错圆周率贻笑大方的人很多。能一次性算对的很难很难。
  6. 用的是毛笔。没有铅笔钢笔圆珠笔。不管是记录中间计算过程还是结果,都得用掉成百上千纸张。

好同志祖冲之如果真的算到第7位,目测按照当时的条件,怎么也得算个三年五载的。为了一个在当时没什么太大意义的高精度圆周率,耗费如此多的光阴,让人觉得有点匪夷所思。

如果是后人伪造《隋书》编造的 3.1415926 ,那么为何要伪造呢?这里也有一些背景知识需要阐述。

c2cec3fdfc039245010022028794a4c27d1e2502明末清初的年代,一个很著名的学派,是西学东源学派。随着越来越多的西方传教士不远万里来到中国,为了传教学会了中文,然后把一些西方科学著作翻译成了中文,其中最著名的是西儒利玛窦,让当时的学者们认识到了中西的差距已经大到可怕了。西学把日历能推算到秒,可以算出地球是个球体,知道地球的大概半径,能够制造精确的钟表。工艺技术的差别,天文地理的差别,基础数理的差别,让当时的学者们无法面对。

但是总是需要去面对的。面对的方式不是说努力学习西文典籍迎头赶上,而是很猥琐的鸵鸟策略。西学东源的主要思想是,你们西学研究的那些东西,我们老祖宗典籍里全都有了,不足为奇!这些学者依靠各种牵强附会的考证,想要证明西算(数学)和西历(天文学)都是剽窃的我们的老祖宗!这些可耻和可悲的考证成果就不一一说了。这个学派一直到清朝继续发扬光大,清朝皇帝康熙和乾隆一边焚书坑儒,编纂删改古籍,最后出了删改后的《四库全书》,一边组织文人搞西学东源运动,接见学派首脑,让这个学派继续发扬光大。恐怕直到北洋舰队被日本打的个落花流水,以及八国联军打进了北京城,才让当时的中国人真的觉醒,才让他们能够发现,中西方的差距已经实在是太大了,赶紧老老实实的“师夷长技以制夷”吧!(虽然最后也没能制得了夷)

在明末刻印的《隋书》版本,是不是有经过算家的修改,也不得而知了。真相早已掩埋在历史长河中。本文的目的也不是要考证祖冲之是不是算了圆周率,只是把一些证据陈列出来,信者自信疑者自疑吧。即使祖冲之确实算到了第7位,但是后世数学家们的表现也让人不禁感慨,古代对算学这些奇技淫巧的忽视。伟大的人物昙花一现,只有后世西学传入之后,才让人真正了解他们的伟大的地方。

随着电子计算机的诞生这几十年,圆周率的计算长度已经开始几百倍几千倍的增长了,每天都会有新纪录诞生。下一章我们回到正题,谈谈圆周率的常用算法。

 

 

圆周率之随笔(1)

有人说,爱像圆周率,无限不循。那么,读懂了圆周率,你就读懂了爱:简单而又深邃。(这其实是标题党,第一句总要吸引人吧)

圆周率的定义很简单:一个圆的周长除以直径,就是圆周率。然而,圆周率已在人类世界存在了千年,至今还有很多关于它的谜团存在。

Pi-unrolled-720从人类文明有记载开始,远古文明就开始用 π = 3来开始大致计算圆的周长了。如果你不幸被穿越到异世界,怎么确定这个世界的第一常量,圆周率呢?很简单,拿一根藤条,先在地上靠一个支点用固定半径画出一个圆,然后用同一根藤条对着周长比划一下,看看是不是 3 根藤条的长度然后多一点点。如果是,那么恭喜你,你至少在一个常量一致的异世界里!

622762d0f703918f1e9863ba513d269758ee3d6d55fbe449圆周率比3多一点点。多这么的一点点到底是多少?远古文明从人类诞生就开始了探索。公元前1900-前1600的古巴比伦人,在一块后来被发现的破泥板上刻下了圆周率大概是 25/8 = 3.125。这大概是有文字记载的最早的圆周率。与此年代悠久不相上下的是古埃及人,曾经在一张后世被拍卖成天价的破草纸上写下的公式:(16/9)= 3.1605。这个时代我们华夏的古老祖先,还在黄河流域治水灾,没有留下任何文字的烙印,只有一些口口相传的神话故事。中华文明直到大概是战国时期(年代不明,可能是公元前300左右吧)的《周髀算经》里,第一次提到过圆周率:“径一周三”。

Domenico-Fetti_Archimedes_1620

之后的某一天,地球上一个在树下被苹果或者梨砸中的天才忽然想,为什么不能用圆内接的多边形来计算圆的周长呢?最开始这位天才挑中了六边形,因为六边形是边长和半径相等的特殊多边形。然后通过分割,把六边形切成十二边形,然后是24、48、96边形。随着边越多,多边形的周长也就和圆的周长越来越接近了。这位天才就是阿基米德。这个计算方法就是割圆法。

通过计算了96边形的周长,阿基米德给出了 π 的范围:223/71 < π < 22/7 (3.1408 < π < 3.1429)。在公元前250年时代,这是一个极其惊人的成就!可以说,亚里士多德、阿基米德等先贤辈出的古希腊科学家,在距离现今的2000多年前(比我们想象的早很多的时候)就奠定了西方的科学基础,中西差距就此拉开,然后越拉越远。从那个远古时代,西方科学家的地位就变得无比崇高,科学的火种就此被点燃了,然后越燃越旺,最后迸发出难以想象的活力。

而相比之下,中国同时期战国时代的先贤的追求就很不一样。诸子百家都是周游列国为君王出谋划策,以实现他们的政治理想,不管他们是不是什么思想家、教育家,他们首先都是政治家。了却君王天下事,赢得生前身后名,是他们最大的心愿。孔子对国王说的是:“君君,臣臣,父父,子子”;相比之下,同一时期,地球另一边的欧几里得在给国王讲几何学,同时嘲讽国王太笨学的太慢:“在几何学里,没有专为国王铺设的大道”。其追求不同如云壤之别。

除了计算圆周率,牛人阿基米德还在各个领域都有跨时代的突破,以及留给后世诗人们传唱的数不尽的传说故事。其中最著名的一个,就是他在浴缸里洗澡,忽然想出了浮力定律,激动的冲出浴池去裸奔的故事。

300px-Archimedes_Heat_Ray_conceptual_diagram.svg做为皇亲国戚阿基米德,据说为人疯疯癫癫,可以从裸奔一事里窥见一斑。阿基米德的另一个著名传说故事是,为了防守祖国叙拉古城邦,让士兵用了很多很多面镜子,将罗马的海上无敌舰队全部点燃,导致罗马落荒而逃。这个故事是在400多年后(公元2世纪)出现在罗马诗人卢坎的诗集里。然而充满质疑精神的西方,后世有很多人做过各种实验怀疑这个故事的真实性。在1973年,希腊科学家组织过一次实验想要重复阿基米德的故事,之后在2005年麻省理工学院的学生,甚至在2010年12月,美国总统奥巴马都赞助组织过几次类似实验。所有实验结论证明,这个传说故事很可能是假的。古代的铜镜由于反射度不好,外加隔着这么远的大海,除非船只都在那里一动不动,否则很难被镜子点燃。更可能的是阿基米德用他发明的投掷车,远程投掷燃烧弹的办法打败了罗马舰队。

这里不禁感慨一下中西文化的差异之大。西方文化里,质疑先贤是时代进步的象征,阿基米德的故事都可以拿来推翻;而东方文化里,在孔子儒家的法先祖的教育下,崇拜先贤才是思想上正确的,质疑古人被认为是不敬不尊重。

可悲可叹这位伟大的天才人物,最后死在了一个率先攻入叙拉古的罗马士兵手中。阿基米德在看到很多罗马士兵冲进房间之后,依然疯疯癫癫的说:别动我的圆!随后,阿基米德死在了听不懂希腊语而恼羞成怒的罗马士兵手里(或者他听懂了希腊语,但觉得阿基米德是在表现科学家的高傲)。可见阿基米德临死前可能还在研究圆的问题!

一直到公元1400年以后,西方进入了文艺复兴时期,科学技术忽然开始了蓬勃发展,随之而来的是 π 精度日新月异的提高。奥地利人Christoph Grienberger在1630年用多边形法将 π 计算到了38位,这也是阿基米德发明的多边形法的终极记录。随后便进入了级数展开的圆周率新时代。

在中国,街头采访问祖冲之是做什么的?大多数人都会说,祖冲之发明了圆周率。还有某一次电视知识竞赛里,电视节目也给了类似问题:谁发明了圆周率?答案是祖冲之。这个问题应该怎么答?祖冲之和圆周率有什么关系?咱们下一篇再见!