ChatGPTに、任意の桁数の円周率を計算するPythonコードを書いてもらった

ChatGPTに、任意の桁数の円周率を計算するPythonコードを書いてもらいました。

mpmathという高精度演算ライブラリを使って、非常にシンプルなコードになりました。

 

コード:


import mpmath

# 計算する桁数を指定
mpmath.mp.dps = 10000000

# 円周率を計算
pi = str(mpmath.pi)

# 結果をテキストファイルに出力
with open('pi.txt', 'w') as f:
    f.write(pi)
    

このコードでは、mpmathのdps属性を使用して計算する桁数を指定しています。 mpmath.mp.dps = 10000000の行で1000万桁の精度を指定していますが、計算には多くの時間がかかる可能性があります。 スクリプトを実行すると、現在のディレクトリにpi.txtというファイルが作成され、円周率が書き込まれます。

結果

処理時間を計測する処理を追加して、33554433桁を指定して実行したところ、以下のように 42.182 秒 となりました。速いなぁ。。。

本当にあっているのか不安になったので、別途、「スーパーパイ」という有名な円周率計算ソフトの結果と比較しました。桁数が33554433桁なのは、スーパーパイに合わせたからです。手元のPCで3355万桁を計算させたところ、「8分46秒」でした。

スーパーパイの計算結果はテキストファイルで保存されるので、Pythonでの結果をdiff コマンドと、念のため検証用のpythonコードも通してみましたが、結果は完全に一致しました。

diff pi.txt super_pi.txt

def compare_pi_files(file1, file2):
    with open(file1, 'r') as f1, open(file2, 'r') as f2:
        pi1 = f1.read().strip()
        pi2 = f2.read().strip()

    if pi1 == pi2:
        print("円周率は一致しています。")
    else:
        print("円周率は一致していません。")
        mismatch_index = -1
        for i, (digit1, digit2) in enumerate(zip(pi1, pi2)):
            if digit1 != digit2:
                mismatch_index = i
                break

        if mismatch_index != -1:
            print(f"一致しない位置: {mismatch_index+1}")
            print(f"{file1}: {pi1[mismatch_index]}")
            print(f"{file2}: {pi2[mismatch_index]}")
        else:
            print("一致しない位置は見つかりませんでした。")

# ファイルパスを指定して実行
compare_pi_files("pi.txt", "super_pi.txt")