ガウス=ルジャンドルのアルゴリズム
テンプレート:出典の明記 ガウス=ルジャンドルのアルゴリズム(テンプレート:Lang-en)は、円周率を計算する際に用いられる数学の反復計算アルゴリズムである。円周率を計算するものの中では非常に収束が速く、2009年にこの式を用いてテンプレート:Math桁(約テンプレート:Math兆テンプレート:Math億桁)の計算がなされた[1]。
このアルゴリズムはカール・フリードリヒ・ガウスとアドリアン=マリ・ルジャンドルがそれぞれ別個に研究したものである。これはテンプレート:Mathつの数値の算術幾何平均を求めるために、それぞれの数値を算術平均(相加平均)と幾何平均(相乗平均)で置き換えていくものである。
アルゴリズム
これによる円周率の計算方法は以下の通りである。
初期値の設定
反復式
テンプレート:Math が希望する精度(桁数)になるまで以下の計算を繰り返す。小数第テンプレート:Math位まで求めるとき テンプレート:Math 回程度の反復でよい。
テンプレート:Π の算出
円周率 テンプレート:Π は、テンプレート:Math を用いて以下のように近似される。
最初の3回の反復で得られる数値(最後の桁は真値とは異なる)は以下の通りである。
- (小数点以下テンプレート:Math桁目までが正しい)
- (小数点以下テンプレート:Math桁目までが正しい)
- (小数点以下テンプレート:Math桁目までが正しい)
この計算過程は二次収束する。つまり反復のたびに正しい桁数が直前のもののほぼテンプレート:Math倍になるのである。ガウス自身もこの式を用いて反復をテンプレート:Math回まで行ってテンプレート:Math桁まで正しいことを確認したことが知られている。
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())
数学的背景
算術幾何平均
二つの数の算術幾何平均とは、数列
の極限のことである。両数列は同一の極限値を持つ。
のとき、算術幾何平均はとなる。ここで、は第一種完全楕円積分である。また、かつなる数列について、
が成立する。ここで、は第二種完全楕円積分である。
ガウスはこれらの結果を知っていたとされる[2][3][4]。
ルジャンドル恒等式
なるについて、ルジャンドルは次の恒等式を得た。
この式は、任意のについて、以下のようにも書き表すことができる。
初等的な証明
ガウス=ルジャンドルのアルゴリズムは楕円モジュラー関数を用いずに示すこともできる。初等的な積分を用いた証明が Lord (1992)[5]、Milla (2019)[6] によりなされている。
脚注
関連項目
- [[スーパーπ|スーパーテンプレート:Π]]
- ↑ テンプレート:Cite press release
- ↑ テンプレート:Cite book
- ↑ テンプレート:Cite journal
- ↑ Salamin, Eugene, Computation of pi, Charles Stark Draper Laboratory ISS memo 74–19, 30 January 1974, Cambridge, Massachusetts
- ↑ テンプレート:Cite journal
- ↑ Milla, Lorenz (2019), Easy Proof of Three Recursive π-Algorithms, arXiv:1907.04110