ChatGPTにコラッツ予想を検証するプログラムを書いてもらった

ChatGPTにコラッツ予想を検証するプログラムを書いてもらいました。

コラッツ予想(コラッツ問題)は、「ある自然数について、偶数なら2で割る、奇数なら3かけて1足すという動作を繰り返すと、どんな自然数でもいつかは1になる」という予想で、数論の未解決問題の一つです。とてもシンプルな問題なので、プログラミング課題としても取り上げられることが多いものです。

指示文(プロンプト)1:

指定された任意の自然数に対して、コラッツ予想を検証するPythonコードを書いてください。例えば、初期値をn(0)とし、n(0)=999は奇数なのでn(1)=3n(0)+1=2998、n(2)=n(1)/2=1499として、以降、その操作を続けて1に到達するまで繰り返してください。最後に、1に到達するまでにかかった回数を表示してください。

回答:

以下は、指定された自然数に対してコラッツ予想を検証するPythonコードです。


def collatz_conjecture(n):
    count = 0
    while n != 1:
        print(n)  # 各ステップの値を表示(任意の場合はコメントアウトしてもよい)
        if n % 2 == 0:
            n = n // 2
        else:
            n = 3 * n + 1
        count += 1
    print(n)  # 最終的な値1を表示
    return count

# 初期値を設定
initial_value = 999

# コラッツ予想を検証
steps = collatz_conjecture(initial_value)

# 1に到達するまでにかかった回数を表示
print("1に到達するまでのステップ数:", steps)

    

このコードでは、collatz_conjecture 関数を定義し、与えられた自然数 n に対してコラッツ予想を検証しています。n が1になるまで、偶数の場合は n を2で割り、奇数の場合は n を3倍して1を足します。この操作を繰り返し、1に到達するまでにかかったステップ数をカウントしています。最終的に、1に到達するまでのステップ数が表示されます。

結果:

以下のように成功しました。処理時間も計測して表示する部分は手動で追加してます。
n = 999だと一瞬なので、n = 999999999999999999999999999999 (30桁の9)とかにしてみましたが、これでもほとんど瞬殺ですね。

次に、指定した自然数を上限とした全ての数を検証するコードも書いてもらいました。

指示文(プロンプト)2:

指定された任意の自然数を上限として、すべての数についてコラッツ予想を検証するPythonコードを書いてください

回答:

以下は、指定された上限までの自然数についてコラッツ予想を検証するPythonコードです。


def collatz_conjecture(n):
    count = 0
    while n != 1:
        if n % 2 == 0:
            n = n // 2
        else:
            n = 3 * n + 1
        count += 1
    return count

def verify_collatz_conjecture(limit):
    for i in range(1, limit + 1):
        steps = collatz_conjecture(i)
        print("初期値: {}, ステップ数: {}".format(i, steps))

# 上限値を設定
limit = 100

# コラッツ予想を検証
verify_collatz_conjecture(limit)

    
結果:

以下のように成功しました。初期値は100万にしてみました。時間計測処理は同様に手動追加です。

上限値を100万で処理完了まで約17秒でした。CPU負荷は50%くらいでまだ余裕がありましたが、メモリはこの処理だけで2GBくらい消費して、全体としては3.7GBくらい(VMに割り当てたメモリは8GB)。これより大きい値を上限値にするとjupyter nootbook自体が不安定で落ちたりしますね(ipynbファイルも100MB超と重くて<開けない。。。)/p>