使用Python通過拉馬努金公式快速求π

来源:https://www.cnblogs.com/sibide/archive/2023/03/05/17180790.html
-Advertisement-
Play Games

可讀、可寫 r+t: 可讀、可寫 w+t: 可寫、可讀 a+t: 可追加、可讀 ## wt with open('36w.txt', 'wt', encoding='utf-8') as fw: print(fw.readable()) print(fw.writable()) False True ...


使用Python通過拉馬努金公式快速求π

一、前言

π是一個數學常數,定義為:圓的周長與直徑的比值。
π是一個無理數,也是一個超越數,它的小數部分無限不迴圈。
π可以用來精確計算圓周長、圓面積、球體積等幾何形狀的關鍵值。
有關π的有趣知識有很多,例如:

  • π在數學中有很多重要的應用,例如歐拉公式e^(iπ)=-1,這個公式被稱為“數學之美”,因為它將5個看似無關的符號緊密地聯繫了起來。
  • π符號是由瑞士數學家歐拉在1736年首次使用的。之前,人們通常用分數或無窮級數來表示圓周率。
  • π是希臘語“周長”的開頭字母。
  • π的小數部分中,第762位到第766位是“99999”,這被稱為“Feynman點”,因為物理學家費曼(Richard Feynman)曾經說過,如果他能記住π的所有數字,他就會以這五個9為結尾。
  • 3月14日被稱為“圓周率日”,因為這個日期的美式寫法是3/14,和π的前兩位數字相同。
  • 7月22日也被稱為“圓周率近似日”,因為這個日期的歐式寫法是22/7,和π的一個常用近似值相同。
    π是否是一個正規數還沒有確定,正規數是指在任何進位下,它的小數部分包含了所有可能出現的數字序列。但是目前還沒有確定的答案。
    一種可能的情況是,π是一個正規數,也就是說它在任何進位下的小數部分包含了所有可能出現的數字序列,並且每個數字出現的概率都相同。如果這樣的話,由於π是一個無限不迴圈小數,那麼π中所有數字出現的概率確實均等。也就是說,我們在π中找到任何數字的組合,比如:
    所有人的生日
    所有人的銀行卡密碼
    這裡介紹一個在π中查找特殊數字組合起始位置的網站:
    http://www.subidiom.com/pi/pi.asp
    只要輸入一個你想在π中找尋的數字組合,這個網站就會通過在π中搜索並反饋搜索結果給你:
  1. 進入網站,輸入想要查詢的數字組合:20230305
  2. 點擊submit
  3. 等待查詢結果:3108384

image

1.1 為什麼要算π

π是一個無理數,也就是說它不能用兩個整數的比值來表示。它的小數部分是無限不迴圈的,目前已經計算出了超過50萬億位。
實際上,如果用圓周公式來計算整個宇宙的周長,只需要使用π的前40位就可以精確計算出來了,如果我們假設宇宙的直徑是93億光年,那麼它的周長就是2π×93億光年。如果我們用π的前40位來計算這個值,那麼誤差就不到一個質子的直徑。也就是說,用π的前40位就足以精確地描述宇宙的大小了。
那為什麼還要用超級電腦不停的計算π呢?用超級電腦不停的算π,是因為人們對這個神奇的數有著強烈的好奇心和探索欲。
一方面,計算π可以檢驗超級電腦的性能和穩定性,也可以推動計算方法和軟體技術的發展。
另一方面,計算π也有一些實際應用,比如密碼學、隨機數生成、數據壓縮等。
不過,由於π是一個無理數,它的小數部分是無限不迴圈的,所以用任何有限的資源都無法算盡它。

1.2 π的求法

π在歷史上被不同的文明用不同的方法估算過,最早可以追溯到4000年前的古埃及和巴比倫。其中一個簡單的方法是用繩子測量圓形物體的周長和直徑,然後計算它們的比值。
求π值的方法有很多種,比如:
阿基米德法:用正多邊形逼近圓,計算其周長和麵積,得到π的上下界。
無窮級數法:利用一些收斂速度快的無窮級數公式,如萊布尼茨公式、馬青公式等,不斷求和得到π的近似值。

