Featured image of post 什麼是考拉茲猜想?使用 Python 驗證無論什麼數字最後都會變成 1 的數學未解之謎

什麼是考拉茲猜想?使用 Python 驗證無論什麼數字最後都會變成 1 的數學未解之謎

「偶數減半,奇數乘以 3 再加 1」不斷重複最後一定會變成 1?淺顯易懂地解說數學著名未解問題「考拉茲猜想」的不可思議規則。進一步使用 Python 寫程式,實際模擬數列是否會收斂至 1。

「任何數字最後都會變成 1」是真的嗎?──來玩玩考拉茲猜想

大家好!我是 kenji。

突然這麼問,但當你聽到「任何數字最終都會變成 1 的規則」時, 不覺得有點不可思議嗎?

比如說,19、87,甚至是 1000000。 只要按照特定的規則去計算數字,不知為何最後都會收斂為「1」。

這樣如夢似幻的故事,就是 考拉茲猜想(Collatz Conjecture)


話說回來,考拉茲猜想是什麼?

首先介紹一下規則。

  • 起點:選擇任意一個 正整數

  • 操作:

    • 如果是偶數 → 除以 2(n → n / 2)
    • 如果是奇數 → 乘以 3 再加 1(n → 3n + 1)

只要一直重複這些步驟, 任何數字最終都會抵達 1 ,這就是這個猜想的內容。

舉例來說,從 6 開始的話:

1
6 → 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1

確實變成「1」了。歡迎回來!


用程式碼試試看:用 Python 實作考拉茲猜想

那麼,這種時候用程式碼來測試是最快的! 我們用 Python 來輸出「考拉茲數列」看看吧。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
def collatz(n):
    steps = [n]
    while n != 1:
        if n % 2 == 0:
            n = n // 2
        else:
            n = 3 * n + 1
        steps.append(n)
    return steps

# 例:從 19 開始
print(collatz(19))

執行結果:

1
[19, 58, 29, 88, 44, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1]

完美地抵達了 1。 雖然繞了不少遠路,但最後還是順利到達終點!

順帶一提,從 27 開始,也同樣會抵達 1。

1
print(collatz(27))

執行結果:

1
2
3
4
5
6
7
8
[27, 82, 41, 124, 62, 31, 94, 47, 142, 71, 214, 107, 322, 161, 484, 242,
121, 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]

竟然要花費 111 個步驟!

而且,途中甚至有膨脹到 9000 以上的情況。 這是一個繞了超級大遠路才抵達終點的模式呢。


所以,這到底哪裡厲害了?

要說這個猜想哪裡厲害的話,

明明還沒有被證明,但不管用什麼數字似乎都會變成 1

就是這一點。

咦?那麼,1兆、或者是1京呢……?

有這個想法的人,很敏銳。 實際上,使用電腦已經驗證到大約「2的68次方」左右的數字, 全部都抵達了 1 。真是難以置信……。

但是, 「全部都會變成 1」這件事,在理論上並沒有被證明出來 。 這就是數學世界中所謂的「未解決問題」。


為什麼會變成「1」? 從機率論的方法來看(數學背景)

任何數字最終都會變成 1 聽起來就像魔法一樣,但從 機率的觀點 來看,存在著「嗯,好像確實會變成那樣呢」的合理原因。

對奇數 $n$ 進行 3n + 1,答案必定會是 偶數 。 因此,在下一個步驟一定會被 2 除,實際上就相當於 $\frac{3n + 1}{2} \approx 1.5n$。

然後,這個數字再次成為偶數的機率是 $\frac{1}{2}$。 如果它是偶數,就會再被 2 除,變成 $0.75n$,比原來的數字還要小。

雖然在數學上並不嚴謹,但如果取從一個奇數跳到下一個奇數時的「倍率」幾何平均值,已知大約會是 ** $\frac{3}{4}$ 倍** (啟發式機率模型)。 換句話說, 因為數值平均來看有縮小的趨勢 ,所以最終就會像被吸入一樣掉到 1。

如果稍微改變規則會怎樣?(與其他猜想的比較)

你會想說「那如果不乘 3 而是乘 5 呢?」,對吧。 實際上,這被稱為 $5n + 1$ 問題 ,而在這種情況下,並不是所有的數字都會收斂為 1。

