标签归档:中西差异

从磕头说起

每每打开电视机,看见到处都是清宫辫子戏、穿越剧,四哥、八哥,满嘴奴才、奴婢,动不动下跪磕头请安,不禁感到反胃。

20101130141852846与世界其他民族的单膝下跪相比,中国人的跪有点特殊——双膝下跪。因为中国人的跪源于“正坐”这样一种双膝着地的坐姿,五胡乱华之前,中国人并不坐凳子,大家平时正坐着都是双膝着地,和现在日本人比较像。

而屁股撅老高,脸贴地磕头的这种君臣礼仪是何时开始兴起的呢?康有为有一句精辟的总结:“汉制,皇帝为丞相起,晋、六朝及唐,君臣皆坐。宋乃立,惟元乃跪,后世从之。”。可见跪礼的兴起是在蒙元时代。当时的跪拜在蒙古人的高压统治下,变得不可收拾,从原本最庄重的谢礼,变成了见面礼,见到级别比自己高一点的官员就要下跪。“崖山之后,已无中国”,在南宋的崖山之役之后,汉人失去了最后的一点抗争勇气,丧失掉了民族之魂,从此衰败。

在汉人最后一个王朝,明朝里,跪礼总算有了改良,只是在官员三年一次的觐见,或者殿试等庄重场合。然而,受到蒙古人奴役摧残的汉人,在汉人王朝里,依然显示出了野蛮暴力的一面,继承了蒙古人带来的两种刑法:廷杖、凌迟。不管如何的光怪陆离、礼崩乐坏,大明依然是汉人最有血性最刚烈的王朝。一不搞和亲,二不签条约,谁不服,打痛为止。天子守国门,君王死社稷。当崇祯留下“任贼分裂,无伤百姓一人”的豪言自缢殉国的时候,他不会想到,三百年后同样的亡国之君溥仪却在舔倭寇的屁眼,卖国求荣。皇帝都在卖国,匹夫有爱国的理由吗?

在汉人被满人奴役之后,一切都变了。留发不留头全民带辫子;磕头变成了见面礼;君王可以动不动把大臣拉去砍了;满臣自称奴才;而汉臣连称奴才的资格都没有!

对于把蒙古的元朝和满族人的清朝当成中国人华夏自己的朝代,实在是有待商榷的。首先两朝的官方语言都不是汉语。蒙古皇帝从来都不懂汉语。满族皇帝虽然会说汉语,但是官方文件以及外交签署的协议,比如尼布楚条约,也都只有满语版,没有汉语版。中国这片土地其实是蒙古人和满族人被征服被奴役的殖民地。蒙古人的成吉思汗不是中国的成吉思汗,满族人的皇太极也不是中国的皇太极。可以想象,如果日本当年侵华成功,日本人在中国领土上建立的新帝国,也不能算是中国的帝国。印度人被大英帝国殖民奴役了几百年,也没见人家印度人厚着脸皮在历史书里说一句,“我们当年的伟大王朝大英帝国日不落是如何的厉害”之类。

事情过去了几百年,现在的中国只记得日本人的侵略,却忘掉了满族人当年做过的事了。甚至于受政治导向影响,还有歌颂清朝圣皇丰功伟绩什么再给我五百年的各种电影电视剧在进行洗脑教育。让我们来看看除了磕头跪礼之外,满族人还做了什么:

20111231213143-304892087满族人对包括汉族的所有其它民族对进行了野蛮大屠杀:

  • 入关后满清把近两亿汉人屠杀到了四千万。扬州十日、嘉定三屠。除此之外还有四川、东北、广州大屠杀。在以后的近三百年来,大规模的屠杀更是一起接着一起,受害者比以往两千年历次屠杀加起来都要多。更加比抗日战争里的死亡人数要多的多。
  • 满清对蒙古族厉行减丁政策,蒙古各部只要超过男丁上限,那么就要靠抽签来杀死多出来的男丁以进行减丁。这种无差别屠杀甚至包括爱新觉罗家族的铁杆科尔沁蒙古,科尔沁蒙古的男丁上限是八万,顺治和儿子康熙屠杀起科尔沁来也是一样不客气。短短四十年里,仅科尔沁蒙古的男丁,他们父子俩就屠杀了三十万。
  • 满清对回族各部进行了持之以恒地种族灭绝工作,并制定了“以回牵汉,以汉制回”的政策,极力挑拨种族仇恨。鼓励回汉种族仇杀。这个影响到今日还没有消除。

