关于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
关于3N+1问题的一点探索_第1张图片

通过C语言对该问题的验证

#include 

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]都是可以验证。当然这依然不是一个严谨的证明,只是给我们这些不会证明的人一个验证的方法聊以慰藉。感兴趣的读者不妨跑着感受一下。

你可能感兴趣的:(数学,代码)