Quantcast
Channel: 円周率近似値の日に生まれて理系じゃないわけないだろ! - knifeのblog
Viewing all articles
Browse latest Browse all 5376

算術幾何平均で円周率πを求めてみた

$
0
0

私が大学生だったかれこれ30年前、FORTRANで、円周率を10万桁求めるとか、求めた10万桁を桁を揃えて印刷したものを、学園祭で売ったりしました。

当時は、円周率を求めるならば、マチンの公式がトレンドでした。
それから何年も経ち、現在はどんな方法で円周率を求めるのがトレンドなのだろうか?

どうやら算術幾何平均というものを使って求めるのが1995年頃からのトレンドっぽい。
ガウス・ルジャンドル法(ガウス・ルジャンドルのアルゴリズム)というものを使う。

ガウスは、ヨハン・カール・フリードリヒ・ガウスという16世紀から17世紀のドイツの数学者。
ルジャンドルは、アドリアン・マリ・ルジャンドルという18世紀から19世紀のフランスの数学者。

ガウス・ルジャンドル法とは、簡単に説明すると、漸化式を使って、同じ操作を反復するのですが、収束速度がとにかく速い。

初期値
a0=1
b0=1/2
t0=1/4
p0=1

反復式
an+1=(an+bn)/2
bn+1=anbn
tn+1=tn-pn(an-an+1)
pn+1=2pn

πの算出
π≈(a+b)2/4t


aが算術平均(相加平均)、bが幾何平均(相乗平均)で、それらを足して、2乗したものを、4tで割る。

試しに多倍長電卓LMで数回回してみたところ、
 

nπの近似値を小数点以下100桁で表示。
0
2.9142135623730950488016887242096980785696718753769480731766797379907324784621070388503875343276415727
1
3.1405792505221682483113312689758233117734402375129483356434866933455827580349029078272876215527669005
2
3.1415926462135422821493444319826957743144372233456027945595394848214347672207952646946434489179913058
3
3.1415926535897932382795127748018639743812255048354469357873307020263821378389273990314169420434690584
4
3.1415926535897932384626433832795028841971146782836489215566171069760267645006430617110065777265980684
5
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986256287032116720359


赤文字が正しい桁の部分
nが増えると、倍々に正しい桁数が増えていく感じである。

これ以上の桁数を増やして表示するのも、ブログの文字制限に引っかかるので、正しい桁数だけを表にしてみる。

 

ndigit2n
001
132
284
3198
44116
58432
617164
7345128
8694256
91392512
1027881024
1155822048
12111714096
13223488192
144470116384
158941032768
1617882565536
17357656131072
18715318262144
191430645524288
2028612971048576


これくらいで、やめておいた。
2nと比較しても、十分大きな正しい桁数を保っていることも解る。

例えば、必要な桁数がn桁の場合、log2n回程度反復すれば良いということ。
1万桁なら14回
10万桁なら17回
100万桁なら20回
1000万桁なら24回
1億桁なら27回
10億桁なら30回
100億桁なら34回
1000億桁なら37回
1兆桁なら40回

と行った具合ですね。

大学時代に、この方法を知っていれば、もっと高速に円周率を求めることが出来たであろう。
大学の電算室で10万桁に5日くらい掛かった記憶がある。

ただ、この方法においても、ボトルネックになるものは存在する。
それは平方根を求めること。
平方根を求めるアルゴリズムは、開平法というものがある。
これは手計算でも出来る方法なので、それほど難しくはないのだが、
これがボトルネックになりそうではある。

C言語に多倍長演算を実装してやらせてみたい気がするが、
それはまた別の機会に。


ではでは

PS:Windows95が出た当初、面白いベンチマークテストのプログラムがあった。
名前はスーパーπ、このスーパーπにもガウス・ルジャンドル法が使われているとのこと。
東大の金田研究室の成果をWIndowsに移植したものでした。
東大名誉教授の金田康正氏が、2020年2月11日に急性虚血性心疾患の為、享年70歳でお亡くなりになりました。
この場を借りて、ご冥福をお祈り申し上げます。


Viewing all articles
Browse latest Browse all 5376

Trending Articles