希尔顿序列(Hailstone Sequence)
希尔顿序列(Hailstone Sequence)问题(即考拉兹猜想,又称奇偶归一猜想,冰雹猜想)作为一个著名的数学问题,其正确与否至今都未能得到证明。即:对任一正整数 n,若为偶数则除以 2,若为奇数则乘 3 再加 1,最后 n 总会变为 1。其表达式如下所示:
举个例子
问题的特殊之处在于:尽管很容易将这个问题讲清楚,但直到今天仍然不能保证这个问题的算法对所有可能的输入都有效——即至今没有人证明对所有的正整数该过程都终止。
import numpy as np import matplotlib.pyplot as plt def hailstone(n): length = 1 while(1<n): if n%2 == 0: n = n/2 else: n = n*3 + 1 length += 1 return length x = [n for n in range(10000)] y = [hailstone(h) for h in x] plt.scatter(x,y) plt.xticks(np.arange(min(x),max(x)+1,1000)) plt.xlabel('n') plt.ylabel('hailstone(n)') plt.show()
我们可以看出来,因为最后的图形貌似冰雹,所以被称为Hailstone Sequence
但是我们一直有一个问题,是否存在一些数,可以使得while循环一直执行下去,也就是说这个函数到底满不满足有穷性?意思是对于任意的n,while循环都会执行有限次而退出吗?
可惜至今学术界都无法证明对于任意的n,一定满足:hailstone(n)< ∞
算法的主要特点有时并不容易证明。例如,人们通常认为算法的有穷性是最容易判断的,其实不然。由于 无法证明上述程序的 “有穷性”,故 不能称该程序是一个算法。可见证明算法有穷性的困难。
Collatz 猜想
有一个很有意思的问题,我们这样实验:
def hailstone(n): length = 1 seq = [] while(1 < n): if n % 2 == 0: n = n//2 seq.append(n) else: n = n * 3 + 1 seq.append(n) length += 1 return length,seq print(hailstone(7)) print(hailstone(17)) print(hailstone(103))
打印结果如下,数字7,17,103的 Hailstone 序列长度分别为 17, 13, 88,最惊奇的是:每个这
种序列的最后三个数一定是4,2,1
感兴趣的可一直向右滑动,查看序列的结尾是不是4,2,1这个周期!
并且已经得出:无论使用什么起始值,每个hailstone 序列最终都将停留在4、2、1个周期上。
计算机甚至已经检查了所有起始值(最大到5 × 260)(一个 19 位数字),并发现最终出现4、2、1个周期。
但是很遗憾:依然没有科学家能够证明所有序列都是这种情况。
这个开放问题在数学家 Lothar Collatz 于 1937 年首次提出该问题之后被称为 Collatz猜想。
令人惊讶的是,即使是最好的数学家都无法回答,如此简单的形成序列的公式也会引发一个问题。
强悍的27
冰雹的最大魅力在于不可预知性。英国剑桥大学教授John Conway找到了一个自然数27。虽然27是一个貌不惊人的自然数,但是如果按照上述方法进行运算,则它的上浮下沉异常剧烈:首先,27要经过77步骤的变换到达顶峰值9232,然后又经过34步骤到达谷底值1。全部的变换过程(称作“雹程”)需要111步,其顶峰值9232,达到了原有数字27的342倍多,如果以瀑布般的直线下落(2的N次方)来比较,则具有同样雹程的数字N要达到2的111次方。其对比何其惊人!
但是在1到100的范围内,像27这样的剧烈波动是没有的(54等27的2的次方倍数的数除外)
27的归一步数要经过多次剧烈波动的奇偶变换,其路径呈不光滑锯齿
每日一句
Winners do what losers don’t want to do.(胜利者做失败者不愿意做的事!)