いぬおさんのおもしろ数学実験室

おいしい紅茶でも飲みながら数学、物理、工学、プログラミング、そして読書を楽しみましょう

Pythonで円周率を小数第100位まで求める(1)

 円周率を試しに計算してみることにしました。今はPythonをよく使っているので、Pythonで。何回かに分けてやってみます。世の中には50兆桁まで計算した人がいるそうです(ウィキペディア)!! 頑張ったなあ……。でも、ここでは計算の理屈を整理し、実験をやって「ああ、こうすれば何万桁でも求められる!」という実感を得られればよしとし、小数第100位まで求めることにします。何回かに分けて説明しましょう。

 何となくの話ならすでに書きました

www.omoshiro-suugaku.com

www.omoshiro-suugaku.com

www.omoshiro-suugaku.com

コンピュータがあればすぐできる! ……というわけにはいきません。過去の記事に書いたとおりで、普通にコンピュータ言語を使っても(実数を扱う変数を用意する)10桁かそこらしか精度は出せないのです。その変数が保証する、一番小さな桁までです。小数第20位などの計算はそのままではできません。ではどうしたらよいか。自分で必要な桁を用意することです。

 Pythonには「配列」という、たくさんの変数の組を扱う仕組みがあります。

AD = [0, 0, 0, 0, ……, 0](0が100個)

で100個の変数が用意されます。ここで

AD[3] = 7

を実行すると、

AD = [0, 0, 0, 7, 0, ……, 0]

となります。要するに変数が100個あるのです。メモリは無駄になりますがロジックをスッキリさせたいので、変数1個で1桁を表すことにします。AD = [123, 456, ……](3桁の整数を並べる)とやれば最初の2つの数、123と456だけで6桁分を表現できますが、こういう方法は使わない、ということです。ADはリストとも呼ばれます。ひとつの数を表すのにリストを2つ使います。次のようにリストを用意します。

AU = [0, 0, 0, 0, 0](0が5個)

AD = [0, 0, 0, 0, ……, 0](0が100個)

これを用いて、例えば278.106684という数は

AU = [0, 0, 2, 7, 8]

AD = [1, 0, 6, 6, 8, 4, 0, 0, 0, 0, ……, 0]

と表せばよいですね。今まで通りの方法、x = 1/3 とやったのでは x = 0.3333333333 となるだけで、このままでは小数第15位などは表せていません。でも上のリストを使えば

AU = [0, 0, 0, 0, 0]

AD = [3, 3, 3, 3, 3, 3, ……, 3]

となり、小数第100位まで表現できます。

 これで数値の表現方法は決まりました。次はこれらの4則を実現することです。AU.AD + BU.BD のような計算です。詳細は次回に譲りますが、例えば足し算はリストの各成分を単純に加え、繰り上がりがあれば左隣の桁に加える、でよいでしょう。Pythonで書いてみたいと思います。

 楽しくなりそうです~!!