萊布尼茨公式:π/4 = 1 - 1/3 + 1/5 - 1/7 + ...
馬青公式:π = 16 arctan(1/5) - 4 arctan(1/239)
阿基米德法變形:π = 2 + 2/3 + 2/32/5 + 2/32/5*3/7 + ...

蒙特卡羅法:用隨機數模擬撒豆子或者投針實驗,統計落在圓內和圓外的比例,得到π的近似值。
今天要介紹的是是拉馬努金公式(Ramanujan formula),它是印度數學家拉馬努金(Srinivasa Ramanujan)在1910年發現的一系列級數公式,可以用來快速計算π的近似值。這個公式每計算一項可以得到8位的十進位精度。

image

二、準備

2.1 高精度庫

在Python中,預設的小數位數為17位,如果想要計算更多的小數位,則需要專門的庫。這裡使用decimal庫。decimal是一個Python內置庫,無需安裝。可以直接導入使用。

2.2 π的值

因為後面要涉及到核對,所以需要準備正確的π的前xx位,這裡是使用了前1萬位。如下:

3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275900994657640789512694683983525957098258226205224894077267194782684826014769909026401363944374553050682034962524517493996514314298091906592509372216964615157098583874105978859597729754989301617539284681382686838689427741559918559252459539594310499725246808459872736446958486538367362226260991246080512438843904512441365497627807977156914359977001296160894416948685558484063534220722258284886481584560285060168427394522674676788952521385225499546667278239864565961163548862305774564980355936345681743241125150760694794510965960940252288797108931456691368672287489405601015033086179286809208747609178249385890097149096759852613655497818931297848216829989487226588048575640142704775551323796414515237462343645428584447952658678210511413547357395231134271661021359695362314429524849371871101457654035902799344037420073105785390621983874478084784896833214457138687519435064302184531910484810053706146806749192781911979399520614196634287544406437451237181921799983910159195618146751426912397489409071864942319615679452080951465502252316038819301420937621378559566389377870830390697920773467221825625996615014215030680384477345492026054146659252014974428507325186660021324340881907104863317346496514539057962685610055081066587969981635747363840525714591028970641401109712062804390397595156771577004203378699360072305587631763594218731251471205329281918261861258673215791984148488291644706095752706957220917567116722910981690915280173506712748583222871835209353965725121083579151369882091444210067510334671103141267111369908658516398315019701651511685171437657618351556508849099898599823873455283316355076479185358932261854896321329330898570642046752590709154814165498594616371802709819943099244889575712828905923233260972997120844335732654893823911932597463667305836041428138830320382490375898524374417029132765618093773444030707469211201913020330380197621101100449293215160842444859637669838952286847831235526582131449576857262433441893039686426243410773226978028073189154411010446823252716201052652272111660396665573092547110557853763466820653109896526918620564769312570586356620185581007293606598764861179104533488503461136576867532494416680396265797877185560845529654126654085306143444318586769751456614068007002378776591344017127494704205622305389945613140711270004078547332699390814546646458807972708266830634328587856983052358089330657574067954571637752542021149557615814002501262285941302164715509792592309907965473761255176567513575178296664547791745011299614890304639947132962107340437518957359614589019389713111790429782856475032031986915140287080859904801094121472213179476477726224142548545403321571853061422881375850430633217518297986622371721591607716692547487389866549494501146540628433663937900397692656721463853067360965712091807638327166416274888800786925602902284721040317211860820419000422966171196377921337575114959501566049631862947265473642523081770367515906735023507283540567040386743513622224771589150495309844489333096340878076932599397805419341447377441842631298608099888687413260472156951623965864573021631598193195167353812974167729478672422924654366800980676928238280689964004824354037014163149658979409243237896907069779422362508221688957383798623001593776471651228935786015881617557829735233446042815126272037343146531977774160319906655418763979293344195215413418994854447345673831624993419131814809277771038638773431772075456545322077709212019051660962804909263601975988281613323166636528619326686336062735676303544776280350450777235547105859548702790814356240145171806246436267945612753181340783303362542327839449753824372058353114771199260638133467768796959703098339130771098704085913374641442822772634659470474587847787201927715280731767907707157213444730605700733492436931138350493163128404251219256517980694113528013147013047816437885185290928545201165839341965621349143415956258658655705526904965209858033850722426482939728584783163057777560688876446248246857926039535277348030480290058760758251047470916439613626760449256274204208320856611906254543372131535958450687724602901618766795240616342522577195429162991930645537799140373404328752628889639958794757291746426357455254079091451357111369410911939325191076020825202618798531887705842972591677813149699009019211697173727847684726860849003377024242916513005005168323364350389517029893922334517220138128069650117844087451960121228599371623130171144484640903890644954440061986907548516026327505298349187407866808818338510228334508504860825039302133219715518430635455007668282949304137765527939751754613953984683393638304746119966538581538420568533862186725233402830871123282789212507712629463229563989898935821167456270102183564622013496715188190973038119800497340723961036854066431939509790190699639552453005450580685501956730229219139339185680344903982059551002263535361920419947455385938102343955449597783779023742161727111723643435439478221818528624085140066604433258885698670543154706965747458550332323342107301545940516553790686627333799585115625784322988273723198987571415957811196358330059408730681216028764962867446047746491599505497374256269010490377819868359381465741268049256487985561453723478673303904688383436346553794986419270563872931748723320837601123029911367938627089438799362016295154133714248928307220126901475466847653576164773794675200490757155527819653621323926406160136358155907422020203187277605277219005561484255518792530343513984425322341576233610642506390497500865627109535919465897514131034822769306247435363256916078154781811528436679570611086153315044521274739245449454236828860613408414863776700961207151249140430272538607648236341433462351897576645216413767969031495019108575984423919862916421939949072362346468441173940326591840443780513338945257423995082965912285085558215725031071257012668302402929525220118726767562204154205161841634847565169998116141010029960783869092916030288400269104140792886215078424516709087000699282120660418371806535567252532567532861291042487761825829765157959847035622262934860034158722980534989650226291748788202734209222245339856264766914905562842503912757710284027998066365825488926488025456610172967026640765590429099456815065265305371829412703369313785178609040708667114965583434347693385781711386455873678123014587687126603489139095620099393610310291616152881384379099042317473363948045759314931405297634757481193567091101377517210080315590248530906692037671922033229094334676851422144773793937517034436619910403375111735471918550464490263655128162288244625759163330391072253837421821408835086573917715096828874782656995995744906617583441375223970968340800535598491754173818839994469748676265516582765848358845314277568790029095170283529716344562129640435231176006651012412006597558512761785838292041974844236080071930457618932349229279650198751872127267507981255470958904556357921221033346697499235630254947802490114195212382815309114079073860251522742995818072471625916685451333123948049470791191532673430282441860414263639548000448002670496248201792896476697583183271314251702969234889627668440323260927524960357996469256504936818360900323809293459588970695365349406034021665443755890045632882250545255640564482465151875471196218443965825337543885690941130315095261793780029741207665147939425902989695946995565761218656196733786236256125216320862869222103274889218654364802296780705765615144632046927906821207388377814233562823608963208068222468012248261177185896381409183903673672220888321513755600372798394004152970028783076670944474560134556417254370906979396122571429894671543578468788614445812314593571984922528471605049221242470141214780573455105008019086996033027634787081081754501193071412233908663938339529425786905076431006383519834389341596131854347546495569781038293097164651438407007073604112373599843452251610507027056235266012764848308407611830130527932054274628654036036745328651057065874882256981579367897669742205750596834408697350201410206723585020072452256326513410559240190274216248439140359989535394590944070469120914093870012645600162374288021092764579310657922955249887275846101264836999892256959688159205600101655256375678

