1. 程式人生 > >關於3N+1問題的一點探索

關於3N+1問題的一點探索

3N+1問題

3N+1問題,又稱冰雹猜想。
任意寫出一個自然數N,並且按照以下的規律進行變換:
如果是個奇數,則下一步變成3N+1。(操作一)
如果是個偶數,則下一步變成N/2。 (操作二)
所有的自然數經過這樣的變換都會變成1。

這本是一個由美國大學的學生們開始的數學遊戲,結果竟演變成了一個世界數學難題。前兩天被一個朋友忽悠,想了很長的時間,有了些許想法,寫出來跟大家分享一下。

數學上的一點想法

關於這個問題,最直觀的想法肯定是歸納,從較小的數向較大的數歸納。不難發現所有的偶數可以通過操作二變成比它小的奇數,那麼接下來只要考慮奇數就可以。對於4k+1型的奇數,經過操作一後一定可以被四整除,變成比原數更小的奇數,即可歸納的。然而4K+3型的奇數就不能這樣處理了,換成8K+3和8K+7也無法解決。
接下來只能換個歸納的思路了。比如通過2^k+b歸納,b是一個更小的奇數,然而這樣2^k那一部分就會逐漸變成3的冪,走不通。那麼如果把b繼續表示下去呢,這樣很自然地就想到了通過二進位制來思考這個問題。
通過實驗我們發現,每兩組連續的1之間如果隔超過一個0,那麼這兩組1是互不干擾的。即型如 1111……1

的二進位制數乘三後變為 101111……01 ,如果加1後則變為 101111……10 。不難發現1的數量不變。而如果只相隔一個0,那麼則變成前面的一組乘三後再加一,後面的一組減少一個1,新的兩組之間變成相隔兩個0。於是我們發現1的數量似乎是在不斷減少的。然而這個方法有個致命的問題,那就是對於型如 1001001001 這樣的數,經過一次操作1的個數反而又增加了。假設就這樣破滅了。
我在數學部分對於該問題的思考差不多就只有這些了,最後雖然沒能證明,不過也沒什麼遺憾的,畢竟是世界難題。在這裡分享一個號稱已經證明的論文,感興趣的讀者可以看一下。
http://preprint.math.uni-hamburg.de/public/papers/hbam/hbam2011-09.pdf

這裡寫圖片描述

通過C語言對該問題的驗證

#include <stdio.h>

int main()
{
    long long n1, n2, n3 = 2;
    scanf_s("%lld", &n1);

    while (n3 <= n1)
    {   
        n2 = n3;
        int count = 0;
        while (n2 > 1)
        {
            if (n2 % 2 == 1)
                n2 = 3 * n2 + 1;
            else
n2 /= 2; count++; } printf("%lld %d\n", n3, count); n3++; } system("pause"); return 0; }

這段程式碼可以對所有比輸入的數小的數進行操作,並輸出每一個數及其所需要的操作次數。
只要有足夠資源和耐心,一直到一個比較大的數[(2^63-2)/3]都是可以驗證。當然這依然不是一個嚴謹的證明,只是給我們這些不會證明的人一個驗證的方法聊以慰藉。感興趣的讀者不妨跑著感受一下。