Leo's log

数学

费马找到了一个真正奇妙的证明,可惜页边太窄写不下

Fermat Found a Truly Marvelous Proof, but the Margin Was Too Narrow to Contain It

大约一六三七年,费马在一本《算术》的页边写下那句话:他找到了一个真正奇妙的证明,可惜页边太窄,写不下。

这句话后来被讲了三百多年。一九九五年,怀尔斯和泰勒完成的证明,终于以两篇论文的形式登在《数学年刊》上,合计一百多页。费马留下的难题有了答案。能从头到尾读懂这个证明的人,仍然不多。

二〇二六年九月四日,Anthropic 公布:Claude 用十一天,完成了费马大定理的 Lean 形式化证明。Lean 是一种能让计算机逐步核对数学推理的语言。这份证明有一千三百万行,包含二万九千五百一十一条定理;最终依赖的公理只有 Lean 的三条标准公理,并通过了两个独立实现的内核的检查。[1][2][3]

费马说页边太窄。三百八十九年后,这个关于纸张宽度的玩笑,有了一千三百万行代码作注脚。


这次的工作是形式化:把一个人类已经接受的证明,拆成机器能够逐步检查的形式,再让机器完整地查一遍。费马大定理三十一年前就已得到证明,这次的新进展,是让它有了一份可由计算机核验的完整证明。

这里也需要说得准确一点。Claude 沿用的是 Darmon、Diamond 和 Taylor 对怀尔斯证明的整理版本,并复用了 Mathlib、帝国理工的 FLT 项目和 flt-regular 项目的已有成果。它没有把怀尔斯的原论文逐页翻译成代码,也没有从零重建全部数学。[1][2]

帝国理工数学家 Kevin Buzzard 从二〇二四年起就在领导一个相关项目,获得了五年一百万英镑的资助。他在当天的博客里说得很直白:在数学上,这项工作几乎没有告诉我们什么新东西。他此前就说过,自己对怀尔斯证明的正确性有 99.9% 的把握,而数论圈里的大多数人是 100%。[4]

它仍然值得写,因为,“相信”和“完整检查过”之间,一直隔着很高的成本。


数学家当然会检查证明,只是这种检查很少像计算机那样,把每一步都还原到最基本的规则。一篇一百页的论文,背后可能还依赖几百篇文献。读者和审稿人需要理解论证、追查关键步骤,也不可避免地要依靠已有结果和专业共同体积累的信任。

这套办法大多数时候管用,但并不轻松。黑尔斯证明开普勒猜想,十二位审稿人审了四年,最后仍只愿说有“99%”的把握;佩雷尔曼的庞加莱猜想证明,也经过了数年核查和多份长篇解读。还有一些错误的证明,在被接受多年之后才暴露问题,那时别人的工作已经建立在它们之上。[1]

对于这样的长证明,检查本身也是一项研究。你得理解其中相当深的数学,才能判断推理是否成立。我在《没人打分的地方》里谈过类似的问题:如果判断一个答案是否正确,本身就需要接近解题的能力,那么“再检查一次”也未必能提供一个可靠的外部标准。

形式化改变了这件事。证明一旦写到足够细,核验就可以交给程序。Lean 的内核按照固定规则检查证明项的类型,无须像数学家那样理解数论中的想法。写出形式化证明仍然很难,但复核不必再让另一个人重新走完全部思考过程。

机器检查当然也要花时间和算力。它减少的,主要是反复投入专家判断的成本。

Buzzard 当初也说不准,自己的项目究竟需要多久。他向资助方承诺的第一阶段目标,是把费马大定理归约到二十世纪八十年代末已经知道的结果:先形式化后半段论证,把那些更早的深层结果暂时作为前提。[4]

Claude 这次把所需的前提也接上了证明,整条依赖链最终落到了三条标准公理上。


八月七日凌晨,Anthropic 的一个小团队启动了这次尝试。

他们用的是 Prove2Me,由研究员 Tianyi Peng 在哥伦比亚大学的团队开发。这个平台把各条定理及其依赖关系组织成一张有向无环图,陈述和证明分开存放。几十个 Claude 智能体在上面并行工作:提出陈述,互相审查,再分别完成证明。此前的尝试没有这样有效的协作组织,智能体虽然一度取得进展,却很快跟丢了项目状态,难以继续配合。[1][2]

