3.1415926535.....
円周率って日常生活では「3」で困らないし、正確に計算しても「3.14」で十分な気がしています。
22÷7=3.1428…
355÷113=3.14159292
で十分すぎるくらい。
でも、「1万桁」となると状況が違ってきます。
私だけじゃなく理数系の人は、円周率の計算ってどうやってするのか興味を持つ方が少なくないと思います。
私がコンピュータの世界に入ったのは、小さい頃からラジオを作ったりしていて電子回路に興味があったからです。だから、私にとってのコンピュータ(当時は「マイコン」と呼んでいました)は新種の電子回路でした。今風に言えば「ハードウェア」に興味をもったのです。
それが、高校1年の時、コンピュータ部というのがあって、入部したのですが、そのときに顧問の先生のつてで工業高校の実習センターに毎月行くことが出来ました。そこで使えるのは、日立製作所のHITAC(ハイタック)という大型コンピュータで、新製品の発売前テスト稼働も兼ねているため、比較的高性能なコンピュータだそうです。私は普通科でしたから、顧問の先生がいなければ利用できなかった施設です。
そのときに顧問の先生から円周率の計算が出来ることを教えてもらって、早速、友人と二人で取り組みました。円周率の計算なんて科学者にしか出来ないと思い込んでいた私は、喜んでとびつきました。
【最初のプログラム】
言語はFORTRAN(フォートラン)という科学技術計算用のプログラム言語です。
最初に作ったのは

という 「 45度のタンジェントは1である 」 って高校1年生で習う三角関数があります。
その逆関数で円周率の値を求める方法です。
式は

となります。

=4*ATAN(1) と入れれば結果が出ます
でも、これだけでは長い桁の計算が出来ませんが、テイラー展開という手法で級数に展開すると、

となります。(なるそうです)
いきなり複雑な式が出てきました。
この先、読むのがイヤになりました?
でも、


ということで、分母を2ずつ増やしてそれを足し続ければよいことになります。
これならExcelでもなんとか出来そうですね。
最初はこれでプログラムを作ってみました。
たしか、小数点以下5桁くらいまで求めるように作ったと思います。
1万桁くらい挑戦すればいいのにと思う方もいますよね。私もそのつもりで取りかかりました。
でも作っていて駄目なことが分かりました。小数点以下5桁求めるだけでも、分母が100000以上になるまで計算をすることになり、そのためには5万回の割り算と足し算が必要です。どれだけの時間がかかるか分からなかったので控えめな桁数にしました。
それでも、3.14159と結果が出たときには感動しました。
ただ、この方法では、1桁精度を上げるために、10倍の計算をすることになり、10桁計算するだけでも50億回も繰り返さないといけないのですから、難しいことは容易に分かります。
【高速化の始まり】
それで、先生に泣きついて教えてもらったのが、マチンの公式です。

前半をテイラー展開してみると

となり、ちょっと複雑ですが計算してみると7項目ですでに小数点以下10桁になります。先ほどの式では天文学的な回数の計算が必要でしたが、こちらは収束がとても早いです。後半は1/239ということでさらに収束が早くなります。
この方法で1万桁求めるとしたら、いくつまで計算したらいいのでしょう。1万桁目に影響を与えなくなるほど小さい数値になるまで計算したらいいはずです。
およそですが、

となるnを求めればいいから、それを解いて

ですから前半は分母が14307乗の項くらいまで計算すればよいことが分かります。
これで作り直して1万桁をやってみました。CPUタイムで30分かかりました。
これを実行したコンピュータは実習用でしたから無料ですが、時間貸しの場合、CPUタイム1秒あたり数十円になる機種だそうで、数万円分使わせていただいたことになります。
【劇的な高速化】
その後、高速化のために半年くらい改良に改良を重ねた結果、劇的に速くなりました。
計算式も変えて

というクリンゲンシュティルナの式に変更しました。
分母が10で収束が早いのも理由の一つですが、私が10進数の感覚でプログラムを作ったため、10という数がとても都合がよかったからです。

最終的に、1万桁を求めるのに、相棒が作ったプログラムは4秒、私は6秒かかりました。残念ながら私の負け。
説明しませんでしたが、FORTRAN言語で扱える数値は10桁前後ですから、1万桁を扱うには5桁とか10桁ごとに分割して計算する必要があります。
やりかたは筆算の仕組みと同じです。筆算は、かけ算の九九しか知らなくても大きな数のかけ算が出来るように、繰り上がりとか繰り下がりを使って計算します。
コンピュータでも同様に、加算と乗算は右から始めて繰り上がりをしながら一番左まで計算したら完了。減算は右から始めるが繰り下がりしながら計算します。除算は左から右向きで割った余りを繰り下がりしながら計算します。
相棒は整数型変数を使って5桁ずつ区切り、私は小数型変数を使って10桁ずつ区切りました。相棒の方が2倍も多く処理しないといけないのですが、実数型と小数型で3倍の処理時間差があったため負けたことが分かりました。
【ソフトウェアに転向】
私はこの経験を通じて、プログラミングの醍醐味を知りました。
ソフトウェアに強い興味を持つようになりました。
最初は、5桁計算できた喜びから始まり、10桁求めるのも不可能と思われるところから、計算式(アルゴリズム)を変えることで1万桁を30分で求められるようになり、その後、さらに工夫に工夫を重ねて、1万桁を6秒にまで短縮できたのですから驚きです。
絶望的 → 30分 → 6秒
ソフトウェアの開発というのは、技術力の差によって製品の性能に、数100倍、数千倍の差が出るものだと知りました。これは高校生のときですから1981年頃のこと。この頃からソフトウェア開発の仕事に向かい始めていたのでしょうね。
最近の円周率計算では、これと比較にならないほど高速な計算式を使って計算されています。理解出来ていないので説明できませんが。(汗)
データベースの処理では、SQL言語を知らない人が作ったプログラムでは5時間かかる処理が、知識と経験豊富な人が作ると5分で処理できるプログラムになる。ということも珍しくありません。
それから、創造性とインスピレーションによって、不可能と思われていたことが可能になったりするととても嬉しいものです。
だから、科学者は研究し続けるのだろうと思いました。
【神様に与えられた創造性】
統一原理によれば、神様は人間に「創造性」を与えて下さいました。
親なる神様が宇宙を創造されたように、神の子である人間も創造主にしようとされたそうです。
私たち人間が創造するものとは、自分の人格を完成することと、天国を完成することです。
文鮮明先生によれば、堕落によって創造性が僅かしか発揮できなくなったそうです。
これから、復帰されて天国になったとき、皆が天才的な能力を発揮して、どれほど素晴らしい世界が作られていくかを考えるととても楽しみです。
(おわりに)
この文章を作るのは結構大変でした。なれない数式エディタを使い、細かく分けて画像保存して...。
途中でやめようかと思ったくらい。同様に数式を使ったブログもありますが、これほど面倒だとは知りませんでした。
◇−−−−−−−−−−−−−−−−−−◇
読んでくださってありがとうございます。
できればクリックして応援お願いします。

にほんブログ村ランキング
◇−−−−−−−−−−−−−−−−−−◇