2009年07月11日

円周率の計算方法



3.1415926535.....


円周率って日常生活では「3」で困らないし、正確に計算しても「3.14」で十分な気がしています。

 22÷7=3.1428…
 355÷113=3.14159292
 で十分すぎるくらい。

でも、「1万桁」となると状況が違ってきます。

私だけじゃなく理数系の人は、円周率の計算ってどうやってするのか興味を持つ方が少なくないと思います。

私がコンピュータの世界に入ったのは、小さい頃からラジオを作ったりしていて電子回路に興味があったからです。だから、私にとってのコンピュータ(当時は「マイコン」と呼んでいました)は新種の電子回路でした。今風に言えば「ハードウェア」に興味をもったのです。

それが、高校1年の時、コンピュータ部というのがあって、入部したのですが、そのときに顧問の先生のつてで工業高校の実習センターに毎月行くことが出来ました。そこで使えるのは、日立製作所のHITAC(ハイタック)という大型コンピュータで、新製品の発売前テスト稼働も兼ねているため、比較的高性能なコンピュータだそうです。私は普通科でしたから、顧問の先生がいなければ利用できなかった施設です。

そのときに顧問の先生から円周率の計算が出来ることを教えてもらって、早速、友人と二人で取り組みました。円周率の計算なんて科学者にしか出来ないと思い込んでいた私は、喜んでとびつきました。



【最初のプログラム】

言語はFORTRAN(フォートラン)という科学技術計算用のプログラム言語です。

最初に作ったのは 
   20090710-01.gif
という 「 45度のタンジェントは1である 」 って高校1年生で習う三角関数があります。
その逆関数で円周率の値を求める方法です。
式は
   20090710-02.gif
となります。

20090710-03.gifは tanの逆関数でarctan (アークタンジェント)とも書きまして、Excelの場合ならセルに
=4*ATAN(1) と入れれば結果が出ます

でも、これだけでは長い桁の計算が出来ませんが、テイラー展開という手法で級数に展開すると、
   20090710-04.gif
となります。(なるそうです)

いきなり複雑な式が出てきました。
この先、読むのがイヤになりました?



でも、20090710-02.gif つまりx=1ですから、上の式にx=1を代入しすると、とっても簡単な式になります。

   20090710-05.gif

ということで、分母を2ずつ増やしてそれを足し続ければよいことになります。
これならExcelでもなんとか出来そうですね。


最初はこれでプログラムを作ってみました。

たしか、小数点以下5桁くらいまで求めるように作ったと思います。
1万桁くらい挑戦すればいいのにと思う方もいますよね。私もそのつもりで取りかかりました。
でも作っていて駄目なことが分かりました。小数点以下5桁求めるだけでも、分母が100000以上になるまで計算をすることになり、そのためには5万回の割り算と足し算が必要です。どれだけの時間がかかるか分からなかったので控えめな桁数にしました。

それでも、3.14159と結果が出たときには感動しました。

ただ、この方法では、1桁精度を上げるために、10倍の計算をすることになり、10桁計算するだけでも50億回も繰り返さないといけないのですから、難しいことは容易に分かります。


【高速化の始まり】

それで、先生に泣きついて教えてもらったのが、マチンの公式です。

   20090710-06.gif

前半をテイラー展開してみると
20090710-07.gif

となり、ちょっと複雑ですが計算してみると7項目ですでに小数点以下10桁になります。先ほどの式では天文学的な回数の計算が必要でしたが、こちらは収束がとても早いです。後半は1/239ということでさらに収束が早くなります。

この方法で1万桁求めるとしたら、いくつまで計算したらいいのでしょう。1万桁目に影響を与えなくなるほど小さい数値になるまで計算したらいいはずです。

およそですが、
  20090710-08.gif

 となるnを求めればいいから、それを解いて
   20090710-09.gif

ですから前半は分母が14307乗の項くらいまで計算すればよいことが分かります。