据 Anthropic 的技术报告,在这十一天的运行中,人类没有亲自撰写数学论证,新增的 Lean 代码也只有目标定理的一行陈述。人类偶尔会调整优先级,比如提醒它们先处理雅可比簇的概形构造,或者尽快推进 Mazur 那一步。这说的是本次运行中的人工介入;项目所依赖的人类数学和既有代码,远不止这些。[2]

第一天,它们证明了所需的 Taylor–Wiles 素数的存在性。第二天,推进了 Mazur 定理的一个特例和怀尔斯的 3–5 切换。第六天,定理数量达到一万条。第八天,完成 Ribet 降级的核心步骤;第九天,完成 Eichler–Shimura 同余的十六个步骤。第十一天上午十一点零五分,完成所需的 Langlands–Tunnell 结果。

当晚十点零零分五十七秒,最后一条未完成的陈述得到证明。几秒之内,依赖它的各层结果相继闭合,包括 Ribet 降级和模性提升中的 R = T。平台上的费马大定理,被标记为“已证明”。

十一天,约六十亿个输出 token。使用的是一个能力大致相当于 Claude Fable 5.1 的内部研究模型。这里的时间均按技术报告,使用美国东部时间。[1][2]


比起最后那个“已证明”,我更想讲的是智能体接下来的反应。

十点零一分,一个智能体发现,最终定理下面已经没有未完成的分支了。它立刻反复查询根节点的状态。接下来的一分钟,另外四个智能体也各自查了一遍。其中一个写:“历史性的时刻(有待复核)。”另一个在兴奋之后,提醒自己先独立确认。

十点十九分,又一个智能体读到了状态。它把这当作一项需要核查的重大声称,准备确认之后再报告。

到了十点二十五分,一个智能体专门解释了“在 Prove2Me 上已证明”意味着什么:平台逐张检查定理卡片,每张卡都通过,并不等于整份证明已经在平台之外完成核验。真正的验收,还需要把整条依赖链取出来,从源码重新编译。

所以,在复核通过之前,它给出的说法是“在 Prove2Me 上已证明,待独立复核”。

那天更早的时候,还发生过两次纠错。早上七点五十四分,一个智能体发出更正:自己审查时放过的一条引理,被另一个智能体算出了反例。它承认,自己只是作了推论,对方则实际做了计算。

晚上八点二十五分,离收官不到一个半小时,另一条已经过审的引理遭到质疑。原先认可它的智能体回去重查,发现自己用错了消去条件:那个态射有非平凡的核,不能按原来的方式消去。它随即决定发出更正。[2]

这些记录让我在意的,是它们怎样处理自己的错误:发现反例,撤回判断,继续核查。

仅凭这些摘录,我们还不能判断,这种谨慎在多大程度上来自训练、提示或协作机制。报告也说明,摘录经过挑选,其中的数学评论并未逐一独立核实。但至少在这些片段里,智能体确实在一个错误会被追查、结论需要复核的环境中工作。[2]


第二天早上,团队在平台之外,把二万九千五百一十一张卡片从源码重新编译。再过一天,整条依赖链被建成了一个 Lean 项目。

这个项目有一条硬性检查:最终定理只能依赖 Lean 的三条标准公理——propextClassical.choiceQuot.sound。依赖列表不符,构建就会失败。没有用来占位的 sorry,没有额外添加的公理,也没有 native_decide[2][3]

theorem fermat_last_theorem (n : ℕ) (hn : 3 ≤ n) (a b c : ℕ)
    (ha : 0 < a) (hb : 0 < b) (hc : 0 < c) : a ^ n + b ^ n ≠ c ^ n

#print axioms fermat_last_theorem
-- 'fermat_last_theorem' depends on axioms: [propext, Classical.choice, Quot.sound]

然后是两套第三方检查工具。Lean 官方的 comparator 核对最终陈述及其涉及的定义,确认它们与只引用 Mathlib 的参考文件一致,再把整个证明连同 Mathlib 一起,在内核中从头重放。耗时十四小时四十六分钟,峰值内存 230 GB,最后返回:“Your solution is okay!”

另一套工具是 nanoda,一个用 Rust 独立实现的 Lean 内核。它接受了同一环境导出的 1,052,234 条声明。团队为它加了几处公开的进度输出和性能补丁,仓库说明这些补丁没有改变类型检查规则。[3]

Buzzard 自己也编译了代码,运行了 comparator。他后来在博客的评论区补充说,自己还让一个 AI 找出仓库里所有既非数学定义、也非定理证明的代码,大约一百行,再和 Claude 一起仔细检查。它们只是定义了一种方便使用的证明策略。[4]