三、代碼

from decimal import Decimal, getcontext  # 高精度小數庫
from mdTools import ftDecTimeIt  # 計算函數運行時長的裝飾器
from math import factorial  # 階乘
from π import str_real_pi  # π的真實值(前1萬位小數)

count_numbers = 5000  # 要計算的前N位,請勿超過10000,否則無數據核對
effective_numbers = int(count_numbers * 1.1)  # 有效數字位數
print(f'本程式即將計算π的前:{count_numbers}位,並核對。')


@ftDecTimeIt(1)
def count_π(prec=1000):
    getcontext().prec = prec  # 設置有效的數字位數
    x = 0
    for k in range(int(prec / 8) + 1):  # 這個公式每計算一項可以得到8位的十進位精度。
        a = 2 * Decimal.sqrt(Decimal(2)) / 9801
        b = factorial(4 * k) * (1103 + 26390 * k)
        c = pow(factorial(k), 4) * pow(396, 4 * k)
        x = x + a * b / c
    return 1 / x


pi = count_π(effective_numbers)
# 核對
flag = True
for i in range(2, count_numbers):
    if str_real_pi[i] != str(pi)[i]:
        print(f'出錯啦!出錯的位數為:{i}, 該小數位正確的為:{str_real_pi[i]}, 錯誤的計算為:{str(pi)[i]}')
        flag = False
        break
