3x+1 (Collatz Conjecture)

2/19/2023

Learning Python

t f B! P L

YoutubeでTEDを観ていたときに再生している動画の下に表示されるおすすめ(?)に表示されていた、”3x+1”というサムネイル画像が気になって再生してみると面白かったので少し調べてみた。(元々観ていたTim Urbanの話もとても面白いので別途投稿

Collatz Conjecture(コラッツ予想)

Lothar Collatz(ローター・コラッツ、1910-1990)さんというドイツの数学者が提起した未解決問題の一つ。小学生でも出来る様な簡単な計算ながら証明困難な問題らしく、Paul Erdős(ポール・エルデシュ、1913-1996)というコラッツ予想を研究してた数学者は「数学はまだこの種の問題に対する用意ができていない」と発言したとか。

どんな予想かというと;

任意の正の数に対して以下のルールに沿って計算を繰り返すとき、どんな値から始めても最終的に必ず1になる(1→4→2→1→...の繰り返しになる)、という予想。
  • 奇数ならば3倍して1を足す (3x + 1)
  • 偶数ならば2で割る  (x / 2)


The Simplest Math Problem No One Can Solve - Collatz Conjecture

参考: コラッツの問題 - Wikipedia


動画を観たりWebサイトを読んだりして何となく内容は掴めたつもりになれたものの、いまいち凄さが伝わってこなかった。折角なので、Pythonを使って実際に計算したりグラフ化したりしてみる。Raspberry Pi以外でPythonを久しぶりに使うので、Plotの使い方なども調べなおしながら進めた。

作成したプログラム: 指定した初期値から1になるまで繰り返し計算を実行し、計算毎に値をリスト化するとともに計算回数をカウント。

import matplotlib.pyplot as plt

x = 1001 # 初期値

def collatz(x):
    y = [x]
    n = 0 #計算回数カウント用
    while x > 1:    
        if x % 2 != 0:
            x = 3 * x + 1
        else:
            x = x / 2
        y.append(int(x))
        n = n + 1
    return y, n

y = collatz(x)
print(y[0])
plt.plot(y[0], marker='o', ms=2)
plt.grid(axis='both')
print("\nNumber of calc: ",y[1])
出力:
[1001, 3004, 1502, 751, 2254, 1127, 3382, 1691, 5074, 2537, 7612, 3806, 1903, 5710, 2855, 8566, 4283, 12850, 6425, 19276, 9638, 4819, 14458, 7229, 21688, 10844, 5422, 2711, 8134, 4067, 12202, 6101, 18304, 9152, 4576, 2288, 1144, 572, 286, 143, 430, 215, 646, 323, 970, 485, 1456, 728, 364, 182, 91, 274, 137, 412, 206, 103, 310, 155, 466, 233, 700, 350, 175, 526, 263, 790, 395, 1186, 593, 1780, 890, 445, 1336, 668, 334, 167, 502, 251, 754, 377, 1132, 566, 283, 850, 425, 1276, 638, 319, 958, 479, 1438, 719, 2158, 1079, 3238, 1619, 4858, 2429, 7288, 3644, 1822, 911, 2734, 1367, 4102, 2051, 6154, 3077, 9232, 4616, 2308, 1154, 577, 1732, 866, 433, 1300, 650, 325, 976, 488, 244, 122, 61, 184, 92, 46, 23, 70, 35, 106, 53, 160, 80, 40, 20, 10, 5, 16, 8, 4, 2, 1]

Number of calc:  142
初期値1001から1になるまでの計算

次に計算回数をプロット。
import matplotlib.pyplot as plt

def collatz(x):
    y = [x]
    n = 0 #計算回数カウント用
    while x > 1:    
        if x % 2 != 0:
            x = 3 * x + 1
        else:
            x = x / 2
        y.append(int(x))
        n = n + 1
    return y, n

x = [] #初期値
y = [] #計算過程
n = [] #計算回数
for a in range(1,1000001,1):
    x.append(a)
    #y.append(collatz(a)[0])
    n.append(collatz(a)[1])

plt.scatter(x,n,marker='o',s=1)
plt.grid(axis='both')
初期値100万までの計算回数

さすがに100万回も計算させると1分くらい時間がかかった。100万回やってみても500回程度の計算で1になる事が確認できた。コラッツ予想は確かにすごいと感じるものの、これを証明しようとする人たちがいることの方がすごい。とりあえず、Python でそれっぽい計算が出来たので満足。

このブログを検索

ラベル

Outdoor (21) 3D Printer (12) Raspberry Pi (10) Learning (9) Movie (7) Pico (6) FreeCAD (5) Game (5) Blog (4) MSFS (4) Python (4) Gadget (1) Unity (1)

ブログ アーカイブ

About

思い付きで始めた様々なコトをやった感想やメモ、Web上で見つけた後々役立ちそうなコトなどをまとめてます。 万人の役に立つコンテンツではなく自分用メモ的な内容ですが、何かの役に立てば幸いです

人気の投稿

QooQ