这一连串检查,把通常由专家阅读来确认的推理细节,交给了可以重复运行的程序。不过,仓库的 README 也指出了一个边界:工具能检查定理的形式陈述和证明,却不能仅凭定理的名字,保证它就是读者以为的那个结果。

因此,PROOF-PATH.md 专门列出了各个命名步骤究竟证明了多强的结论。这里的 Mazur 是 Frey 曲线所需的不可约性结果;Langlands–Tunnell 只覆盖所需的八面体情形;Ribet 降级也限于这里的 Frey 表示。它们足以完成费马大定理的证明,却不应被引用为相应经典定理的一般版本。[3][5]

这个区别很重要,但它不意味着最终的费马大定理还少了一块:最终陈述已经单独核对过。它提醒的是,今后如果有人要引用某条中间结果,就必须读清定义、假设和结论,不能只看名字。[3]


一千三百万行代码,也带来了另一个问题:谁能读,谁能接着用?

单看行数,这份代码是 Mathlib 的五倍以上。Mathlib 是 Lean 社区多年积累的数学库,但这并不意味着 Claude 在十一天里写出了五倍于它的数学。两者的组织方式、重复程度和维护标准,都很不一样。[1][2]

运行结束大约两周后,有人问 Claude,这份证明与帝国理工的人工形式化项目有什么差别。它给出的判断是:已经完成的部分都由 Lean 内核检查,差别主要在代码的组织形式,以及是否便于人阅读、复用和维护。

它列出的短处相当具体。首先是难读:发布时清理掉了大量混杂着数学笔记和项目记账的注释,代码也缺少 Mathlib 要求的说明。九百多个文件超过一千五百行,而它对照的 Mathlib 版本只有两个。

其次是重复。每张卡片单独证明,导致证明文件中约五分之二的定理陈述与别处逐字重复。一条基础引理,在三百多个文件里被重新声明。

维护也很费力。31% 的字节用于生成文件前言,关闭部分自动推理规则,让每份证明的环境保持稳定。一次工具链升级,改动了 26% 的证明文件。再加上许多关键结果只证明了本项目需要的特例,这份代码还无法直接纳入 Mathlib。[2]

不过,其中的 Hecke 代数、模曲线的雅可比簇、Néron 模型、形变环等基础工作,仍可作为参考,由人主导整理成更通用、更容易维护的数学库。

这正是 Buzzard 的项目一直在做的事。每次修改都经过人工审查,通用的部分按 Mathlib 的标准编写,再逐步提交进去。他在博客评论区也提到,当时 Mathlib 不接受 AI 审稿,审稿人对审查 AI 生成的代码也很谨慎。[2][4]

我觉得,可以把这两种成果分别看作证书图书馆。证书让内核确认,给定的结论确实能从公理推出。图书馆则把这些数学整理成别人能读、能引用、能继续扩建的形式。

十一天完成了前者。Buzzard 那个获得五年资助的项目,还要建设后者。而前者本身,也用到了后者已经完成的一部分工作。

所以,十一天和五年,并不能直接拿来比较快慢。Buzzard 在宣布 Anthropic 抢先完成时,也列出了自己还要兑现的承诺:继续向 Mathlib 提交基础成果,以及做出一份帮助人类理解现代证明的动态文档。[4]


最后想留一个 Buzzard 自己讲的细节。

一九九三年,怀尔斯在剑桥牛顿研究所连讲三场,宣布证明。Buzzard 当时还是研究生,去听了第一场,完全听不懂,便跳过后两场,和刚交往的女朋友去爱尔兰度假了。一个星期后回到剑桥,他才知道,怀尔斯已经宣布了证明。

二〇二六年,他和同一个女朋友在威尔士参加 Green Man 音乐节,手机信号很差。短暂连上网时,他看到一封陌生人的邮件,标题是“费马大定理的端到端 Lean 形式化”。他以为又是一个声称攻克难题的怪人,没有理会。一个星期后,清理积下的近一千封未读邮件时,他才重新看到它。[4]

隔了三十三年,两次重要消息,都是等他度假回来才真正读到。

费马说页边太窄。怀尔斯和泰勒留下了一百多页的证明。如今,沿着这条证明路线,又有了一千三百万行可供机器核验的代码。

机器已经能把漫长的推理逐步查完。接下来的工作,是让人也能看清:每个定义指的是什么,每条定理适用于哪里,以及这些结果为什么值得放在一起。