满族人对汉族人的文字,以及文明,进行了长达二百多年的灭绝:

  • 明朝有着辉煌的音乐艺术成就以及科学发现和探索,比如十二平均律就在明朝被提出,比如中医也第一次提出人是用脑而不是用心在思考——不过它失去了进一步发展地机会,因为这些新理论被满清禁毁了。明朝翻译了几何原本……明朝的妇女都知道地球可能会是圆地并为此展开争论、还为此写下笔记……明朝有人准备写下技术书籍,介绍如何炼钢炼铁——这些书籍都被满清禁毁了。
  • 顺治平均每年发动一次文字狱。他儿子康熙平均每五年一次,他孙子平均每两年一次,而他重孙子乾隆,竟然平均每年发动两次文字狱!
  • 1061文字狱搞黑名单显得很不过瘾。乾隆准备好了白名单——四库全书,宣布华夏只有三千本书是可以存在的!禁毁而留书名则有近七千本,至于禁毁而不留书名的更是不计其数——天啊,不要说煌煌两千年华夏。仅在明朝、仅天启皇帝批准刊行的书籍就有两万余本!大量的古籍在清朝绝版。大量的祖先留下的文字咱们再也看不到了。
  • 四库全书里对大量文字进行了篡改,其中有史书,甚至各种文学作品包括岳飞的满江红。直到如今我们看到的古籍中,如果找不到清朝以前的版本,也很难找出来哪些是没有被满族人修改过的。
  • 翻开满清的历史,除了“屠杀”外能看见的就只有两个词:愚昧、卖国——从满清开始。直到1911年辛亥革命前,世界史上再也没有一个中国籍科学名人、没有哪怕一项属于中国的技术发明;这个政权在二百多年的统治期间,竟然签了一千一百个卖国条约,平均每年要签三个!

让我们回到下跪这个话题,来看看愚昧又野蛮的满清是如何对待外国人的。这里不得不先说一说,外国人最初是怎么看东方的。

早在15世纪,欧洲就流传了一本包装成游记的小说《马可·波罗游记》。这本书首先不是马可·波罗写的,再次,马可·波罗这个人是否存在都存疑,最后,这本书作者压根就没去过东方,完全是道听途说。但是架不住书里写的美好:在伟大的蒙古大汗统治下的东方遍地是黄金,如果人间有天堂,如果圣经里的伊甸园真的存在,那么它就在东方。这本书影响了整整几代欧洲人,成为欧洲销量仅次于圣经的畅销书。

e1c0d0a366b027935c02fe49350269cd欧洲人看了《马可·波罗游记》就起了来东方掠夺的想法么?和中国历史书的说法恰恰相反,当时他们看书的时候是自惭形秽的。直到18世纪末,大英帝国初步建立了日不落帝国的地位,一直渴望和强大中国结交的乔治三世开始觉得自己是不是有资格了?于是他派出了马噶尔尼伯爵组建了庞大的使团,光礼品就花了整整一年时间准备,总计价值达到当时的一万三千英镑,装了整整六百箱。英国认为这份礼品能够显示出欧洲的工业革命成果,先进科学技术,并且能给东方皇帝一些启迪。这些礼品包括:完整的蒸汽机、棉纺机、梳理机、织布机、欧洲最先进的天体运行仪、当时世界上最精确的地球仪、英国当时最先进战舰——君主号的模型、榴弹炮、卡宾枪、连发手枪、步枪、现代炮兵装备、赫哲尔望远镜、一套英吉利大型图册、秒表、热气球、车辆、油画。

可以这样说,这些礼品的集合,相当于大英帝国把自己的科技博览会开在了满清的国门之下!经过几个月的航行,这样一支满载着友善和诚意的使团终于到达了东方,然而面对他们的是一次非常尴尬的鸡同鸭讲的接触。

