莫潇羽@无忆研习社(www.wuyi.wiki) | 转载请注明出处
快速摘要
2026年2月底,一件足以载入计算机科学史册的事情发生了:图灵奖得主、《计算机程序设计艺术》作者高德纳(Donald Knuth)在斯坦福大学官网发布了一篇名为「Claude's Cycles」的论文,开篇两个字就是「Shock! Shock!」。他花了数周都没有解决的有向图哈密顿环分解问题,被Anthropic的推理模型Claude Opus 4.6在大约一小时内、经过31次系统性探索后找到了构造方法。高德纳随后完成了严格的数学证明,并将这一构造正式命名为「Claude-like decomposition」(类Claude分解)。 这不是简单的「AI做数学题」,而是AI首次在一位顶级数学家的原创研究论文中被正式记录为关键贡献者。往下看,莫潇羽将为你详细拆解这道题的数学背景、Claude的31步探索全过程、最终的构造方法,以及这件事对未来人机协作研究范式的深远影响。
一、事件始末:88岁算法大师遇到了什么难题
1.1 高德纳是谁?为什么他说的话这么有分量
如果你在计算机科学领域待过一段时间,就一定听说过Donald Ervin Knuth这个名字——中文名叫高德纳。这个名字是1977年他访华前,由清华大学姚期智教授的夫人姚储枫为他起的。
高德纳1938年出生于美国密尔沃基,是斯坦福大学荣休教授。他是公认的「算法分析之父」,在理论计算机科学的多个分支领域做出了奠基性贡献。他最为人知的两项成就是:
第一,写了一套叫《计算机程序设计艺术》(The Art of Computer Programming, TAOCP)的书。 这套书从1962年开始构思,最初设想为十二章的单册著作,后来扩展为七卷本的鸿篇巨制。第一卷于1968年出版,到1976年已经售出超过一百万册,被翻译成十种语言。1999年,《美国科学家》期刊将它列为20世纪最重要的12部学术专著之一,与爱因斯坦的相对论、罗素和怀特海的《数学原理》并列。比尔·盖茨曾经说过一句广为流传的话,大意是:如果你真觉得自己是个好程序员,就去读TAOCP吧,如果你能读完,就把简历发给我。截至2025年,已经出版了第1、2、3、4A和4B卷,高德纳目前正全力撰写第4C卷。
第二,发明了TeX排版系统。 1977年,高德纳在准备TAOCP第二卷第二版时,发现当时的排版技术无法满足他对数学公式精确呈现的要求。于是他决定暂停写书,花了大约十年时间开发了TeX排版系统和配套的METAFONT字体系统。至今,全球物理学和数学领域的绝大多数学术论文都使用TeX排版。这一「副产品」的影响力几乎不亚于TAOCP本身。
1974年,年仅36岁的高德纳获得了图灵奖——计算机科学领域的最高荣誉,相当于这个领域的诺贝尔奖。他至今仍然是获得该奖时最年轻的得主之一。此外,他还获得过美国国家科学奖章(1979年,由卡特总统颁发)、京都奖(1996年)、哈维奖(1995年)、法拉第奖(2011年)等一百多项大大小小的荣誉,是英国皇家学会外籍会员、法国科学院通讯院士、美国数学学会会士。他于1992年从斯坦福大学的常规教学和研究岗位退休,专心撰写TAOCP的剩余卷册,目前的头衔是「计算机程序设计艺术」荣休教授。
高德纳为人幽默风趣。他承诺给任何在他著作中发现错误的人奖励2.56美元,因为「256美分正好是十六进制的一美元」。这种将计算机文化融入日常生活的做法非常符合他的风格。他还有一个广为人知的习惯:自1990年起就不再使用电子邮件,理由是他需要保持专注来完成TAOCP。如果你要联系他,可以写纸质信件寄到斯坦福大学。他的家中还有一台16音栓的管风琴,音乐是他最大的业余爱好。2016年他完成了一部管风琴曲《末日幻想曲》(Fantasia Apocalyptica),这是他将《圣经·启示录》的希腊文文本「翻译」成音乐的作品。
高德纳对AI的态度转变特别值得关注。 2023年4月,他给ChatGPT出了一套20道题的测试,涵盖了从编程到创意写作到事实性问题的多个领域。结果让他失望——AI在回答关于小说家Leon Uris的一本书的章节结构时产生了严重的「幻觉」(编造了不存在的内容)。他当时的评价相当直接,大意是这个东西基本上是在研究「如何伪装具备能力」,并对斯蒂芬·沃尔弗拉姆(Wolfram语言的创造者)表示这个话题「完全不适合他」。
三年后的今天,这位曾经明确的怀疑论者,在自己的研究论文中写下了「我恐怕得重新审视自己对生成式AI的看法」。这种转变不是因为营销宣传或社交媒体上的热议,而是因为一个AI系统在他自己的核心研究领域——组合数学和算法设计——做出了他无法忽视的实质性贡献。
了解了这些背景,你就能理解,当这样一位对AI一直持保守态度的计算机科学泰斗公开表示「我恐怕得重新审视自己对生成式AI的看法了」时,这句话的分量有多重。事实上,早在2023年,高德纳曾给ChatGPT出了一套20道题的测试,结果并不理想,他当时的评价是「这基本上是在研究如何伪装能力」。三年后的今天,他的态度发生了明显转变。
1.2 一道写进教科书的未解题
故事的起因很简单。高德纳正在为TAOCP的新章节撰写关于「有向哈密顿环」的内容,其中准备了一道习题。他自己已经解决了这道题的一个特殊情况((m=3)),然后把一般情况的推广作为练习题的答案留给读者。他的朋友Filip Stappers通过计算实验,找到了 (4 \leq m \leq 16) 范围内的所有解,这说明一般情况下的解很可能是存在的。但是,没有人能找到一个适用于所有情况的通用构造方法。
高德纳在论文开头这样写道,大意是:我昨天得知,一个我花了数周研究的未解问题,刚刚被Claude Opus 4.6解决了——这是Anthropic公司三周前发布的混合推理模型。看来我迟早得重新审视自己对「生成式AI」的看法了。得知自己的猜想不仅有一个漂亮的解法,同时还能见证自动推理与创造性问题求解方面的这一戏剧性进步,真是令人欣喜不已。
论文发布在斯坦福大学高德纳的个人主页上:https://www-cs-faculty.stanford.edu/~knuth/papers/claude-cycles.pdf(莫潇羽已验证该链接有效)。
二、这道图论题到底在问什么:从零开始理解问题
如果你不是数学或计算机科学专业的,不用担心。莫潇羽@无忆研习社 在这里会尽量用通俗的方式把这个问题讲清楚,让你即使没有图论基础也能跟上。
2.1 基础概念:什么是图、有向图、哈密顿环
在图论中,「图」并不是我们日常说的图片或图表,而是一种由「点」(顶点)和「边」(连接点与点之间的线)构成的抽象数学结构。你可以想象城市(顶点)之间用公路(边)连接——这就是一个图。
如果每条边都有方向(就像单行道一样,只能从A到B,不能反过来),那这个图就叫做「有向图」(directed graph,简称 digraph),其中的边叫做「有向边」或「弧」(arc)。现实生活中的例子包括网页之间的超链接(从一个网页指向另一个网页)、社交媒体上的关注关系(我关注你,但你不一定关注我)等。
哈密顿环(Hamiltonian cycle)是图论中一个经典且困难的概念:它是一条路径,从某个顶点出发,沿着边走过图中的每一个顶点恰好一次,最后回到起点形成一个闭合的环。这个概念以19世纪爱尔兰数学家威廉·罗恩·哈密顿命名,他在1857年研究正十二面体的边图时发明了一个叫做「环游世界游戏」的数学玩具,要求玩家沿着正十二面体的边访问所有20个顶点恰好一次。
为了帮助你直观理解,莫潇羽在这里举一个生活化的例子。假设你要做一次自驾游,计划访问全国10个城市,每个城市只去一次,最后回到出发点。如果城市之间只有部分公路相连(而不是任意两个城市之间都有直达公路),那么找到这样一条路线就是「寻找哈密顿环」的问题。如果公路是单行道的,那就是在有向图中找哈密顿环。
判断一个图是否存在哈密顿环,本身就是一个NP完全问题——这是计算复杂性理论中最著名的问题类型之一。通俗来说,NP完全意味着目前没有已知的高效算法能在多项式时间内解决所有情况,而且学术界普遍相信这样的算法可能根本不存在。哈密顿环问题是卡普(Richard Karp)在1972年确定的21个NP完全问题之一,也是理论计算机科学中最核心的难题之一。
值得注意的是,哈密顿环问题与另一个著名的图论概念——欧拉回路(Eulerian circuit)看起来很像但本质不同。欧拉回路要求经过每条边恰好一次(不要求经过每个顶点),而哈密顿环要求经过每个顶点恰好一次(不要求经过每条边)。有趣的是,判断欧拉回路是否存在是一个非常简单的问题(只需检查每个顶点的度数),而判断哈密顿环是否存在则是极其困难的。这种难度上的巨大反差是图论中最令人惊讶的现象之一。
2.2 三维环形网格:问题的舞台
现在来看高德纳的具体问题。想象一个三维网格空间,像一个 (m \times m \times m) 的「魔方」。这个空间中有 (m^3) 个点,每个点可以用三个坐标 ((i, j, k)) 表示,每个坐标的取值范围是 (0) 到 (m-1)。
举个具体的例子:当 (m=3) 时,空间是 (3 \times 3 \times 3) 的立方体,共有 (3^3 = 27) 个点。每个点的坐标形如 ((0,0,0))、((1,2,0))、((2,2,2)) 等,其中每个坐标都是0、1或2。当 (m=5) 时,空间是 (5 \times 5 \times 5),共有125个点。
关键的规则是:从每个点出发,可以且只能沿三个方向移动——
- 把第一个坐标 (i) 增加1,记作 ((i, j, k) \to (i+1, j, k))
- 把第二个坐标 (j) 增加1,记作 ((i, j, k) \to (i, j+1, k))
- 把第三个坐标 (k) 增加1,记作 ((i, j, k) \to (i, j, k+1))
如果某个坐标已经到了 (m-1),增加1后就回到0。这就像一个「环形」空间——走到边界就会从另一边出来,类似于很多经典游戏中的地图设计。数学上这叫做模运算(modular arithmetic),也就是做除法取余数。例如当 (m=5) 时,如果当前 (i=4),那么 (i+1 = 5 \bmod 5 = 0),又回到了起点。
如果你熟悉拓扑学,可以这样理解:这个空间实际上是一个三维环面(3-torus)——三个方向都是周期性的,没有边界。就像一维的环面是一个圆(或者说游戏中从屏幕右边走出去会从左边出来),二维的环面是一个「甜甜圈」表面,三维的环面就是这个三维网格空间。
在数学上,这种结构叫做凯莱有向图(Cayley digraph)。它是群论中的一个概念,但你现在不需要理解群论,只需要知道:这是一个每个点都恰好有三条出边的有向图。整个图一共有 (m^3) 个顶点,(3m^3) 条有向边。
为了帮助你建立直觉,莫潇羽@无忆研习社 用一个二维类比来说明。想象一个 (5 \times 5) 的棋盘,每个格子 ((i, j)) 可以向右走(增加 (i))或向下走(增加 (j)),到了边界就回到另一边。这个二维版本有25个顶点、50条有向边(每个顶点2条出边)。在这个二维图上找2条不重叠的哈密顿环来覆盖所有50条边,这已经不容易了。现在把这个问题推广到三维,难度呈指数级增长。
2.3 核心问题:三条互不相交的哈密顿环
高德纳的问题不是简单地在这个图中找一条哈密顿环(那虽然也不容易,但不是最难的部分),而是要同时找到三条哈密顿环,并且满足以下条件:
- 每条环都是哈密顿环,即经过所有 (m^3) 个顶点恰好一次然后回到起点
- 三条环加在一起,恰好覆盖了图中所有的 (3m^3) 条有向边
- 每条边只被恰好一条环使用——没有重复,也没有遗漏
用数学术语来说,这叫做图的哈密顿分解(Hamiltonian decomposition)——把一个图的所有边完美地拆分成若干条哈密顿环。
2.4 为什么这个问题如此困难
这个问题的困难之处在于多个层面,莫潇羽逐一为你拆解。
第一层困难:组合爆炸。 在每个顶点,你都需要从三条出边中选择一条作为当前路径的下一步。这意味着可能的选择方案总数达到了:
[
3^{m^3}
]
举几个例子感受一下这个数字的恐怖:
- 当 (m=3) 时,(m^3 = 27),方案数 = (3^{27} \approx 7.6 \times 10^{12})(约7.6万亿)
- 当 (m=5) 时,(m^3 = 125),方案数 = (3^{125} \approx 1.3 \times 10^{59})
- 当 (m=7) 时,(m^3 = 343),方案数 = (3^{343} \approx 2.3 \times 10^{163})
作为对比,可观测宇宙中的原子总数大约只有 (10^{80}) 个。当 (m=7) 时,方案数已经是宇宙中原子数的 (10^{83}) 倍。显然,暴力搜索是完全不可行的。
第二层困难:全局约束的严苛性。 不仅仅是某一条路径需要正确,而是三条路径必须同时满足约束。这意味着在每个顶点做出的选择不仅影响当前路径,还隐含地影响了另外两条路径可用的边。一条路径选了某条边,另外两条路径就不能再用这条边。这种全局耦合使得局部的贪心策略几乎不可能成功——你在一个地方做出的「好」选择,可能会在远处造成不可调和的矛盾。
第三层困难:对称性的陷阱。 这个图具有非常高的对称性(每个顶点看起来都一样),这在某种程度上反而增加了难度。直觉上,对称性应该让问题更简单,因为你可以利用对称性来约束解的形式。但问题在于,最终的三环分解打破了图的对称性——三条环把边分成了三组,这种分组本身不再具有原图的所有对称性。如何在高对称性的结构中找到正确的对称性破缺方式,这本身就是一个深刻的数学问题。
高德纳自己解决了 (m=3) 的情况。他的朋友Filip Stappers通过计算实验验证了 (4 \leq m \leq 16) 的情况下解都存在。这强烈暗示:对于一般的 (m),解应该是存在的。但谁也找不到那个通用的构造规则。问题就这样悬在那里,等待有人来突破。
三、Claude的31步探索:像研究生一样做研究
最精彩的部分来了。Filip Stappers决定把这个问题交给Claude Opus 4.6来尝试。他给模型提供了精确的问题描述,并制定了一条重要规则:每次运行程序后,Claude都必须记录探索的进展。 这使得整个过程变得可追溯。
在大约一小时的时间里,Claude进行了31次系统性探索。莫潇羽@无忆研习社 根据论文和相关报道,为你还原这个过程的关键节点。
3.1 第一阶段:简单尝试(探索1-5)
探索1-2:线性函数的尝试。 Claude首先尝试了最直觉的方法:用一个简单的函数 (g(i,j,k)) 来决定每个点应该往哪个方向走。它试了线性函数和二次函数,但很快发现这些简单的数学表达式无法满足哈密顿环的全局约束。一个点的选择看起来没问题,但连成整体后路径就不对了。
探索3-4:暴力搜索。 Claude转而尝试计算方法,使用深度优先搜索(DFS)来穷举可能的路径。但正如我们前面分析的,搜索空间实在太大了,算法在合理时间内无法完成。
探索5:二维分析。 Claude开始降维思考——如果只看二维情况((m \times m) 的网格),问题会简单得多。它发现在二维情况下可以构造一种「蛇形路径」(serpentine pattern),然后尝试将这个思路推广到三维。Claude发现的这种「蛇形」构造,后来被高德纳指出实际上对应了一种经典的数学对象——模 (m) 进制格雷码(modular m-ary Gray code)。有趣的是,Claude并不「知道」自己在重新发现一个已有的数学结构,它完全是从问题约束出发自行推导出来的。
3.2 第二阶段:概念突破(探索6-15)
这个阶段,Claude开始展现出类似人类研究者的行为模式:提出假设、验证、失败、重新调整方向。如果你做过科研或者深入研究过某个技术难题,对这种「两步前进一步后退」的体验一定不陌生。
探索6-10:三维蛇形路径的困境。 Claude构造了一种类似格雷码的三维蛇形路径,成功生成了第一条路径。具体来说,这种路径在三维空间中像一条蛇一样蜿蜒前行——先沿一个方向走到头,然后在另一个方向上挪一步,再沿第一个方向反向走回来。这种方法在生成单条路径时效果不错。但关键问题是:当第一条路径选好后,剩余的边能否再分解成两条哈密顿环?Claude发现剩余结构非常复杂,图的连通性和可分解性都出现了问题,难以进一步分解。这是一个典型的「局部最优不等于全局最优」的例子:单独看第一条路径很漂亮,但它消耗掉的边使得剩余问题变得更难。
探索11-14:多种策略并行。 Claude同时探索了多个方向,包括代数方法、随机搜索和更精细的分层策略。在这个过程中,它不断地编写Python程序进行数值实验,检验每种想法的可行性。值得注意的是,在这个阶段,Claude自主识别出了这个图的数学结构——它认出这是一个凯莱有向图,对应于群 (\mathbb{Z}_m \times \mathbb{Z}_m \times \mathbb{Z}_m) 上以三个标准生成元为基础的有向图。高德纳在论文中特别提到了这一点,显然对Claude能够自主进行这种概念层面的识别感到印象深刻。这说明Claude不仅在机械地尝试,还在进行概念层面的重新建模——它在用更抽象的数学语言来理解问题。
探索15:纤维分解——关键的概念突破。 这一步至关重要,可以说是整个31步探索中最关键的转折点。Claude提出了一个叫做纤维分解(fiber decomposition)的想法。「纤维」这个词来自数学中的纤维丛理论,这里指的是按照某个参数将空间分成一系列「层」或「切片」的方法。
核心观察是:如果定义一个新的量
[
s = (i + j + k) \bmod m
]
那么对于图中任何一条有向边(无论是把 (i)、(j) 还是 (k) 加1),这条边总是把顶点从「层」(s) 移到「层」(s+1)(模 (m))。这是因为三种移动都会使 (i+j+k) 的值增加1,所以 (s) 也相应增加1。
这个简单但深刻的观察意味着:整个三维图可以按照 (s) 的值分成 (m) 层,每一层包含所有满足 (i+j+k \equiv s \pmod{m}) 的顶点。每一层内部的结构,本质上像一个二维网格——因为当 (s) 固定后,(k) 被 (i) 和 (j) 唯一确定((k = (s - i - j) \bmod m)),所以每一层恰好有 (m^2) 个顶点,可以用 ((i, j)) 来索引。
用代码来理解这个概念可能更直观:
# 纤维分解示意
m = 5 # 以m=5为例
# 按s值将所有顶点分层
layers = {s: [] for s in range(m)}
for i in range(m):
for j in range(m):
for k in range(m):
s = (i + j + k) % m
layers[s].append((i, j, k))
# 每一层恰好有m^2=25个顶点
for s in range(m):
print(f"层 s={s}: {len(layers[s])} 个顶点")
# 输出: 层 s=0: 25 个顶点, 层 s=1: 25 个顶点, ...
这样一来,哈密顿环的路径就可以理解为:在相邻层之间不断跳跃(从 (s) 到 (s+1),再到 (s+2),……,最后从 (m-1) 回到 (0)),每跳一步就访问下一层的一个新顶点。走完 (m) 步后回到起始层,但访问的是同一层的不同顶点。走完 (m \times m^2 = m^3) 步后,所有顶点都被访问恰好一次。
3.3 第三阶段:挣扎与坚持(探索16-29)
有了纤维分解的概念框架后,Claude并没有马上找到答案。接下来的十几次探索,它尝试了各种方法来在这个框架下构造具体的解。
探索16-20:随机搜索和模拟退火。 Claude使用了模拟退火算法(Simulated Annealing)等启发式搜索方法,对于具体的某些 (m) 值确实找到了解。但这些解是个案的、数值的,没有揭示通用规律。
探索21-24:各种代数尝试。 Claude尝试了坐标旋转、超平面切割等更高级的代数构造方法。探索24中,它声称找到了 (m=4, 6, 8)(偶数情况)的个别解,但同样无法推广。
探索25:关键的自我反思。 在这一步,Claude对自己说了一句话(被记录在日志中),大意是:「模拟退火可以找到具体的解,但无法给出通用构造。需要纯数学方法。」这个自我判断标志着策略的又一次重大转向——从计算搜索回到数学构造。
探索27:接近但未成功。 Claude尝试了一种「单超平面+旋转」的方法,几乎成功,但在某些边界情况下出现了矛盾。Claude记录道,大意是:「这个方法行不通。我们必须允许方向函数在旋转轨道的不同位置取不同的值。」
探索28-29:重新审视旧方案。 Claude回过头来仔细分析之前模拟退火找到的那些具体解,试图从中提取出数学模式。它注意到一个有趣的现象:在那些成功的解中,每个纤维内的选择(即在三个方向中选哪一个)似乎只依赖于单个坐标的值。
3.4 第四阶段:突破(探索30-31)
探索30:发现结构模式。 Claude在分析早期解的过程中,注意到一个统一的模式:选择哪个坐标递增,只需要根据 (s)、(i)、(j) 的边界情况(是否等于0或 (m-1))来决定。
探索31:最终的构造规则。 Claude提出了一套简洁而完整的规则。核心思想仍然基于 (s = (i + j + k) \bmod m),然后根据 (s) 的值分三种情况,再根据 (i) 或 (j) 的值决定具体的移动方向。论文中将这种移动称为「bump」(递增),含义是「将某个坐标加1,取模 (m)」。
四、Claude找到的构造方法:Bump规则的技术细节
这是整篇文章最硬核的部分。莫潇羽@无忆研习社 会尽量把数学细节讲清楚,但如果你觉得吃力,可以跳过具体公式,理解大意即可。
4.1 第一条哈密顿环的规则
给定一个顶点 ((i, j, k)),首先计算 (s = (i + j + k) \bmod m)。然后按以下规则决定「bump」(递增)哪个坐标:
- 当 (s = 0) 时:如果 (j = m-1),则bump (i)(即下一个顶点是 ((i+1, j, k)));否则bump (k)(下一个顶点是 ((i, j, k+1)))
- 当 (0 < s < m-1) 时:如果 (i = m-1),则bump (k);否则bump (j)
- 当 (s = m-1) 时:如果 (i > 0),则bump (j);否则bump (k)
(所有加法都是模 (m) 的。)
用伪代码来表达更加清晰:
def next_vertex_cycle1(i, j, k, m):
"""计算第一条哈密顿环中(i,j,k)的后继顶点"""
s = (i + j + k) % m
if s == 0:
if j == m - 1:
return ((i + 1) % m, j, k) # bump i
else:
return (i, j, (k + 1) % m) # bump k
elif 0 < s < m - 1:
if i == m - 1:
return (i, j, (k + 1) % m) # bump k
else:
return (i, (j + 1) % m, k) # bump j
else: # s == m - 1
if i > 0:
return (i, (j + 1) % m, k) # bump j
else:
return (i, j, (k + 1) % m) # bump k
4.2 另外两条哈密顿环的规则
论文中给出了第二条和第三条环的类似规则,结构上与第一条类似但细节不同。
第二条环(c=1)的规则:
- 当 (s = 0) 时:bump (j)(无论其他坐标的值如何,但如果 (i = m-1),则改为bump (k))
- 当 (0 < s < m-1) 时:如果 (j = 0),则bump (i);否则bump (k)
- 当 (s = m-1) 时:如果 (j = 0) 且 (i = 0),则bump (i);如果 (j = 0) 且 (i > 0),则bump (k);否则bump (i)
第三条环(c=2) 则是前两条规则使用的边之外的所有剩余边——因为每个顶点恰好有三条出边,前两条环各选了一条,第三条自然就是剩下的那条。
4.3 用代码完整实现并验证
下面是一个可以独立运行的Python程序,用来生成并验证这三条哈密顿环。莫潇羽@无忆研习社 鼓励有编程基础的读者自己运行一遍,亲眼看看这个构造的美妙之处:
def generate_cycle1(m):
"""生成第一条哈密顿环"""
path = []
i, j, k = 0, 0, 0
for _ in range(m ** 3):
path.append((i, j, k))
s = (i + j + k) % m
if s == 0:
if j == m - 1:
i = (i + 1) % m # bump i
else:
k = (k + 1) % m # bump k
elif s < m - 1:
if i == m - 1:
k = (k + 1) % m # bump k
else:
j = (j + 1) % m # bump j
else: # s == m - 1
if i > 0:
j = (j + 1) % m # bump j
else:
k = (k + 1) % m # bump k
return path
def verify_hamiltonian(path, m):
"""验证路径是否为哈密顿环"""
n = m ** 3
if len(path) != n:
return False, "路径长度不对"
# 检查所有顶点是否都被访问且仅被访问一次
visited = set()
for v in path:
if v in visited:
return False, f"顶点 {v} 被重复访问"
visited.add(v)
if len(visited) != n:
return False, f"只访问了 {len(visited)} 个顶点,应该是 {n} 个"
# 检查最后一个顶点是否能回到第一个顶点
last = path[-1]
first = path[0]
diff = tuple((first[d] - last[d]) % m for d in range(3))
valid_bumps = [(1,0,0), (0,1,0), (0,0,1)]
if diff not in valid_bumps:
return False, "无法从最后一个顶点回到起点"
return True, "验证通过:这是一条哈密顿环!"
# 对多个奇数m值进行验证
for m in [3, 5, 7, 9, 11]:
path = generate_cycle1(m)
ok, msg = verify_hamiltonian(path, m)
print(f"m={m}: {msg}")
Claude用程序验证了 (m=3, 5, 7, 9, 11) 的情况,三条路径都是哈密顿环,所有边都恰好被使用一次。Filip Stappers随后将测试范围扩展到了所有奇数 (m) 从3到101,全部通过。
4.4 为什么这个规则能工作:直觉解释
这个规则看起来很简单,但为什么它能工作?莫潇羽在这里给出一个非严格但有助于理解的直觉解释。
纤维分解将图分成了 (m) 层,每一层有 (m^2) 个顶点。哈密顿环必须在这些层之间依次循环((s=0 \to 1 \to 2 \to \cdots \to m-1 \to 0 \to \cdots)),每到一层就访问该层的一个新顶点。
关键在于:当环在某一层内「扫描」时,bump规则确保它按照一种系统化的方式覆盖该层的所有 (m^2) 个顶点。以第一条环为例:
- 在 (s=0) 这一层,规则主要是在 (k) 方向上推进(bump (k)),只有当 (j) 到达边界时才在 (i) 方向上跳一格。这就形成了一种「锯齿形」的扫描模式
- 在中间层((0 < s < m-1)),规则主要在 (j) 方向推进,到达 (i) 的边界时在 (k) 方向跳一格
- 在 (s=m-1) 层,规则有一些特殊处理来确保正确回接
这种设计的精妙之处在于:不同层采用不同的扫描策略,确保在全局尺度上路径不会在任何一层「卡住」或遗漏顶点。
五、高德纳的证明:从计算验证到数学定理
Claude找到了构造方法,但数学上还需要严格证明:这个规则为什么对所有奇数 (m > 1) 都成立?这个证明由高德纳本人完成。
5.1 证明的核心思路
高德纳的证明分几个步骤。首先,他证明第一条路径确实形成了一条长度为 (m^3) 的哈密顿环。
证明的关键观察是:当 (s) 的值固定时,可以把路径在该层内的行为单独分析。以 (s=0) 层为例,路径进入这一层时在某个 ((i, j)) 位置,然后通过一系列bump操作访问该层的所有 (m^2) 个 ((i, j)) 组合((k) 由 (s=0) 和 (i, j) 唯一确定),最后离开这一层。
高德纳证明了:对于每个 (i) 值,路径恰好访问了所有 (m) 个具有该 (i) 值的顶点;然后依次覆盖所有 (m) 个不同的 (i) 值。这样在每一层就覆盖了 (m \times m = m^2) 个顶点。走过所有 (m) 层后,总共覆盖了 (m \times m^2 = m^3) 个顶点,即图中所有顶点。
类似的证明也适用于第二条和第三条环。三条环合在一起恰好覆盖所有边,因为在每个顶点处,三条环分别选择了三条出边中的不同一条。
5.2 从特殊到一般:可推广性定理
高德纳进一步发展了一个优美的一般化理论。他定义了一种叫「Claude-like decomposition」(类Claude分解)的概念:任何满足特定形式的分解规则(即方向的选择只依赖于 (i)、(j)、(s) 是否为0或 (m-1)),都可以归入此类。
他证明了一个定理:一个类Claude分解对所有奇数 (m > 1) 都有效,当且仅当它定义的三个序列在 (m=3) 的情况下是可推广的哈密顿环。
这个定理的实际意义是巨大的——你只需要在最小的非平凡情况((m=3),即 (3 \times 3 \times 3) 的立方体)中验证规则是否正确,就可以保证它对所有奇数 (m) 都正确。
5.3 高德纳发现:不止一个解
通过枚举,高德纳发现 (3 \times 3 \times 3) 的情况一共有11502条哈密顿环,其中4554种三环分解方案。在这些方案中,恰好有996条环是可推广的(即对所有奇数 (m) 都有效),而利用这996条可推广的环组成的有效分解恰好有760种。
也就是说,Claude找到的不过是760个有效解中的一个。但在没有任何先验知识的情况下、从零开始探索并找到这个解,仍然是了不起的成就。
高德纳在论文中表示,他检查了760个解中的多个,没有发现哪个比Claude找到的明显更「漂亮」。他还注意到一个有趣的数学现象:其中136个解在坐标映射 (ijk \to jki) 下保持可推广性,但没有任何一个解同时在所有三种循环映射 ({ijk, jki, kij}) 下都保持有效。这说明这类分解天然缺乏完全的循环对称性。
六、偶数情况:仍然悬而未决
一个重要的限制条件:Claude的构造(以及高德纳的证明)只适用于奇数 (m)。
对于偶数的情况,问题仍然完全