页边终于写下了足够多的步骤。读懂它们,仍然需要时间。


Mathematics

Fermat Found a Truly Marvelous Proof, but the Margin Was Too Narrow to Contain It

费马找到了一个真正奇妙的证明,可惜页边太窄写不下

Around 1637, Fermat wrote a sentence in the margin of a copy of the Arithmetica: he had found a truly marvelous proof, which the margin was too narrow to contain.

The sentence was retold for more than three hundred years. In 1995, the proof by Wiles and Taylor finally appeared in the Annals of Mathematics, as two papers running to more than a hundred pages between them. The problem Fermat left behind had an answer. The number of people who could read that proof from beginning to end was still small.

On September 4, 2026, Anthropic announced that Claude had spent eleven days producing a formal proof of Fermat’s Last Theorem in Lean. Lean is a language in which a computer can check mathematical reasoning one step at a time. The proof runs to thirteen million lines and contains 29,511 theorems. In the end it rests on nothing but Lean’s three standard axioms, and it passed two independently implemented kernels.[1][2][3]

Fermat said the margin was too narrow. Three hundred and eighty-nine years later, the joke about the width of a page has thirteen million lines of code for a footnote.


The work here is formalization: taking a proof that people already accept, breaking it into a form a machine can check step by step, and then having the machine check all of it. Fermat’s Last Theorem was proved thirty-one years ago. What is new is that there is now a complete proof of it that a computer can verify.

This also needs stating precisely. Claude followed the version of Wiles’s proof as set out by Darmon, Diamond and Taylor, and reused existing work from Mathlib, the Imperial College FLT project, and the flt-regular project. It did not translate Wiles’s original paper into code page by page, and it did not rebuild all of the mathematics from nothing.[1][2]

Kevin Buzzard, a mathematician at Imperial College, has been leading a related project since 2024, on a grant of one million pounds over five years. In a blog post the same day he put it bluntly: mathematically, this work tells us essentially nothing new. He had already said that he was 99.9% sure of the correctness of Wiles’s proof, and that most people in number theory were at 100%.[4]

It is still worth writing about, because “believing” and “having checked in full” have always been separated by a high cost.


Mathematicians do check proofs, of course. But that checking rarely does what a computer does and traces every step back to the most basic rules. A hundred-page paper may depend on several hundred earlier papers. Readers and referees have to understand the argument and follow the key steps, and they inevitably rely on established results and on the trust a professional community has built up.

Most of the time this works, but it is not easy. When Hales proved the Kepler conjecture, twelve referees spent four years on it and in the end would only say they were “99%” sure. Perelman’s proof of the Poincaré conjecture also went through years of checking and several book-length expositions. And some wrong proofs were accepted for years before the problems surfaced, by which time other people’s work had been built on top of them.[1]

For a long proof like this, checking is itself a piece of research. You have to understand fairly deep mathematics before you can judge whether the reasoning holds. I wrote about a similar problem in Where No One Is Keeping Score: if judging whether an answer is correct itself requires something close to the ability to solve the problem, then “checking it once more” does not necessarily give you a reliable outside standard.

Formalization changes this. Once a proof is written down in enough detail, verification can be handed to a program. Lean’s kernel checks the type of each proof term by fixed rules; it does not need to understand the ideas of number theory the way a mathematician does. Writing a formal proof is still very hard, but re-checking it no longer requires another person to walk through the whole line of thought again.

Machine checking takes time and computing power too, of course. What it mainly reduces is the cost of bringing in expert judgment over and over.

Buzzard himself could not say at the outset how long his project would take. The first-phase goal he promised his funders was to reduce Fermat’s Last Theorem to results already known by the late 1980s: formalize the later half of the argument first, and treat the earlier, deeper results as assumptions for the time being.[4]

This time Claude connected those assumptions to proofs as well, and the whole chain of dependencies ended at the three standard axioms.


In the early hours of August 7, a small team at Anthropic launched the attempt.

They used Prove2Me, developed by researcher Tianyi Peng’s group at Columbia University. The platform organizes the theorems and their dependencies into a directed acyclic graph, storing statements and proofs separately. Dozens of Claude agents worked on it in parallel: proposing statements, reviewing one another’s, and then proving them. An earlier attempt had lacked this kind of coordination; the agents made some progress, but soon lost track of the state of the project and could not keep working together.[1][2]

