ガウス=ルジャンドルのアルゴリズム
円周率を計算する際に用いられる反復計算アルゴリズム
From Wikipedia, the free encyclopedia
アルゴリズム
これによる円周率の計算方法は以下の通りである。
初期値の設定
反復式
a, b が希望する精度(桁数)になるまで以下の計算を繰り返す。小数第n位まで求めるとき log2 n 回程度の反復でよい。
π の算出
円周率 π は、a, b, t を用いて以下のように近似される。
最初の3回の反復で得られる数値(最後の桁は真値とは異なる)は以下の通りである。
- (小数点以下2桁目までが正しい)
- (小数点以下7桁目までが正しい)
- (小数点以下18桁目までが正しい)
この計算過程は二次収束する。つまり反復のたびに正しい桁数が直前のもののほぼ2倍になるのである。ガウス自身もこの式を用いて反復を4回まで行って12桁まで正しいことを確認したことが知られている。
Python3による実装例
#!/usr/bin/python3
import sys
from decimal import *
def picalc():
a = Decimal(1)
b = Decimal(1) / Decimal(2).sqrt()
t = Decimal(1) / Decimal(4)
p = Decimal(1)
r = Decimal(0)
rn = Decimal(3)
while r != rn:
r = rn
an = (a + b) / 2
bn = (a * b).sqrt()
tn = t - p * (a - an) * (a - an)
pn = 2 * p
rn = ((a + b) * (a + b)) / (4 * t)
a = an
b = bn
t = tn
p = pn
return rn
if __name__ == "__main__":
if len(sys.argv) < 2:
getcontext().prec = 10000
else:
try:
getcontext().prec = int(sys.argv[1])
except:
print("引数が不正です。桁数を数値で指定して下さい。")
sys.exit(1)
print(picalc())