c语言递归函数奇偶归一猜想,计算机科学视角下的奇偶归一猜想

c2380bea9f0633fcb3693bc9315b2a27.png

一、奇偶归一猜想

横跨半个世纪悬而未决的考兰兹猜想的别名有很多,我比较喜欢奇偶归一猜想这个名字,大家若是感兴趣,可以去搜一搜。已经有很多对数学感兴趣的爱好者和数学家正在研究、探讨它,也产生了很多优秀成果。作为一名课辅老师,我不敢说能对它了解有多透彻,只是从一个新的角度谈谈自己的看法。那么,奇偶归一猜想说的是什么呢?我们先来看一个函数:

Mod对于我们学计算机的人来说并不陌生,是求模运算,这里把它看作求余函数。一个正整数对2求余,结果为0说明它是偶数,否则说明它是奇数。

接下来对奇偶归一猜想的理解就简单了:对于每个正整数,如果它是奇数,则对它乘以3再加1;如果它是偶数,则对它除以2。然后得到一个新的正整数,对它重复前述步骤若干次后,得到的正整数一定是4,2,1,4,2,1……

下面,我用一段python程序给大家演示一下。

640.png

当x=8时,结果[x]:

640.png

当x=11时,结果[x]:

640.png

当x=27时,结果[x]:

640.png

当x=39时,结果[x]:

640.png

当x=256时,结果[x]:

640.png

因为按奇偶归一猜想,这个过程会无限重复下去,会让我的笔记本电脑中的资源慢慢损耗殆尽,直到崩溃,所以在我的代码里对重复次数作了限定,最多运行到出现3个 “4,2,1”为止。并且对输出结果作格式化处理。大家可以多观察一下以上各种结果,并试着谈谈自己的收获。

二、奇偶归一猜想小探

很多人一直在从数学角度去证明是不是对于任意一个正整数都是如此,并借助计算机强大的计算能力做出部分验证,然而始终没有人能给出一个可以完全说服大家的结论。

若用[x]表示正整数x在不断迭代中产生的数字序列,s[x]表示数列中的最小值,我们一起来看一下已有的研究成果。

1976年,Terras证明,几乎对所有的正整数x(在自然密度意义下),有s[x]

1979年,Allouche证明,对任意a>0.869,几乎对所有的正整数x(在自然密度意义下),有s[x]

1994年,Korec证明,对任意a>ln3/ln4≈0.7924,几乎对所有的正整数x(在自然密度意义下),有s[x]

前不久,菲尔兹奖获得者陶哲轩试图证明,只要是一个趋于正无穷的实数列{f(x)},那么几乎对所有的正整数x(在对数密度意义下),有s[x]

从以上可以看出,此类研究大都着眼于数学上的性质与证明,但是,还有一个比较清晰的视角,那就是[x]的生成过程。

从计算科学角度看,奇偶归一猜想就是一个没有终止条件的递归迭代(分段函数遇到递归调用特别容易出现这种情形),结果自然是无限重复。为什么会这样?从f(x)来看,仅因为它是一个分段函数且自己调用自己吗?那我们再看一个分段函数:

640.png

如果迭代过程相同,那么g(12)会和f(12)一样吗?显然不完全是,

640.png

再看一个:

640.png

还是在相同迭代过程下,h(12)=1。

因此,导致奇偶归一猜想的结论是4、2、1不断重复的根本原因是函数定义本身与递归,而不是数或函数的性质。

三、计算机科学下的奇偶归一猜想

我用下面的状态图表示奇偶归一猜想的运行时(即[x]的产生过程)。

640.png

其中,圆圈“○”是运行时状态,圆内代表的是操作,圆外字母是状态名。方向箭头为运行方向,共有4个无条件方向,2个条件方向。

通过观察状态图,很容易发现一个设计上的缺陷:没有终止态。

也就是说,函数定义本身没问题,递归迭代没问题,但是在递归迭代的前提下遇到这样定义的函数,就出现缺陷,或漏洞。

我们来进一步分析问题出现在哪里。

假设在运行方向下从状态A运行到状态C再到状态A的一次执行过程叫作路径“ABCA”(路径ABDA的意义类似),我们分别统计一下在[x]的产生过程中路径ABCA和路径ABDA的执行次数。

640.png

这段程序和之前那段程序的核心过程基本一样,只是将输出改成路径统计,仍是运行到第3次产生“1”后结束。如当x=8时,产生的[x]:8、4、2、1、4、2、1、4、2、1,其中ABCA执行2次,ABDA执行7次。然后将正整数X的输入改为随机产生。

这段程序的作用是:随机产生10个1到100的正整数x,统计在产生[x]的过程中两条路径ABCA与ABDA各自执行次数。下面是运行一次后的统计结果:

640.png

Rate这一列是路径ABDA执行次数与路径ABCA执行次数之比,它反映的是路径执行的次数的多少。为便于观察,我准备将以上结果制成一幅图。

路径跟踪程序:

640.png

路径跟踪数据表:

640.png

表中序号1,2,……,41表示在生成一个正数X的[x]时,一个迭代发生的次序,即第1次迭代,第2次迭代等。0表示当前执行的路径是ABDA,1表示当前执行的路径是ABCA。

根据路径跟踪数据表制作的路径跟踪图:

640.png

“1”这行的点数比“0”这行的点数要少。这意味着在刚才10个随机数各自的[x]生成过程中,ABCA的执行总数远小于ABDA的执行总数。在单独的某一个数的[x]生成过程中亦是如此。实际上把数的个数增加至任意个,远不止10个,结果一样。这和在之前运行结果统计表中Rate这列反映的意义相同。

实际上跟不跟踪整个执行过程,看不看具体数据,都可以得到这个结论,看f(x)这个函数的定义就知道:但凡x是偶数就一直除以2直到变为奇数;而成为奇数后立马通过3x+1变成偶数。这个过程一直继续并重复。

因为ABCA的执行次数较小,主要是起到一个将奇数调节为偶数的作用,所以函数

640.png

就近似于函数

640.png

其近似意义是一个大于1的偶数不断地除以2,最终结果一定是x=1。但是在原f(x)中还有一个3x+1的调节,使x变成一个大于1的偶数,这样一个无限循环就产生。

因为任何一个正整数无论它多大,总是非奇即偶,因而在递归迭代与f(x)的作用下,一定会进入4,2,1……的无限循环。这也间接地说明,当“静态”的数学遇到“运动”的计算机科学,就会产生一些有趣的现象。

我觉得这个猜想没什么多大意义,可以作为一项数学兴趣探究,倒是一个函数在递归迭代的过程中会自我调整,这种特性非常有趣。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值