According to Anthropic’s technical report, during the eleven-day run no human wrote any mathematical argument, and the only new Lean written by a person was the one-line statement of the goal theorem. People occasionally adjusted priorities, for instance reminding the agents to deal with the scheme structure of the Jacobian first, or to push the Mazur step through soon. That describes the human intervention in this run; the human mathematics and existing code the project depends on go far beyond it.[2]

On day one, the agents proved the existence of the Taylor–Wiles primes they needed. On day two, they made progress on a special case of Mazur’s theorem and on Wiles’s 3–5 switch. On day six, the count of theorems reached ten thousand. On day eight, the central step of Ribet’s level lowering was done; on day nine, the sixteen steps of the Eichler–Shimura congruence. At 11:05 on the morning of day eleven, they finished the Langlands–Tunnell result they needed.

At 10:00:57 that night, the last unfinished statement was proved. Within seconds, the results that depended on it closed one layer after another, including Ribet’s level lowering and the R = T of modularity lifting. On the platform, Fermat’s Last Theorem was marked “proved.”

Eleven days, and about six billion output tokens. The model was an internal research model roughly comparable in capability to Claude Fable 5.1. Times here follow the technical report and are US Eastern.[1][2]


More than that final “proved,” what I want to describe is how the agents reacted next.

At 10:01, one agent noticed that there were no unfinished branches left under the final theorem. It immediately queried the status of the root node, again and again. Over the next minute, four other agents each checked for themselves. One of them wrote: “Historic moment (modulo re-check).” Another, after a moment of excitement, reminded itself to confirm independently first.

At 10:19, another agent read the status. It treated this as a major claim that needed checking, and set out to confirm it before reporting.

At 10:25, one agent spelled out what “proved on Prove2Me” meant: the platform checks the theorem cards one by one, and every card passing is not the same as the whole proof having been verified outside the platform. Real acceptance still required pulling out the entire chain of dependencies and recompiling it from source.

So until the re-check passed, the wording it offered was “proved on Prove2Me, pending independent re-check.”

Earlier that day there had also been two corrections. At 7:54 in the morning, one agent posted a correction: a lemma it had let through as a reviewer had been shown false by another agent, which found a counterexample. It admitted that it had only argued the case, while the other agent had actually computed it.

At 8:25 in the evening, less than an hour and a half before the finish, another lemma that had already passed review was challenged. The agent that had approved it went back and found that it had misapplied a cancellation condition: the morphism had a non-trivial kernel and could not be cancelled the way it had assumed. It decided at once to post a correction.[2]

What strikes me in these records is how they handled their own mistakes: find the counterexample, withdraw the judgment, keep checking.

From these excerpts alone, we cannot tell how far this caution comes from training, from prompting, or from the way the collaboration was organized. The report also notes that the excerpts were selected, and that the mathematical remarks in them were not each independently verified. But at least in these passages, the agents were working in an environment where a mistake would be traced and a conclusion had to be re-checked.[2]


The next morning, off the platform, the team recompiled all 29,511 cards from source. A day later, the whole chain of dependencies had been built as a single Lean project.

The project has one hard check: the final theorem may depend only on Lean’s three standard axioms, propext, Classical.choice and Quot.sound. If the list of axioms differs, the build fails. There is no placeholder sorry, no added axiom, and no native_decide.[2][3]

theorem fermat_last_theorem (n : ℕ) (hn : 3 ≤ n) (a b c : ℕ)
    (ha : 0 < a) (hb : 0 < b) (hc : 0 < c) : a ^ n + b ^ n ≠ c ^ n

#print axioms fermat_last_theorem
-- 'fermat_last_theorem' depends on axioms: [propext, Classical.choice, Quot.sound]

Then came two third-party checking tools. Lean’s official comparator checked the final statement and the definitions it involves, confirming that they match a reference file importing only Mathlib, and then replayed the whole proof, Mathlib included, through the kernel from the start. It took fourteen hours and forty-six minutes, with peak memory of 230 GB, and returned: “Your solution is okay!”

The other tool was nanoda, an independent implementation of the Lean kernel written in Rust. It accepted the 1,052,234 declarations exported from the same environment. The team added a few published patches for progress output and performance; the repository states that none of them changes the type-checking rules.[3]

Buzzard compiled the code himself and ran the comparator. In the comments on his blog he later added that he had also asked an AI to find every piece of code in the repository that was neither a mathematical definition nor the proof of a theorem, about a hundred lines, and then went through them carefully with Claude. They only defined a convenience tactic.[4]