在 $5n + 1$ 的情況下,已經確認存在多個不同的循環(loop),並且也有人指出可能存在無限變大的數字(發散)。 另外,在 $3n - 1$ 問題 中,除了「$1 \to 2 \to 1$」的循環之外,還存在如「$5 \to 14 \to 7 \to 20 \to 10 \to 5$」等其他的循環。

由此可知,考拉茲猜想中「全部都會收斂為 1($4 \to 2 \to 1$ 的循環)」的這個性質,是建立在多麼絕妙的平衡之上。


人類的到達點①:電腦暴力破解的極限

現在,世界各地的數學家和電腦科學愛好者們,正利用分散式運算(集結全世界個人電腦運算能力的專案)和 GPU,不斷地計算著考拉茲猜想。

截至 2020 年,電腦已經確認在 $2^{68}$(約 29 京 5000 兆) 以下的所有初始值中,考拉茲猜想都是正確的(最終都會變成 1)。

然而,在數學的世界裡,我們不能因為「已經確認到了 29 京,所以全部都應該是正確的」。因為相對於無限延伸的數字汪洋來說,即便是 $2^{68}$ 也只不過是「最初的一滴水」而已。


人類的到達點②:不可判定性與陶哲軒的突破

對於「為什麼沒有人能證明出來呢?」的疑問,英國天才數學家約翰·康威(John Conway)在 1972 年證明了,將考拉茲猜想稍微擴展的問題是 「不可判定的(Turing complete)」 。 這是一個關乎電腦科學根基的驚人事實:根據規則,可能「從原理上就不存在能判定是否會抵達 1 的演算法」。考拉茲猜想本身,甚至有可能是現代數學框架下無法證明的命題。

然而在 2019 年,終於出現了重大的突破。 當代最頂尖的天才數學家之一 **陶哲軒(Terence Tao) ** ,運用偏微分方程和機率論的方法證明了:「(雖然無法嚴謹地說涵蓋全部)在幾乎所有的初始值中,考拉茲數列最終都會抵達比原數小得多的數值 」。

雖然這不是「全部都會變成 1」的完整證明,但作為 人類最接近考拉茲猜想真理的歷史性到達點 ,它轟動了全世界的數學界。


考拉茲先生是誰?

讀到這裡,你一定會想「話說回來,考拉茲是誰啊?」。 我來好好介紹一下!

  • 姓名: 洛塔爾·考拉茲(Lothar Collatz)
  • 國籍:德國
  • 生卒年:1910 年~1990 年
  • 頭銜:數學家(活躍於泛函分析與數論領域)

他在 1937 年提出了這個猜想, 之後的 80 多年來, 沒有任何人能夠證明或反證它

順帶一提,這個問題雖然非常簡單卻深奧無比, 聽說連保羅·艾狄胥(Paul Erdős,超知名數學家)都曾這麼說過。

「對於解決考拉茲猜想,數學還未發展成熟。」

也就是說,有一種說法是人類的數學還無法追上這個謎團……。


不需要「艱澀的數學公式」

考拉茲猜想的優點在於, 誰都可以玩

只要有紙和筆就能進行。 如果用 Python 寫程式,還能自動測試。 儘管如此, 最頂尖的數學家們卻正認真地挑戰它

不覺得有點令人興奮嗎?


附錄:一口氣測試的程式碼

我也附上可以一口氣測試多個數字的程式碼。

1
2
3
for n in range(1, 21):
    steps = collatz(n)
    print(f"{n}: {steps}(步驟數: {len(steps)-1})")

這會一口氣輸出「1~20」的考拉茲數列。


結論:這個世界,果然很不可思議

所以說,這就是考拉茲猜想。

  • 雖然非常簡單
  • 卻沒有人能證明
  • 在數學界是個大難題

就是這樣一個宛如不可思議集合體般的存在。

即使是程式設計初學者也能嘗試,請務必玩玩看喔~!


推薦連結(給有興趣的人)


如果想知道更多這種「不可思議系數學×程式設計」主題的人, 請輕鬆地提出「我想看更多」的要求。 之後我也會介紹黎曼猜想、質數的故事等等各種內容喔!


📮結束!


使用 Hugo 建立
主題 StackJimmy 設計