Pythonでコラッツの問題

問題の定義はコラッツの問題 - Wikipediaを参照。
コードは簡単。数列の形で解を得るようにする。

def collatz(x):
    lists = []
    while x != 1:
        x = x/2 if x%2 == 0 else x*3 + 1
        lists.append(x)
    return lists

ステップ数を得る場合はlenを使う。

len(collatz(27))
# => 111

2から6000までのコラッツ関数のステップ数を計算してみる。

from matplotlib import pyplot as plt

MAXIT = 6000
def collatz(x):
    lists = []
    while x != 1:
        x = x/2 if x%2 == 0 else x*3 + 1
        lists.append(x)
    return lists

cs = [len(collatz(i)) for i in range(2, MAXIT+1)]
plt.plot(range(2,MAXIT+1), cs, "ro")
plt.show()

傾向を見ると、数の増加とともにステップ数も増加するがパターンがあるし、対数的に増加しているようにも見える。

つづいて、x軸に開始時の数、y軸にcollatz(x)の計算過程における最大の数を取ったグラフを作ってみる(x軸は2から10000まで)。

max_cs = [max(collatz(i)) for i in range(2, MAXIT+1)]

ちなみに開始時の数によってはcollatz計算過程における最大値が非常に大きくなる。2〜10000の間ではcollatz(9663)の計算過程の最大値が最も大きい数27114424になる。よってプロットする際にはylimで描画範囲を絞る必要がある。

plt.ylim(0, 10**6)

ここまで、以下リンクに載っているグラフの真似事でした。
Collatz conjecture - Wikipedia, the free encyclopedia