This chain of checks hands the details of reasoning that experts would normally confirm by reading over to programs that can be run again and again. But the repository’s README also marks a boundary: the tools can check a theorem’s formal statement and its proof, but they cannot guarantee, from the theorem’s name alone, that it is the result the reader takes it to be.

That is why PROOF-PATH.md sets out exactly how strong a conclusion each named step proves. The Mazur here is the irreducibility result needed for the Frey curve; Langlands–Tunnell covers only the octahedral case that is needed; Ribet’s level lowering is likewise restricted to the Frey representation in question. They are enough to complete the proof of Fermat’s Last Theorem, but they should not be cited as general versions of the corresponding classical theorems.[3][5]

The distinction matters, but it does not mean the final theorem is missing a piece: the final statement has been checked on its own. What it says is that anyone who wants to cite one of the intermediate results in future must read the definitions, the hypotheses and the conclusion, and not go by the name.[3]


Thirteen million lines of code also raise another question: who can read them, and who can build on them?

By line count alone, this code is more than five times the size of Mathlib. Mathlib is the mathematical library the Lean community has built up over many years, but that does not mean Claude wrote five times as much mathematics in eleven days. The two differ greatly in how they are organized, how much they repeat themselves, and the standards they are maintained to.[1][2]

About two weeks after the run, Claude was asked how this proof differs from the human formalization project at Imperial. Its judgment was that everything completed had been checked by the Lean kernel, and that the difference lies mainly in how the code is organized, and in whether people can read, reuse and maintain it.

The shortcomings it listed were quite specific. First, readability: at publication, a large number of comments that mixed mathematical notes with project bookkeeping were stripped out, and the code lacks the documentation Mathlib requires. More than nine hundred files exceed 1,500 lines, where the version of Mathlib it compared against has only two.

Second, repetition. Each card was proved on its own, so about two in five theorem statements in the proof files repeat a statement found elsewhere word for word. One basic lemma is re-declared in more than three hundred files.

Maintenance is laborious too. 31% of the bytes go to generated file preambles that switch off some automatic reasoning rules so that each proof’s environment stays stable. One toolchain upgrade changed 26% of the proof files. Add that many key results were proved only in the special cases this project needed, and the code cannot go straight into Mathlib.[2]

Still, the foundational work in it, on Hecke algebras, Jacobians of modular curves, Néron models and deformation rings, can serve as a reference for a human-led effort to turn it into a more general and more maintainable library.

That is exactly what Buzzard’s project has been doing. Every change is reviewed by a person, the general parts are written to Mathlib’s standard, and they are contributed step by step. In the comments on his blog he also mentioned that Mathlib would not currently accept AI reviews, and that reviewers were very cautious about reviewing AI-generated code.[2][4]

I think of these two kinds of result as a certificate and a library. The certificate lets the kernel confirm that a given conclusion really does follow from the axioms. The library arranges the mathematics into a form other people can read, cite, and keep building on.

Eleven days produced the former. Buzzard’s project, with its five years of funding, still has to build the latter. And the former itself made use of part of what the latter had already completed.

So eleven days and five years cannot simply be compared for speed. When Buzzard announced that Anthropic had beaten him to it, he also listed the promises his own project has yet to keep: to keep contributing foundational results to Mathlib, and to produce a dynamic document that helps people understand the modern proof.[4]


I want to end with a detail Buzzard tells himself.

In 1993, Wiles gave three lectures at the Newton Institute in Cambridge announcing the proof. Buzzard, then a graduate student, went to the first, understood none of it, skipped the other two, and went on holiday to Ireland with his new girlfriend. Only when he got back to Cambridge a week later did he learn that Wiles had announced the proof.

In 2026, he was at the Green Man music festival in Wales with the same girlfriend, with very poor phone reception. In a brief moment of connection he saw an email from a stranger with the subject line “End-to-end Lean formalization of Fermat’s Last Theorem.” He took it for another crank claiming to have cracked a famous problem, and ignored it. A week later, working through the nearly one thousand unread emails that had piled up, he saw it again.[4]

Thirty-three years apart, two pieces of important news, both read only after he got back from holiday.

Fermat said the margin was too narrow. Wiles and Taylor left a proof of more than a hundred pages. Now, along the same line of proof, there are thirteen million lines of code that a machine can verify.

Machines can now check a long chain of reasoning through to the end. The work ahead is to let people see clearly too: what each definition refers to, where each theorem applies, and why these results belong together.

The margin has finally had enough steps written into it. Reading them still takes time.