古中國數學家的計算力真是驚人


  版權申明:本文為博主窗戶(Colin Cai)原創,歡迎轉帖。如要轉貼,必須注明原文網址

  http://www.cnblogs.com/Colin-Cai/p/8367610.html 

  作者:窗戶

  QQ:6679072

  E-mail:6679072@qq.com

  現代數學是建立在公理化的體系之上,可以認為是形而上學。公理化是數學的本質所在,古代中國人建立過數學的輝煌,但是卻似乎並沒有去思考數學的本質,而古希臘的《幾何原本》是人類有史以來記載的最早數學往公理化方向努力,盡管《幾何原本》中存在着公理的不完備,證明過程中依然有”想當然“的成分,比如直線上除某點之外的一點(幾何原本中並沒有公理支持直線上除了某點之外還可以取一點),但是往公理化運行的這個歷史意義巨大。

  很長時間,我都不太認為古代數學有哪些驚人,只是還知道勾股定理,楊輝三角,以及祖沖之算圓周率等。

  今天老婆問我圓周率怎么算的,我就想了想。雖然圓周率可以有一堆無窮級數或者無窮乘積可以表示,我還是選擇了用最簡單的方式來回答,於是就直接行動起來吧。

  選擇一個單位圓,x2+y2=1,它的面積就是pi,於是用微積分逼近的方法來做,分成n等分,然后用上和或者下和逼近。當然要考慮精度問題,所以還是用上bc這個任意精度計算器,這個計算器我一直很喜歡使用,一邊跟老婆解釋一邊寫程序,程序很快寫完。

scale = 12;/*所有計算精度小數點后12位*/
n = 10^6;/*單位圓切200萬刀,y軸左右各100萬刀*/
pi = 0;/*上和累計初始值為0*/
for(i=0;i<n;i++) {
        x = i/n;/*x坐標*/
        y = sqrt(1-x^2);/*y坐標*/
        s = 4*y/n;/*此塊上和,4個象限對稱4份*/
        pi = pi+s;/*累和進去*/
}
print "pi = ", pi, "\n";/*最終打印出累和出來的圓周率*/

  用bc運行一下,我的虛擬機24秒后有了結果。

# time bc <2
pi = 3.141594151717

real    0m24.015s
user    0m24.006s
sys     0m0.008s

  結果並不是很理想,計算精度12位其實只是影響了一點點累和時的精度問題,完全不是祖沖之的3.14159265級別的問題。

  於是換條路吧,祖沖之的割圓術應該是對周長的,於是我就分它個215=32768份,成為一個32768邊形,邊長其實是2*sin(2*pi/32768),我們就來算這個值吧。sin(2x)=2sin(x)*cos(x),因為是銳角,可算出sin(x)=sqrt((1-sqrt(1-cos(2x)*cos(2x)))/2)。

  繼續用bc來寫,

n=13;/*從圓的內接正方形開始,開始對切13次*/
scale=20;/*紀念20位足夠*/
s=sqrt(2)/2;/*sin(pi/4)*/
for(i=0;i<n;i++) {
        s = sqrt((1-sqrt(1-s^2))/2);/*一個個的推*/
}
print "pi = ", 4*s*2^n, "\n";/*打印圓周率*/

  運行一下,這次對於計算機就很快了,長度法比面積法靠譜,

# time bc <3
p = 3.14159264877598965760

real    0m0.007s
user    0m0.004s
sys     0m0.004s

  可是,精度還差那么一點,看來應該多切一刀,把程序中的n改成14,精度符合要求。

# time bc <3
p = 3.14159265238350561280

real    0m0.005s
user    0m0.000s
sys     0m0.004s

  

  這樣的開平方運算用手算是很復雜的,參考我的博文《平方根的C語言實現(二) —— 手算平方根的原理》,我無法想像祖沖之如何面對這么復雜的運算的。中國古人雖然可能對於數學的基本原理沒有做深層次的考慮(不排除以前考慮過,但資料丟失的可能,畢竟經過了嬴政和劉徹和那么多的朝代),但至少古人的計算能力真的是很讓人震撼。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM