私が大学生だったかれこれ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が増えると、倍々に正しい桁数が増えていく感じである。
これ以上の桁数を増やして表示するのも、ブログの文字制限に引っかかるので、正しい桁数だけを表にしてみる。
n | digit | 2n |
0 | 0 | 1 |
1 | 3 | 2 |
2 | 8 | 4 |
3 | 19 | 8 |
4 | 41 | 16 |
5 | 84 | 32 |
6 | 171 | 64 |
7 | 345 | 128 |
8 | 694 | 256 |
9 | 1392 | 512 |
10 | 2788 | 1024 |
11 | 5582 | 2048 |
12 | 11171 | 4096 |
13 | 22348 | 8192 |
14 | 44701 | 16384 |
15 | 89410 | 32768 |
16 | 178825 | 65536 |
17 | 357656 | 131072 |
18 | 715318 | 262144 |
19 | 1430645 | 524288 |
20 | 2861297 | 1048576 |
これくらいで、やめておいた。
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歳でお亡くなりになりました。
この場を借りて、ご冥福をお祈り申し上げます。