鄒暢根 鄒源清
(南京市北京東路小學(xué) 210008)
兒子幼兒園畢業(yè)后,帶他到南京東郊風(fēng)景區(qū)去玩,在景區(qū)的歷史文化展覽館,我們看到了祖沖之的雕像及關(guān)于他的介紹.我開玩笑讓小孩拜祖沖之為師,記住圓周率π在3.1415926到3.1415927之間,并要求他在7歲之前搞清π的含義.
為了搞清楚π,我?guī)『⒁黄鹩眉?xì)線量了樹干的周長,并在陽臺上畫了個(gè)半徑為1米的半圓如上圖,用細(xì)線測量π的值(誤差巨大).
原本要求小孩能理解圓周率π為圓的周長除以直徑,但后來發(fā)現(xiàn)這個(gè)要求太低,我改變計(jì)劃,要求他能用計(jì)算器算出π.
在小孩上小學(xué)一年級的時(shí)間里,教了他簡單的四則運(yùn)算,以及三角形特征、勾股定理等簡單的幾何學(xué)知識,重點(diǎn)是要小孩初步理解這些基礎(chǔ)知識,以便能理解祖沖之用割圓術(shù)計(jì)算圓周率的方法.
祖沖之采用更早的數(shù)學(xué)家劉徽的割圓術(shù)如右圖,以圓內(nèi)接正多邊形的面積及其外加一個(gè)矩形面積之和,雙向逼近圓的面積.
假設(shè)半徑為1的圓,它的內(nèi)接正n邊形的邊長AB為Xn、面積為Sn,內(nèi)接正2n邊形的邊長BC為X2n、面積為S2n,假設(shè)三角形ABC的面積為S△ABC,矩形ABEF的面積為S四邊形ABEF,圓的面積為S,那么
n·S△ABC=S2n-Sn,
n·S四邊形ABEF=2·(S2n-Sn)
由于圓的面積大于圓內(nèi)接正2n邊形面積、小于圓內(nèi)接正n邊形面積加n個(gè)矩形ABEF的面積,所以S2n
利用三角形面積公式,可以計(jì)算出四邊形AOBC的面積為AB·OC/2,所以
S2n=Xn·n/2 ,Sn=Xn/2·n/4 ,
因此圓周率π的范圍如下:
Xn·n/2<π 由于籌算比較費(fèi)時(shí)費(fèi)力,生于數(shù)學(xué)世家的祖沖之很清楚節(jié)省運(yùn)算量的重要性.上述推理僅用到了勾股定理,祖沖之利用數(shù)學(xué)家劉徽的割圓術(shù)計(jì)算圓周率,應(yīng)該很容易推出上述運(yùn)算量最少的計(jì)算方法,但越不過多位數(shù)的開方. 我們準(zhǔn)備用計(jì)算器開方來算出π,但是失敗了,用計(jì)算器居然無法計(jì)算出祖沖之算出的π,經(jīng)仔細(xì)分析后發(fā)現(xiàn),使用的計(jì)算器是12位的(例如3.12345678901,總計(jì)12位)、精度不夠,因此決定在網(wǎng)上買個(gè)16位的計(jì)算器. 網(wǎng)購的計(jì)算器需要3天后才能到貨,期間正好夾了個(gè)星期六和星期天,我決定帶兒子一起分析祖沖之是如何做運(yùn)算的. 經(jīng)互聯(lián)網(wǎng)搜索發(fā)現(xiàn):祖沖之生活的年代已經(jīng)用十進(jìn)制計(jì)數(shù),但阿拉伯?dāng)?shù)字還沒被傳入中國,算盤也沒有被發(fā)明出來,計(jì)算工具是小棍子,這些小棍子稱為算籌,用算籌做運(yùn)算的過程稱為籌算.祖沖之寫了一本書叫《綴術(shù)》,其中記錄了對圓周率的研究及成果,但后來這本書失傳了,祖沖之如何精確計(jì)算出圓周率成為未解之謎.小孩和我用計(jì)算器都算不出祖沖之用小棍子算出的π,我們更加佩服祖沖之!中國科協(xié)主辦的《科技導(dǎo)報(bào)》2008年第5期上,將“祖沖之究竟是怎樣計(jì)算出圓周率π值的?”列為公眾關(guān)注的18個(gè)未解科學(xué)難題之一.互聯(lián)網(wǎng)上有不少分析祖沖之是如何計(jì)算π的內(nèi)容,絕大部分都認(rèn)為計(jì)算很困難.祖沖之計(jì)算π真像有些文章描述的那樣“一雙手被磨出了厚厚的老繭”嗎?我決定帶兒子用小棍子來試一試. 我們在擺弄小棍子的過程中,16位計(jì)算器到貨了,借助于它幾分鐘就能將π算到祖沖之算出的3.1415926.經(jīng)過幾天的探索,我們發(fā)現(xiàn)用割圓術(shù)計(jì)算π的工作量遠(yuǎn)遠(yuǎn)沒有人們想象的那么大,如果不考慮探索研究的時(shí)間,在計(jì)算不出錯(cuò)、動(dòng)作快等前提下,籌算一兩天就能將π計(jì)算到祖沖之所達(dá)到的精度. 一個(gè)小于1的小數(shù)△的平方,例如0.052比0.05小很多,將它除以一個(gè)大于1的數(shù)之后則變得更小,假設(shè)對A開方,有個(gè)大于1的數(shù)B,B2與A接近、差值為△,則可以用如下逼近方法計(jì)算: ≈B+△/2B=B+λ. 利用上面的逼近方法,每次將B的精度多提升1個(gè)小數(shù)位、步長為λ,A的逼近值每次都可以精確計(jì)算出來,其值為B2+2·λ·B+λ2,每次逼近僅需對原值做2·λ·B+λ2修正,運(yùn)算量很小、而且很適合籌算.古代算籌可以有些變異,例如有人將小棍子染成不同的顏色、或采用不同的放置方法避免出錯(cuò),但實(shí)質(zhì)都是一樣的.在本文中,算籌采用如下方法表示0 ~ 9這10個(gè)數(shù)字. 為了便于用算籌做開方運(yùn)算,需要對開方過程中用的數(shù)值描述如下: 1.被開方值A(chǔ); 2.A的逼近值,“A的逼近值_前”為前一次的逼近值,“A的逼近值_后”為本次逼近運(yùn)算后的值; 3.開方值B,“開方值B_前”為前一次逼近的開方值,“開方值B_后”為本次逼近運(yùn)算后的值,它的平方精確等于“A的逼近值_后”; 4.除數(shù)D,對2·B(用開方值B_前)做四舍五入取整(或取2·B的整數(shù)位加1)得到除數(shù)D,取值范圍為4、5、6、7、8、9、10這7個(gè)數(shù)值之一(請看下面第7小點(diǎn)說明); 5.差值△,為被開方值A(chǔ)減去“A的逼近值_前”,可能為正或負(fù),以“開方值B_后”小數(shù)點(diǎn)最后一位為參考位,將被開方值及其逼近值做四舍五入取整后,再計(jì)算它們的差值; 6.步長λ,為△除以D后再做四舍五入取整,一般情況下λ小于等于5.由于D、△、λ都做了取整,因此有可能出現(xiàn)少量的情況下λ大于5,此時(shí)需要在不增加開方值B小數(shù)位的基礎(chǔ)上再做一次逼近,降低被開方值與其逼近值的差值,以避免λ超過5而引入2位數(shù)的乘法運(yùn)算(當(dāng)然,λ大于5也沒有關(guān)系,只是籌算2·λ·B略有不便); 7.上述開方運(yùn)算,對于區(qū)間 [ 3,25 )內(nèi)的任何數(shù),開方時(shí)僅會(huì)涉及到2位數(shù)除以1位數(shù)的除法以及多位數(shù)乘以1位數(shù)的乘法(乘除10因?yàn)楹芎唵尾挥?jì)入2位數(shù)乘除法).對于其他情況:區(qū)間(1,3)內(nèi)的數(shù)值可以先乘以4之后再開方;區(qū)間(25,100)內(nèi)的數(shù)值可以先除以4之后再開方;區(qū)間(0,1)內(nèi)的數(shù)值可以先乘以10的偶次方之后再開方;100以上的數(shù)值可以除以10的偶次方之后再開方. 只需要用2位數(shù)除以1位數(shù)的除法計(jì)算出步長λ及多位數(shù)乘以1位數(shù)的乘法、多位數(shù)的加減法,即可以按需要將開方的精度提升到任何所需的位數(shù),這樣的運(yùn)算對籌算而言比較簡單.下面舉例利用割圓術(shù)計(jì)算π過程中需要開方的一個(gè)數(shù),例如3.732050807568877,利用籌算對它進(jìn)行開方運(yùn)算,這是一個(gè)16位精度的數(shù),對它開方后也要精確到小數(shù)點(diǎn)后15位. ·開方值整數(shù)位計(jì)算 B取2最接近;A的逼近值為4. ·開方值小數(shù)點(diǎn)后第1位計(jì)算 如下圖,逼近值大于被開方值,步長λ為負(fù),除數(shù)D=2·B=4, 差值△≈40-37=3, λ=△/D≈3/4,取λ=1, 2·λ·B=2·1·2=4, λ2=1, A的逼近值變?yōu)?4-4·0.1+1·0.01=3.61, B變?yōu)?2-1·0.1 = 1.9. ·開方值小數(shù)點(diǎn)后第2位計(jì)算 如下圖,逼近值小于被開方值,步長λ為正,除數(shù)D=2·B≈4, 差值△≈73-61=12, λ=△/D≈12/4, 取λ=3, 2·λ·B=2·3·1.9=11.4, λ2=9, A的逼近值變?yōu)?3.61+11.4×0.01+9×0.0001=3.7249, B變?yōu)?.9+3×0.01=1.93. ·開方值小數(shù)點(diǎn)后第3位計(jì)算 如下圖,逼近值小于被開方值,步長λ為正,除數(shù)D=2·B≈4, 差值△≈32-25=7, λ= △/D≈7/4,取λ= 2, 2·λ·B= 2×2×1.93=7.72, λ2=4, A的逼近值變?yōu)?.7249+7.72×0.001+4×0.000001 = 3.732624, B變?yōu)?.93+2×0.001 = 1.932. ·開方值小數(shù)點(diǎn)后第4位計(jì)算 如下圖,逼近值大于被開方值,步長λ為負(fù),除數(shù)D=2×B≈ 4, 差值△≈26-21=5, λ= △/D≈5/4,取λ=1, 2·λ·B=2×1×1.932=3.864, λ2=1, A的逼近值變?yōu)?.732624-3.864×0.0001+1×0.00000001=3.73223761, B變?yōu)?.932-1×0.0001=1.9319. 從上述籌算過程可以看到,開方過程僅會(huì)涉及到如下計(jì)算:2位數(shù)除以1位數(shù)的除法及多位數(shù)乘以1位數(shù)的乘法(乘除10因?yàn)楹芎唵尾挥?jì)入2位數(shù)乘除法),多位數(shù)的加減法.重復(fù)上面的運(yùn)算很容易開方到第15位小數(shù)的精度,特別是籌算加減法無需要像我們常用的豎式運(yùn)算那樣還要重復(fù)抄寫一些數(shù)字、對齊小數(shù)位也比較方便,因此熟練籌算之后,籌算速度有可能達(dá)到甚至超過我們用阿拉伯?dāng)?shù)字豎式運(yùn)算.我試過籌算一次16位精度的開方大約需要1小時(shí),祖沖之籌算的速度一定比我快很多,因此如果不考慮任何探索性時(shí)間開支,僅考慮最小運(yùn)算量的情況下,祖沖之最快一天就可以將圓周率重新算一次,確定它在3.1415926與3.1415927之間. 下圖用阿拉伯?dāng)?shù)字更符合現(xiàn)代人們的理解習(xí)慣,從圖中可以很明顯地看到開方的正負(fù)雙向逼近過程. 3.000000000000000 (計(jì)算 3.732050807568877 3.931851652578136 3.982889722747621 3.995717846477207 3.998929174952731 3.999732275819123 3.999933067834802 3.999983266888701 3.999995816717800 經(jīng)過12次開方,得到: =0.000000261455223, =0.000000065363807. 再經(jīng)過2次開方,得到: =0.000511326923797, =0.000255663464343. 利用前面推導(dǎo)出計(jì)算圓周率π的不等式: Xn·n/2<π 取n=24576,將X12288及X24576的值代入,可求得圓周率π的范圍: 3.141592649846784<π<3.141592679884800. 通過上述14次開方,計(jì)算出圓周率π介于3.1415926和3.1415927之間.上述計(jì)算結(jié)果都是我用16位精度的計(jì)算器算出的,計(jì)算過程保留小數(shù)點(diǎn)后15位,如果減少1位精度,那么計(jì)算出的圓周率上限值將超過3.1415927,因此祖沖之開方的時(shí)候最少要保留16位精度. 這個(gè)開方方法有點(diǎn)像二分法,只是引入步長λ評估從而一次增加1個(gè)小數(shù)位,同時(shí)充分利用了前面運(yùn)算的結(jié)果,每一步都確保開方值的平方精確等于被開方值的逼近值.與傳統(tǒng)手工開方法相比,它不需要多次試乘而引入多次乘法(通過試乘規(guī)避了解二次方程,但反復(fù)試驗(yàn)多位數(shù)乘1位數(shù)的運(yùn)算,會(huì)增加許多運(yùn)算量).這個(gè)開方過程雖然有較多次數(shù)的少位數(shù)加減法,但由于僅有2位數(shù)除以1位數(shù)的除法及多位數(shù)乘以1位數(shù)的乘法(乘除10因太簡單不計(jì)入2位數(shù)乘除),因此很適合原始的籌算(當(dāng)然也適合現(xiàn)代人用阿拉伯?dāng)?shù)字進(jìn)行手工開方).現(xiàn)代計(jì)算機(jī)的數(shù)字運(yùn)算,CPU實(shí)現(xiàn)多位乘除法(例如100位乘除100位)仍然具有困難,但實(shí)現(xiàn)多位的加減法卻可以較容易地變通實(shí)現(xiàn),利用上述開方方法,可用CPU快速實(shí)現(xiàn)多位數(shù)的高精度開方,在某些領(lǐng)域可能會(huì)有幫助,有興趣的讀者可以自行編寫這個(gè)高精度多位開方函數(shù). 為了說明籌算圓周率π不太困難,我拍了一個(gè)簡單的視頻影象放在互聯(lián)網(wǎng)上(www.iqiyi.com和www.youku.com),視頻的名稱為“兒子和我一起用小棍子精確計(jì)算圓周率”,內(nèi)含我和剛上完小學(xué)一年級的兒子用算籌(小棍子)進(jìn)行開方運(yùn)算,我假設(shè)祖沖之開方時(shí)精確到小數(shù)點(diǎn)后17位,讓小孩籌算一個(gè)18位有效數(shù)字(1個(gè)整數(shù)位,17個(gè)小數(shù)位)的開方值,精確到小數(shù)點(diǎn)后17位.