偽·從零開始學算法 - 2.3 求圓周率

2020-12-03 銀蛇蠟象

本文為圓周率日特輯~

簡介

圓周率π是一個圓的周長與直徑之比。即:π = C / d 。它是一個無限不循環小數,即無理數。

據說遠古時期的人們根據經驗以3作為圓周率的值(「徑一周三」),這個值至今也能夠用於一些對精度要求不高的場合(如手工做木桶)。但是,對於天體運行和面積測量等方面,3這個值未免太粗略。人們對於它的計算絕不僅限於此。

古埃及、古巴比倫、古印度、古代中國的遺蹟中都能夠找到關於圓周率的較精確的值,它們都能夠達到3.1這個值。實際上,絕大多數情況下,那時的人還是把它當作有理數來計算的。總之,那時的計算可能仍然屬於觀測值加以擬合。

割圓術

割圓術是第一個有紀錄、嚴謹計算π數值的算法。

一般來說,它是通過計算圓內接正多邊形和/或圓外切正多邊形的周長的方式來計算圓周率。隨著正多邊形的邊數增長,其形狀越接近圓,因此可以據它的周長或面積計算圓周率。理論上來說,它可以計算任意精度的圓周率的值。

目前所知最早這麼做的是約公元前250年的阿基米德。阿基米德的算法是在計算圓的外切正六邊形及內接正六邊形的邊長,以此計算π的上限及下限,之後再將六邊形變成十二邊形,繼續計算邊長……,一直計算到正96邊形為止。由此,他計算出π的值在223/71和22/7(3.140845…和3.142857…)之間。

此後的託勒密等人也使用割圓術來計算圓周率,但他們是單向迫近,不如阿基米德的雙向迫近精確。

三國時期的中國,劉徽也創立了割圓術。與之前不同的是,他的理論是數學史上最嚴謹完備簡潔的割圓術:使用極限論來論證割圓術的正確性;雙向迫近。

割之彌細,所失彌少。割之又割,以至於不可割,則與圓周合體而無所失矣。

與阿基米德相似,劉徽也是從正六邊形開始計算的。不同的是,劉徽以面積來計算。他自己通過分割圓為192邊形,計算出圓周率在3.141024與3.142704之間,取其近似值157/50。

劉徽割圓術原理

在下圖中可以發現,如果計原多邊形(黃色部分)面積為S1,新的多邊形(黃色+綠色部分)面積為S2,圓面積為S,那麼新的多邊形與原多邊形的面積之差(綠色部分)為S2 - S1,矩形ABCD的面積和為2(S2 - S1)。則有:

S2 < S < S2 + (S2 - S1)

S2 < S < S2 + 2 * (S2 - S1)

劉徽圓周率不等式示意圖

後來劉徽發明一種快捷算法,通過新的多邊形與原多邊形的面積之差近似成等比級數來計算,可以只用96邊形得到和1536邊形同等的精確度,從而得令他自己滿意的3.1416。

南北朝的祖衝之,運用劉徽的算法,繼續分割到12288邊形,求得24576邊形的面積,得3.14159261864 < π < 3.141592706934,精確到了小數點後七位,保持了世界最準確圓周率達900年之久。此後他又算出來兩個比較簡單的近似值:約率(22/7 > π)和密率(355/113 > π)。

至於割圓術的算法,簡要解釋如下:

割圓術

設上圖中圓半徑為1,弦心距為hn;正n邊形的邊長為xn,面積為Sn。由勾股定理,得

得x6 = 1。

而且我們可以得到,正2n邊形面積等於正n邊形面積加n個等腰三角形的面積,即

隨著n的增大,S(2n)不斷趨近於π。

於是我們可以據此編制割圓術的算法:

割圓術(1)

據此求在正n邊形下,圓周率的下限和上限:

割圓術(2)

割圓術在16~17世紀之前一直都是精確計算圓周率的解決方法。奧地利天文學家克裡斯託夫·格林伯格在1630年用10^40邊形計算到第38位小數,至今這仍是利用多邊形算法可以達到最準確的結果(當然,是人工的情況下,我在測試算法的時候,僅用53.6 ms就能計算到小數點後100位)。

無窮級數

16世紀及17世紀時,π的計算開始改用無窮級數的計算方式。但是,公式並不是唯一的。1735年,歐拉解決了巴塞爾問題,得到了關於π的一個非常精妙的公式(可能很多人都知道):

算法如下:

歐拉的公式推導的算法

i越大,結果越精確。