これで作り直して1万桁をやってみました。CPUタイムで30分かかりました。
これを実行したコンピュータは実習用でしたから無料ですが、時間貸しの場合、CPUタイム1秒あたり数十円になる機種だそうで、数万円分使わせていただいたことになります。


【劇的な高速化】

その後、高速化のために半年くらい改良に改良を重ねた結果、劇的に速くなりました。

計算式も変えて
   20090710-10.gif
というクリンゲンシュティルナの式に変更しました。

分母が10で収束が早いのも理由の一つですが、私が10進数の感覚でプログラムを作ったため、10という数がとても都合がよかったからです。

20090710-11.gifの3乗、5乗、7乗が、0.001、0.00001、0.0000001 というふうに、遅い割り算の代わりに桁をずらすだけで済むため、劇的に高速化できるからです。

最終的に、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分で処理できるプログラムになる。ということも珍しくありません。


それから、創造性とインスピレーションによって、不可能と思われていたことが可能になったりするととても嬉しいものです。

だから、科学者は研究し続けるのだろうと思いました。


【神様に与えられた創造性】

統一原理によれば、神様は人間に「創造性」を与えて下さいました。

親なる神様が宇宙を創造されたように、神の子である人間も創造主にしようとされたそうです。
私たち人間が創造するものとは、自分の人格を完成することと、天国を完成することです。

文鮮明先生によれば、堕落によって創造性が僅かしか発揮できなくなったそうです。
これから、復帰されて天国になったとき、皆が天才的な能力を発揮して、どれほど素晴らしい世界が作られていくかを考えるととても楽しみです。


(おわりに)
この文章を作るのは結構大変でした。なれない数式エディタを使い、細かく分けて画像保存して...。
途中でやめようかと思ったくらい。同様に数式を使ったブログもありますが、これほど面倒だとは知りませんでした。




◇−−−−−−−−−−−−−−−−−−◇
 読んでくださってありがとうございます。
 できればクリックして応援お願いします。
にほんブログ村 哲学・思想ブログ 宗教へ
 にほんブログ村ランキング
◇−−−−−−−−−−−−−−−−−−◇
posted by 理科系おじさん at 00:43 | Comment(4) | TrackBack(0) | 科学と神様 | このブログの読者になる | 更新情報をチェックする

この記事へのコメント
頑張って読みました(笑)

とにかく凄いことがわかりました!
Posted by 幸せな家庭 at 2009年07月11日 12:13
円周率の計算方法は、初めて知りました。
プログラミングの世界って、奥が深いのですね。

ところで今日の新聞に、22日の皆既日食のニュースが出ていましたけど、どこの時点で、○月△日の何時何分何秒から、何分間、日食が起こる、といった事を事細かに計算できるなんて、科学者というのは大したもんだなと関心しました。

本然の世界になって、人類の英知が人類の幸福のためにのみ使われるようになったら、どれほど素晴らしい世の中になることでしょうか。
Posted by kei at 2009年07月12日 18:42
たいへん楽しく読ませていただきました。

FORTRANは私も学校で初めて習った言語で、たいへん懐かしかったです。当時(20数年前)はプログラム1行に対して1枚のパンチカードを打って、プログラムを作ったものです。パンチカードは学食で売っていました。

その後、NECの98シリーズが出たときには、その性能にビックリしたものです。ところが最近は、さらにものすごい技術の進歩ですね。

懐かしい時代を思い出させていただき、感謝です。
Posted by 小林浩 at 2009年07月18日 19:21
ながいことコメントできず申し訳ありません

幸せな家庭さん、頑張って読んで下さってありがとうございます。

keiさん、科学って神様の創造された通りに動いているので、面白いですね。

小林浩さん、私も円周率のプログラムはパンチカード(マークシート)でした。懐かしい。
Posted by 理科系おじさん at 2009年07月18日 23:08
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。