if flag:
    print('核對無誤!')

本程式即將計算π的前:5000位,並核對。
函數 count_π 運行 1 次的總耗時為:18.5894 秒
核對無誤!

從自動化辦公到智能化辦公
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • VL45 非同步FIFO 很經典的手撕題,這道題要求產生的格雷碼要在本時鐘域中打一拍,其實不打也沒關係。 主要要記住 1、bin2gray的方法:右移一位與移位前異或; 2、格雷碼比較方法:空:讀指針格雷碼和寫指針同步過來的格雷碼相同;滿:寫指針格雷碼高兩位與讀指針同步過來的格雷碼正好相反,低位相同。 ...
  • 職工工資管理系統程式中新增臨時員工的功能 這個職工工資管理系統基本功能都十分完善,代碼也都比較簡潔,運行效率也很高,沒有什麼直接能改的功能,所以我基於現在許多大學生找兼職、臨時工的現象,增添了臨時員工的工資系統,可以方便公司、企業等更加完善公司的財務系統。也方便公司為臨時員工發放工資。 代碼段一是原 ...
  • 雙指針 同向雙指針 能夠實現跳躍尋找,適用於尋找含有某一特性區間,比如最長相同區間,最長不重覆區間 不重覆區間可以用一個數組t[N]來表示,如果其中元素大於1,說明有重覆 int res=0,j=0; for(int i=0;i<n;i++) { t[a[i]]++;//記錄個數 while(j<i ...
  • 一、標識符 標識符是指定義的具有特殊意義的詞,例如變數、常量、函數名等等,任何一門語言中都對自己的標識符有特殊定義的規則。在 Go 語言中,標識符由字母數字和下劃線組成,並且只能以字母和下劃線開頭,例如: 數字、字母和下劃線組成:123、abc _ 只能以字母和下劃線開頭:abc123、_sysVa ...
  • 靜態類和非靜態類 靜態類只能是內部類,外部類不能用static修飾,內部類可以使用static修飾。 創建方式: 外部類.靜態內部類 對象名=外部類.new 靜態內部類(); 外部類 對象名= new 外部類(); 外部類.非靜態內部類 對象名1 = 對象名.new 非靜態內部類(); 抽象類是否可 ...
  • 1.java開發工具的構成 (1)JVM即java虛擬機,用於解釋翻譯java生成的自解碼文件,因為java中有了這個,才能實現java語言跨平臺運行java自解碼文件 (2)JRE即java運行環境,它是由JVM和java系統類庫構成,JRE是能保證java代碼能夠準確無誤在裝了JRE機器上運行, ...
  • 本文已經收錄到Github倉庫,該倉庫包含電腦基礎、Java基礎、多線程、JVM、資料庫、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分散式、微服務、設計模式、架構、校招社招分享等核心知識點,歡迎star~ Github地址:https://github.c ...
  • 需要使用的 技術 工具: idea 2022 開發工具 MySql 5.6 資料庫工具 Apache Tomcat 8.5.85 web應用部署工具 主要功能有: 用戶登錄 用戶註冊 展示列表信息 涉及到的知識: Servlet JDBC 過濾器 先打開資料庫 創建一個資料庫 然後 創建對應的表結構 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...