此外,還有萊布尼茨公式、尼拉卡莎級數等一系列級數。但是許多級數的收斂速度很慢,萊布尼茨公式要到500000項之後,才會精確到π的第五位小數。

萊布尼茨公式
尼拉卡莎級數

印度數學家斯裡尼瓦瑟·拉馬努金在1914年發表了許多與π相關的公式,這些公式十分新穎,極為優雅而又頗具數學深度,收斂速度也非常快。

以下為一例:

第一位使用拉馬努金公式計算π並取得進展的是比爾·高斯珀,他在1985年算得了小數點後一千七百萬位。

拉馬努金公式開創了現代數值近似算法的先河。,此後波爾文兄弟和楚德諾夫斯基兄弟進一步發展了這類算法。後者於1987年提出了楚德諾夫斯基公式,如下所示:

此公式每計算一項就能得到π的約14位數值,因而被用於突破圓周率的數位的計算。利用該公式,有人已經計算到小數點後第一萬億位。

但是很顯然,這些公式已經變得非常複雜,難以記憶(雖然沒有多少人需要記這個的)。

迭代算法

二十世紀中期計算機技術的發展、革新再次引發了計算π位數的熱潮,除了之前的無窮級數,利用迭代算法計算圓周率的方法也被提出。

迭代算法因為收斂速度比無窮級數快很多,在1980年代以後廣為使用。無窮級數隨著項次的增加,一般來說正確的位數也會增加幾位,但迭代算法每多一次計算,正確的位數會呈幾何級數增長。

有一個比較有名的算法是高斯-勒讓德算法,於1975年被理察·布倫特和尤金·薩拉明獨立發現。日本筑波大學於2009年8月17日宣布利用此算法計算出π小數點後2576980370000(2.58萬億)位數字。知名的電腦性能測試程序Super PI也使用此算法。

該算法的步驟如下:

第一步:設置初始值:

第二步:反覆執行以下步驟直到an與bn之間的誤差到達所需精度:

則π的近似值為:

流程圖如下:

高斯-勒讓德算法

它以迅速收斂著稱,算法每執行一步正確位數就會加倍,只需25次迭代即可產生π的4500萬位正確數字。不過,它的缺點是內存密集。

蒙特卡羅方法

前面介紹的是靠計算得出的方法,但這個卻與概率與統計有關。

蒙特卡羅方法(Monte Carlo method)是以概率統計理論為指導的一類非常重要的數值計算方法,通過進行大量重複試驗計算事件發生的頻率,按照大數定律,可以求得π的近似值。

布豐投針問題就是其中一個應用的例子。當一枚長度為l的針隨機地往一個畫滿間距為t(l ≤ t)的平行線的平面上拋擲n次, 如果針與平行直線相交了m次,那麼當n充分大時就可根據以下公式算出π的近似值:π≈(2nl)/(mt)。

布豐投針問題

另一個例子是隨機地往內切四分之一圓的正方形內拋擲大量的點,落在四分之一圓內的點的數量與拋擲點的總量的比值會近似等於π/4。

蒙特卡羅方法

我們以第二個例子為例,如果要編制算法,我們可以使用解析幾何的方法,把「隨機地往正方形內拋擲大量的點」轉化為「定義一個點,該點的橫坐標和縱坐標取[0,1]範圍的隨機數(兩坐標不一定相同),重複若干次」,把「落在四分之一圓內」這個條件轉化為「點是否在x^2+y^2=1內」。於是得下面的流程圖:

蒙特卡羅方法流程圖

它的缺點也很明顯:隨機、不精確。

結語

還有很多算法,在此我就不一一列舉了。

最後我放上一張圖,以展示π的計算的發展。

(當數學家發現新的算法、電腦變得普及時,π的已知小數位急劇增加。注意垂直坐標使用了對數坐標)

一般而言,π值並不需要過於精確便能夠滿足大部分的數學運算的需求。按照約爾格·阿恩特(Jrg Arndt)及克裡斯託夫·黑內爾(Christoph Haenel)的計算,39個數位已足夠運算絕大多數的宇宙學的計算需求,因為這個精確度已能夠將可觀測宇宙圓周的精確度準確至一個原子大小。但是大家仍然對π的計算樂此不疲,這有很多原因,但計算π的本身讓我想起了一個故事:

有人問英國登山家喬治·馬洛裡為何想要攀登珠穆朗瑪峰。他回答說:「因為山就在那兒。」

參考資料

圓周率 - 維基百科,自由的百科全書圓周率計算年表 - 維基百科,自由的百科全書割圓術 (劉徽) - 維基百科,自由的百科全書普通高中課程標準實驗教科書(必修) 數學(A版) 必修3. 人民教育出版社高斯-勒讓德算法 - 維基百科,自由的百科全書

