關於3N+1問題的一點探索
阿新 • • 發佈:2019-01-05
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
我在數學部分對於該問題的思考差不多就只有這些了,最後雖然沒能證明,不過也沒什麼遺憾的,畢竟是世界難題。在這裡分享一個號稱已經證明的論文,感興趣的讀者可以看一下。
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]都是可以驗證。當然這依然不是一個嚴謹的證明,只是給我們這些不會證明的人一個驗證的方法聊以慰藉。感興趣的讀者不妨跑著感受一下。