db7321f429bcbadef2d38595当时马噶尔尼伯爵想给乾隆宠臣福康安表演欧洲火器操,检阅带来的英国使团卫队,演习新式武器,福康安的回应是:“看亦可,不看亦可。这火器操法,谅也没什么稀罕”。陪着使团而来的热气球驾驶员,居然连一次热气球升空的机会也没有给。更让英国人想不到的事情是,他们带来的让他们引以为傲的代表先进文明的礼品,乾隆为了表示蔑视,把他们都堆放在一间厕所里。他们最后也没有想到,让乾隆不高兴的原因,就是因为马噶尔尼伯爵没有对他行三拜九叩大礼,只是做了欧洲拜见君主用的单腿下跪礼。

在回到英国之后,马噶尔尼在文字中评价愚昧又野蛮的满族人道:“中国自满洲鞑靼占领以来,至少在过去一百五十年里没有进步,或者更确切的说反而倒退了。”“满洲人打仗爱用弓箭,当我告诉他们,欧洲人已放弃弓箭而只用来复枪打仗时,他们愕然不解,认为在奔驰的马上射箭,比站在地上放枪豪迈。”。

之后的阿美士德使团也遇到了类似问题。当时的嘉庆帝特意在阿美士德进京前,对使团进行三拜九叩的培训,并且要随时给嘉庆汇报培训的进展和英使团的态度。这个举动又遭到了阿美士德的坚决反对。最后谈判的结果是,阿美士德也只同意行单膝下跪礼。于是这次外交又遭到失败。

俄罗斯人还有更早关于下跪的故事。1676年,斯帕法里率领俄罗斯使团进入中国境内,为确认身份,拿出康熙写给沙皇的信件,大批满清官员如遭雷击,面向康熙的手谕齐刷刷跪倒在地,令斯帕法里目瞪口呆。他在后来的《中国札记》里写道:“他们竟有如此不分场合的、奴隶般的举止,实在是我所见过的最为卑贱的鞑靼。鞑靼的政府由一群奴才组成,他的国民羸弱不堪……鞑靼皇帝丝毫没有什么可惧怕的。”

哲学家罗素后来评价磕头事件,说道:“当我们不把磕头当作一件可笑的事情时,我们才能真正了解中国”。英国报纸评论说:“这就是中国人,昔日人类无与伦比的精英,今天已沦为人类学研究的怪物。”。愚昧的满清用“磕头外交”拒绝了一个又一个带着友好和诚意来的欧洲使团,最后自绝于舰队和炮火之中。

1315786837_PFKsyX书页翻回现代,在如今新社会下,屡屡还有中国人要恢复磕头这一鞑子皇帝强行奴化汉人而推行的“古礼”。继2007年“疯狂英语”的推广者李阳闹得沸沸扬扬的学生集体“下跪”事件之后,2008年1月20日,央视播出了这样一幕:著名学者季羡林正襟危坐,接受弟子钱文忠的跪拜大礼;2月11日,笑星赵本山公开举行收徒仪式,接受35位徒弟的集体跪拜。更有之后的老中医接受徒弟跪拜收徒等等。

有人用自由来给下跪辩护,认为下跪是徒弟们的自由选择。在完全自愿的情况下,跪拜并不违反法律,看上去除了当事人,并没对其他人造成影响或损害,但是否违背了自由的原则呢?一个,或几十个、上千个学生集体下跪,严重损害学生人格尊严,破坏现代教育的核心价值:人格的独立和平等。这是对社会基本道德规范的挑衅。一切道德和法律的建设,最终服务于人的自由。即使学生完全出于自愿跪拜,也无法改变这个事实:对人的自由属性的侵犯。

蒙古和满族鞑子带给中国人的,经过了几百年时间的沉淀,就剩下了奴化和愚昧,而做为当代中国人,要找回崖山之后就丢掉的民族之魂,需要走的路还很多很多。

 

圆周率之随笔(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位,这也是阿基米德发明的多边形法的终极记录。随后便进入了级数展开的圆周率新时代。

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