相關焦點

  • 偽從零開始學算法 - 2.2 求最大公約數
    但是計算機可以從1開始,判斷某個整數是否能整除所有給定的數。如果能,即為公約數,記下來;否則,除數加1,再試。但是,算法是有限的,到什麼時候停止呢?根據常理,一組數的最大公約數一定不大於這組數的最小的數。因此,如果算到這組數的最小值的話,就不用再算下去了。由此可以推導出流程圖如下:
  • 圓周率的故事
    圓周率的開始在公元前3世紀,古希臘的阿基米德就成功利用割圓法求得π的值介於3.14163和3.14286之間,這個數字成功的算對了小數點後三位。而在此之前π的值總是被默認為3。當把 π 定義為周長和直徑的比值後,如何進一步計算圓的面積呢?通過推導,可以得到半徑為 r 的圓的面為 πr^2, 但這個結論又如何被證明呢?
  • 數學之美(2)——圓周率的故事
    一、割圓術(劉徽)作圓的內接正多邊形,不斷倍增圓內接正多邊形的邊數求出圓周率的方法,這個工作量非常龐大,且用尺規作圓內接正多邊形有諸多限制,導致精確度不高。二、布豐投針2) 取一根長度為0.5a的針,隨機地向畫有平行直線的紙上擲n次,觀察針與直線相交的次數,記為m3)計算n與m的比值.
  • 〖數學算法〗求圓周率的幾種算法
    下面就介紹幾種求圓周率的方法: 這是粗略的求圓周率一種常用算法在(0,0)和(1,1)範圍內隨機投test_sum個點,如果落到圓內,hit_sum數量加1,最後用hit_sum/test_sum算出落在圓內的概率,由得圓周率 PI=hit_sum / test_sum * 4public class PI {
  • 圓周率π的計算曆程
    在我國,木工師傅有兩句從古流傳下來的口訣:叫做:「周三徑一,方五斜七」,意思是說,直徑為1的圓,周長大約是3,邊長為5的正方形,對角線之長約為7。這正反映了早期人們對圓周率 π 和√2 這兩個無理數的粗略估計。東漢時期官方還明文規定圓周率取3為計算面積的標準。後人稱之為「古率」。  早期的人們還使用了其它的粗糙方法。
  • 圓周率兀會不會在1億億億……億位被除盡或者開始出現循環節?
    ,圓周率都不可能出現循環。   無理數的發現,最早可以追溯到古希臘時期,畢達哥拉斯的學生希伯索斯,發現√2無法寫成兩個整數之比,由此發現了第一個無理數,證明過程也相當簡單
  • Python有趣小知識——割圓法求「圓周率」(附學習資料)
    圓周率,一般以π來表示,是一個在數學及物理學普遍存在的數學常數。它定義為圓形之周長與直徑之比值。它圓周率π也等於圓形之面積與半徑平方之比值。是精確計算圓周長、圓面積、球體積等幾何形狀的關鍵值。2011年6月部分學者認為圓周率定義不合理,要求改為6.28。圓周率(Pai)是圓的周長與直徑的比值,一般用希臘字母π表示,是一個在數學及物理學中普遍存在的數學常數。π也等於圓形之面積與半徑平方之比。是精確計算圓周長、圓面積、球體積等幾何形狀的關鍵值。 在分析學裡,π可以嚴格地定義為滿足sin x = 0的最小正實數x。
  • 今天圓周率日 你一定背過3.1415926
    對於圓周率的研究,在人類歷史上很早就開始了。一塊古巴比倫石匾(約產於公元前1900-1600年)清楚地記載了圓周率 = 25/8 = 3.125。同一時期的古埃及文物,萊因德數學紙草書(公元前1650年左右)也表明圓周率等於分數16/9的平方,約等於3.1605。
  • 今天圓周率日:你一定背過 3.1415926
    對於圓周率的研究,在人類歷史上很早就開始了。一塊古巴比倫石匾(約產於公元前1900-1600年)清楚地記載了圓周率= 25/8 = 3.125。同一時期的古埃及文物,萊因德數學紙草書(公元前1650年左右)也表明圓周率等於分數16/9的平方,約等於3.1605。
  • 3月14日——國際數學節(圓周率日)
    圓周率日圓周率日是慶祝圓周率π的特別日子。正式日期是3月14日,由圓周率最常用的近似值3.14而來。通常是在下午1時59分慶祝,以象徵圓周率的六位近似值3.14159,有時甚至精確到26秒,以象徵圓周率的八位近似值3.1415926;習慣24小時記時的人在凌晨1時59分或者下午3時9分(15時9分)慶祝。
  • 3.1415926……圓周率你能背多少位?古代中國對圓周率的研究
    至少在公元前1千年,這個數值已經精確到了3.其中愛泡澡的阿基米德他就利用內切和外接正多邊形,估算出了近似值22/7。這是公元前人類能夠得到的最精確的圓周率。而類似的思想火花燁萌發在古代中國,這就是著名的割圓術。
  • 圓周率,不得不說的一個數
    幾何法時期古希臘作為古代幾何王國對圓周率的貢獻尤為突出。古希臘大數學家阿基米德(公元前287–212 年) 開創了人類歷史上通過理論計算圓周率近似值的先河。阿基米德從單位圓出發,先用內接正六邊形求出圓周率的下界為3,再用外接正六邊形並藉助勾股定理求出圓周率的上界小於4。
  • 知否| 今天圓周率日 你一定背過3.1415926!
    他是世界上第一個將「圓周率」精算到小數第七位,即在3.1415926和3.1415927之間,他提出的「祖率」對數學的研究有重大貢獻。直到16世紀,阿拉伯數學家阿爾·卡西才打破了這一紀錄。談到祖衝之,就必須得聊下割圓法(割圓術)。割圓術是個啥?對於圓周率的研究,在人類歷史上很早就開始了。
  • 圓周率π,不得不說的一個數
    幾何法時期 古希臘作為古代幾何王國對圓周率的貢獻尤為突出。古希臘大數學家阿基米德(公元前287–212 年) 開創了人類歷史上通過理論計算圓周率近似值的先河。阿基米德從單位圓出發,先用內接正六邊形求出圓周率的下界為3,再用外接正六邊形並藉助勾股定理求出圓周率的上界小於4。
  • 【3.14】圓周率日:π究竟牛B在哪裡?
    今天是 3 月 14 日。而圓周率 π 就約等於 3.14,因此這一天被設為了圓周率日。
  • 圓周率是怎樣計算的?從古至今數學家一直在算,為何它如此重要?
    3月14號,這對於大多數人來說是平凡的一天,在數學界可是熱鬧非凡。人們為了紀念「圓周率日」歡聚一堂。加拿大的一位音樂家Michael Blake更是將其譜成了的樂曲,讓人們可以欣賞到「π」的聲音。這也不禁讓我們好奇,圓周率的魅力為何如此之大?數學家們又是如何計算出圓周率的呢?
  • 如何利用MATLAB計算圓周率
    下面介紹如何利用MATLAB來計算圓周率的方法和示例:1.作圖法利用MATLAB的作圖函數plot畫出sin(x)的曲線和y=0的直線,求出兩條線的交點橫坐標即得圓周率的近似值可以看出交點的橫坐標在3.141592至3.141593之間。2.數值求根法利用fzero()對函數sin(x)在3附近的根進行數值求解,即可得到pi的近似值。
  • 不是圓周率!
    3.14,但實際上要複雜得多π的表示π是無理數,這意味著它是一個不能用分數表示的實數圓周率是數學家們所稱的「無限小數」當開始學習數學的時候>與此同時,一些電腦程式員將圓周率計算到了22萬億位數以上像這樣的計算通常在圓周率日公布,圓周率日是每年3月14日日圓周率的前100位是:3.14159 26535 89793
  • 小升初數學必看:求陰影面積常用的幾種方法,面積倍數比法靠轉化
    求陰影面積是小升初常考題型,今天小編為大家整理幾種類型下,常用的陰影面積求法!必須會的基本規則圖形面積公式:正方形的面積=邊長×邊長長方形的面積=長×寬平行四邊形的面積=底×高三角形的面積=底×高÷2梯形的面積=(上底+下底)×高÷2圓的面積=半徑的平方×圓周率求陰影面積常用的幾種方法直接求法:已知陰影圖形是規則的圖形,可直接根據對應的面積求解
  • 圓周率你知道多少?看了以後才知道自己還是太年輕了
    π=Pai(π=Pi)古希臘歐幾裡德《幾何原本》(約公元前3世紀初)中提到圓周率是常數,中國古算書《周髀算經》( 約公元前2世紀)中有「徑一而周三」的記載,也認為圓周率是常數[1]。歷史上曾採用過圓周率的多種近似值,早期大都是通過實驗而得到的結果,如古埃及紙草書(約公元前1700)中取pi=(4/3)^4≒3.1604 。