Featured image of post 考拉兹猜想

考拉兹猜想

“任何数字最终都会变成1”是真的吗?——玩转考拉兹猜想

大家好!我是kenji。

突然问一下,如果你听说“任何数字最终都会变成1的规则”, 会不会觉得有些不可思议?

比如19,或者87,甚至1000000也是如此。 按照特定的规则去处理数字,不知为何最后都会收敛到“1”。

像梦一样的故事,这就是 考拉兹猜想(Collatz Conjecture)


考拉兹猜想究竟是什么?

首先介绍一下规则。

  • 起点:选择任意一个 正整数

  • 操作:

    • 如果是偶数 → 减半(n → n / 2)
    • 如果是奇数 → 乘以3再加1(n → 3n + 1)

一直重复这个过程,猜想认为 任何数字最终都会到达1

比如,从 6 开始:

1
6 → 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1

确实变成了“1”。欢迎回来!


用代码试试看:用Python写考拉兹猜想

好了,这种时候写代码测试最快! 让我们用Python输出一下“考拉兹数列”。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
def collatz(n):
    steps = [n]
    while n != 1:
        if n % 2 == 0:
            n = n // 2
        else:
            n = 3 * n + 1
        steps.append(n)
    return steps

# 例子:从19开始
print(collatz(19))

运行结果:

1
[19, 58, 29, 88, 44, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1]

完美到达了1。 虽然绕了不少远路,但最后还是顺利冲过终点!

顺便说一下,即使从 27 开始,也同样会到达1。

1
print(collatz(27))

运行结果:

1
2
3
4
5
6
7
8
[27, 82, 41, 124, 62, 31, 94, 47, 142, 71, 214, 107, 322, 161, 484, 242,
121, 364, 182, 91, 274, 137, 412, 206, 103, 310, 155, 466, 233, 700, 350,
175, 526, 263, 790, 395, 1186, 593, 1780, 890, 445, 1336, 668, 334, 167,
502, 251, 754, 377, 1132, 566, 283, 850, 425, 1276, 638, 319, 958, 479,
1438, 719, 2158, 1079, 3238, 1619, 4858, 2429, 7288, 3644, 1822, 911,
2734, 1367, 4102, 2051, 6154, 3077, 9232, 4616, 2308, 1154, 577, 1732,
866, 433, 1300, 650, 325, 976, 488, 244, 122, 61, 184, 92, 46, 23, 70, 35,
106, 53, 160, 80, 40, 20, 10, 5, 16, 8, 4, 2, 1]

竟然花了111步!

而且,中途还有膨胀到9000以上的阶段。 这真是绕了天大的远路才到达终点的模式啊。


那么,到底哪里厉害呢?

这个猜想的厉害之处在于,

虽然还没有被证明,但似乎不管用什么数字来算都会变成1

这一点。

诶?那1兆呢,1京呢……?

能想到这点的你很敏锐。 实际上,用计算机已经验证到了“2的68次方”左右, 全部都到达了1。难以置信……。

但是,“全部都会这样”并没有在理论上被证明。 这就是数学世界里的“未解决问题”。


考拉兹是谁?

读到这里,你肯定会想“考拉兹到底是谁?”吧。 下面就好好介绍一下!

  • 姓名:洛塔尔·考拉兹(Lothar Collatz)
  • 国籍:德国
  • 生卒年:1910年〜1990年
  • 头衔:数学家(活跃于泛函分析和数论领域)

他在1937年提出了这个猜想, 此后,在长达80多年的时间里,谁也没能证明,也没能推翻

顺便一提,这个问题虽然如此简单,却又无比深奥, 以至于连保罗·埃尔德什(超著名的数学家)都这样说过:

“数学还没有成熟到足以解决考拉兹猜想。”

也就是说,人类的数学水平可能还没赶上这个谜团……。


不需要“复杂的公式”

考拉兹猜想的美妙之处在于,任何人都能玩

只要有纸和笔就能算。 用Python写几行代码,就能自动测试。 不仅如此,最顶尖的数学家们也在认真挑战它

怎么样,是不是让人热血沸腾?


彩蛋:一次性测试的代码

这里也附上可以一次性测试多个数字的代码。

1
2
3
for n in range(1, 21):
    steps = collatz(n)
    print(f"{n}: {steps}(步数: {len(steps)-1})")

这能一口气输出“1~20”的考拉兹数列。


结论:这个世界,果然很不可思议

这就是考拉兹猜想。

  • 明明极其简单
  • 却没人能证明
  • 在数学界是个大难题

它就像是一个不可思议的集合体。

即使是编程初学者也能尝试,请务必玩玩看哦〜!


推荐链接(面向感兴趣的人)


如果想了解更多这种“不可思议的数学×编程”题材, 请随时向我提出“想了解更多”的请求。 之后,我还会介绍黎曼猜想、素数的故事等各种内容!


📮结束!


comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计