1. 程式人生 > >利用馬青公式輸出π的後任意位數字

利用馬青公式輸出π的後任意位數字

馬青公式

π=16arctan154arctan1239
arctanx=xx33+x55......
π=16×(11×513×53+......)4×(11×23913×2393+......)
級數中的分數,分母增長很快,但我們可以對一個分式,不斷除以同一個低精度數(522392),就能得到所有分數的值。

# Python 實現

import pandas as
pd def f(number): number1 = number+10 # 算到小數點後number1位 b = 10**number1 # 求含4/5的首項 x1 = b*4//5 # 求含1/239的首項 x2 = b// -239 # 求第一大項 he = x1+x2 #設定下面迴圈的終點,即共計算n項 number *= 2 #迴圈初值=3,末值2n,步長=2 for i in range(3,number,2): # 求每個含1/5的項及符號 x1 //= -25
# 求每個含1/239的項及符號 x2 //= -57121 # 求兩項之和 x = (x1+x2) // i # 求總和 he += x # 求出π pai = he*4 #舍掉後十位 pai //= 10**10 ############ 輸出圓周率π的值 result=str(pai) return result

最後為了方便統計出現的數字的次數,將其轉換為series格式,並定義以下函式來視覺化。

def show(n,plt_type='pie'
)
:
result = f(n) a = pd.Series([int(i) for i in result]) b = a.value_counts() if plt_type=='pie': plt.figure(figsize=(10,8)) plt.pie(b,labels=b.index,explode=[0.05]*10,shadow=True,autopct='%1.1f%%') plt.show() elif plt_type=='bar': plt.figure(figsize=(10,8)) plt.bar(b.index,b.values) plt.show() else: print('Type Wrong')

利用此函式可輸出餅圖或柱形圖
當n=100時:

show(100,'pie')
show(100,'bar')

這裡寫圖片描述
這裡寫圖片描述

當n=10000時:

show(10000,'bar')
show(10000,'pie')

這裡寫圖片描述
這裡寫圖片描述

由此來看π應該是正規數。突然想看看在其中會不會出現自己的生日,於是定義以下函式

import re
def find_(pattern,result):
    loc = result.find(pattern)
    return loc
result=f(300000)#產生300000位數
find_('199766',result)

最後return了140151,驚奇竟然真的在裡面了!(雖然這個演算法有誤差hhh不過姑且當他正確吧)