●次はランニングに使える表を作ります。似たようなものですが2つ用意しました。「秒数から」は、100m進むのに要する秒数をプログラム名の次に入力すると画面いっぱいに表ができます。また、「時速から」は、時速をkm/hで入力します。いずれも入力値は小数第一位までで、常識的な数値を入力するようにしています。もちろん出力先をテキストファイルにリダイレクトすることもできます。
例 >marathon1 28 (画像参照)
秒数から
時速から
---------------------------------------------------------------------------
●私が多桁計算のプログラムを作ろうと思ったのはもちろん、かなり以前から「円周率 (pi)」に強い興味があったからでした。この魅力ある数を可能な限り正確に計算してみようとずっと考えていて、電脳機器をそろえた2000年頃から数年間をかけて一応の成果を得たのですが、その手始めとして作った、「ルート2」の値を計算するプログラムを UP します(正確には得た値を2倍したものがルート2です)。ニュートン法(2次収束)利用で、多桁数同士の積には FFT (Fast Fourier Transform : 複素数版) を使ったオリジナル・プログラムです。
これは DOS Prompt で
>sqrt2r 22 s.bin
などと入力すると求める値 0.70710678... が小数点以下 2^22=4,194,304 桁まで正確に計算できるものです(最後の s.bin は保存ファイル名で省略可)。ファイルの保存形式は、十進8桁づつを int型データ(32bits、4Bytes)に収め実行時の配列をそのままバイナリー・ファイルに格納しています。従って上記のファイル s.bin の大きさは次のようになります。
4194304/8 * 4 = 2,097,152Bytes = 2MB
0.70710678...
これを少し古いIBM Think Pad(1.4GHz,1GBmem)にて実行したときの時間は次のとおりでした(2^25=33,554,432のとき、memは1GBほど必要になります)。
2.203s(20), 4.237s(21), 10.535s(22), 22.092s(23), 46.077s(24), 95.417s(25)
●その「円周率 (pi)」ですが、最も簡単な公式(Machinの公式、逆正接の級数展開)を利用して計算するプログラムを UP します。これは、たくさんの分数を小数になおして加えていくものですが、手計算と同じことを電脳にさせています(少し工夫をしてはいますが)。これは有効桁数を2倍にするには4倍の手間がかかります。
私は昔、この公式を使って手計算を実行したことがありますが、わずか50桁ほどで諦めた記憶があります。また、19世紀半ばに William Shanks という人がこの公式を使って pi を小数点以下707桁まで計算した記録が残っています(百年後に電脳による"ごく短時間の"検証で正値は527桁までであることが分かりました・・・そのパワーを「電脳発明」に傾けた方がよかったのかな?)。
なおこの数は無理数の中でも一段と高度な「超越数」であることが証明されています。
DOS prompt で >machin3 20 (2^20=1,048,576 桁) としたとき計算に1時間以上を要します。計算機がいかに速く処理できるとはいえ、桁数を倍にするのに「4倍の手間」というのは致命的です。
pi = 3.1415926535 8979323846 2643383279 5028841971 6939937510 ・・・
(産医師異国に向かう 産後厄なく 産婦みやしろに 虫散々闇に鳴く・・・)
これを上記IBM Think Padにて実行したときの時間は次のようになりました(これは末尾誤差なしです)。
21.93s(16), 87.65s(17), 350.59s(18)、5657.05s(20)
上記の「4倍」を2.3倍ほどで実行できるプログラムを次に UP します。これは「Borwein の公式」という少し複雑な漸化式を使っています。繰り返しの計算回数は少ない(4次収束)のですが、複雑な式ゆえ計算時間はかかります。漸化式利用の場合は必要な桁数を初めから"引っ張って"計算するため、FFT の利用は欠かせません(プログラムは 2^25 桁までの計算、末尾誤差あり)。
>bor3 20 pi.bin
と入力すると、pi を 2^20=1,048,576 桁まで計算し、pi.bin という名で保存します。
このプログラムを一部改造して、pi の値を 2^27=134,217,728 桁まで計算し、確認した結果のうちの「はじめの1億桁」について数字の出現状況を調べてみました。
0から9までの数字がほぼ"平等"に出現しているのが分かります!。
数字 | | 出現数 |
0 | --- | 9,999,922 |
1 | --- | 10,002,475 |
2 | --- | 10,001,092 |
3 | --- | 9,998,442 |
4 | --- | 10,003,863 |
5 | --- | 9,993,478 |
6 | --- | 9,999,417 |
7 | --- | 9,999,610 |
8 | --- | 10,002,180 |
9 | --- | 9,999,521 |