今回は円周率を計算するアルゴリズムを使って
馬鹿でかい円周率を行けるだけ求めてみました
解説動画はこちら
まず最初に問題ですが
円周率の小数点10000桁目の数値は
何になるでしょうか?
何になるでしょうか?
こんな問題を解く場合に
馬鹿でかい円周率を求める方法があります。
ガウス=ルジャンドルのアルゴリズム
(Gauss–Legendre algorithm)
(Gauss–Legendre algorithm)
円周率を計算する際に用いられる
数学の反復計算アルゴリズム(算術幾何平均法)
円周率計算のアルゴリズムの中でも
トップクラスの収束速度なので、精度が良いらしいです。
アルゴリズムは
円周率を求める関数のコード
計算精度を設定して、その桁数までを求めていく感じになります。
例えば円周率の小数点100桁まで求めたかったら
計算精度を110-150 とかに設定します。
また反復計算の回数は
log2(x) 以上の回数が必要になるので
計算精度を上げる場合は、反復計算回数も
あわせて上げてください(ここでは20回にしてます)
例えば円周率の小数点100桁まで求めたかったら
計算精度を110-150 とかに設定します。
また反復計算の回数は
log2(x) 以上の回数が必要になるので
計算精度を上げる場合は、反復計算回数も
あわせて上げてください(ここでは20回にしてます)
from decimal import Decimal, getcontext # 計算精度の設定(小数点以下1万桁以上の精度を確保) getcontext().prec = 15000 # ガウス=ルジャンドルのアルゴリズムの実装 def gauss_legendre_pi(): # 初期値設定 a = Decimal(1) b = Decimal(1) / Decimal(2).sqrt() t = Decimal(1) / Decimal(4) p = Decimal(1) # 十分な収束回数で反復計算(math.ceil(math.log2(x))以上) for _ in range(20): a_next = (a + b) / 2 b = (a * b).sqrt() t -= p * (a - a_next) ** 2 a = a_next p *= 2 pi_approx = ((a + b) ** 2) / (4 * t) return pi_approx # 円周率の計算 pi_approx = gauss_legendre_pi() pi_str = str(pi_approx) # 1万桁目の数値を取得 k = 10000 # 結果を出力 print(f"円周率の小数点以下{k}桁目の数値: {pi_str[k+1]}")9
まとめ
このPythonコードであれば小数点10万桁くらいまでは余裕です。
それ以上になるとハイスペックな計算資源が必要で
加えてもっと効率の良い高精度計算専用のライブラリを用いたり
並列分散処理などを実装する必要が出てくるかもしれません。
ちなみにこのアルゴリズムでは
2009年に筑波大学の高橋大介という方が
2兆5769億8037万桁
2兆5769億8037万桁
という記録を出しているので
そこから15年以上経った今ならもっと馬鹿でかい桁まで計算が出来るかもしれません!!
デカいって、いいですよね
男のロマン
どなたか馬鹿でかい円周率の計算
挑戦してみませんか
今回はここまでです
それでは。
コメントする