写葛立恒数那篇的时候,那个数是一层层叠出来的。叠法看着吓人,其实只有一招。这篇把这一招拆开讲:从加法和乘法出发,一步一步搭出一个能无限往上堆的楼梯,一直搭到 Graham 数脚下。文中符号随用随定义,末尾附了一张符号表。
1、一、唯一的招数:把上一级运算重复
先看最朴素的一列,全是用 3 和 3 做运算:
| 级别 | 记法 | 一句话 | 结果 |
|---|---|---|---|
| 0 | $3+3$ | 加 3 | 6 |
| 1 | $3\times3$ | 把「加 3」重复 3 次 | 9 |
| 2 | $3^3$ | 把「乘 3」重复 3 次 | 27 |
| 3 | $3\uparrow\uparrow3$ | 把「取 3 的幂」重复 3 次 | 7,625,597,484,987 |
| 4 | $3\uparrow\uparrow\uparrow3$ | 把 $\uparrow\uparrow$ 重复 3 次 | 塔高 7 万亿 |
每一行干的事完全一样:把上一级的运算,重复若干次。乘法是加法的重复,乘方是乘法的重复。那再把「取幂」重复呢?
$3\uparrow\uparrow3$(两个箭头,读作「3 双箭头 3」)就是把「取 3 的幂」做 3 次,也就是 3 的幂塔叠三层:
写成数就是 7,625,597,484,987。13 位,还能写全。再往上叠一层:
这个数已经写不出来了( 13 位变成 3.6 万亿位),但位数还能算:
也就是三万六千亿位。作为对照:可观测宇宙的粒子数约 $10^{80}$,宇宙所有可能量子态的数量约 $10^{10^{122}}$——都远小于这个位数。
再往上,$3\uparrow\uparrow\uparrow3$ 等于 $3\uparrow\uparrow(3\uparrow\uparrow3)$,意思是塔高 7,625,597,484,987 层的幂塔。注意发生了什么:「塔有多高」这个描述本身,成了一个 13 位数。
所以有一条很好用的分界线:
- 在 $3\uparrow\uparrow\uparrow3$ 以下,你还能说清它是「10 的多少次方」、「塔有几层」;
- 越过这条线,你只能靠记号本身和递推规则来描述它。
这也顺带解释了为什么大数总在发明新记号:不是数学家用符号故弄玄虚,是没有记号就没法说话。
2、二、每上一级都要发明一个新符号,这显然不划算
按上面的办法,想要更大的数,就得再发明 $\uparrow\uparrow\uparrow\uparrow$、五箭头、六箭头……每加一级都要一个新符号。
能不能把「第几级」也变成一个参数?也就是写一个函数,第一个参数说明用第几级运算,第二个参数说明规模。
能。这就是 Ackermann 函数,它只需要三行:
第一次看像个普通递归,但它生成了一个完整的运算阶梯:
| $m$ | 闭式 | 这是什么运算 | 例 |
|---|---|---|---|
| 1 | $A(1,n)=n+2$ | 加法 | $A(1,5)=7$ |
| 2 | $A(2,n)=2n+3$ | 乘法 | $A(2,5)=13$ |
| 3 | $A(3,n)=2^{n+3}-3$ | 乘方 | $A(3,5)=253$ |
| 4 | $A(4,n)=2\uparrow\uparrow(n+3)-3$ | 幂塔 | $A(4,2)$ 有 19,729 位 |
| 5 | 三个箭头 | 写不出 |
最便宜的一行就是数数。 $A(0,n)=n+1$ 是数数,第二行把它变成加法,第三行把它变成乘法,第四行把它变成幂塔。每把 $m$ 加 1 ,就往上跳一级运算。
几个具体值:
- $A(4,0)=13$
- $A(4,1)=65533$
- $A(4,2)=2^{65536}-3$,有 19,729 位——一个能完整算出来的、长达一万九千位的数
- $A(4,3)$ 就写不出来了,它相当于塔高 6 层的幂塔
也就是说:三行递归,造出了一个「第一个参数取到 4 就已经越界」的函数。 而第一个参数取 5、6、100 ,每个都相当于再往上跳若干级。
一个技术注:$A(4,\cdot)$ 千万别用朴素递归硬算。$A(4,1)$ 会展开到 $A(2,32765)$,那需要三万多层递归深度,程序直接爆栈。越界的部分只能用闭式或对数表示。
2.1、Ackermann 的来历,比函数本身有意思
Ackermann 弄这个函数,目的不是造大数。
1926 年, Hilbert 猜想每个能算出来的函数都是「原始递归」的——通俗说,都能用有限层循环嵌套写出来。1927 年 Hilbert 的学生 Sudan 造出第一个反例, 1928 年他的另一位学生 Ackermann 造出第二个,就是上面这个。
这两个函数都定义得很简单、都能算,但它们需要的递归深度超出任何固定的循环嵌套层数。所以 Ackermann 函数的本职是证明一个逻辑定理:可计算,不等于原始递归。至于它顺手成了计算机科学里增长最快的常用函数之一、成了大数阶梯的通用公式——那是副产品。
3、三、Conway 链:让「箭头的个数」也变成一个参数
Ackermann 解决了「符号不够用」,但还有个不便:$m$ 一般只能写个小数字,想要「箭头个数」本身就是个天文数字呢?
Conway 的链式箭头就是干这个的。写法是一串自然数用箭头连起来:
规则(随用随定义):
- $a\to b$ 就是 $a^b$;
- $a\to b\to c$ 就是 $a\uparrow^{c}b$——「$c$ 个箭头」;
- 链末尾的 1 可以删掉;
- 链长到四位以上时,第三位($c$)本身可以是前面算出来的一个大数。
前两条说明:Conway 链的前三位,和 Knuth 箭头是同一个东西。真正新的是第四条——它让「箭头的个数」成了一个参数。
看几个例子:
- $3\to3\to2=3\uparrow\uparrow3=3^{27}$,也就是 7,625,597,484,987
- $3\to3\to3=3\uparrow\uparrow\uparrow3$,就是上面那个「塔高 7 万亿」的数
- $3\to3\to64\to2$:第四位出现,这个数已经远远超过 $3\uparrow\uparrow\uparrow3$
而 Graham 数 $G$ 恰好被两个这样的表达式夹住:
( Conway 和 Guy 在《The Book of Numbers》里给出的结果。)所有大数里,很少能见到这种事:一个本来只能用递推描述的数,被两个写得出来的表达式精确夹住了。
4、四、两种记号,同一根轴
前面说 Ackermann 的 $m$ 是「第几级运算」, Conway 链的第三位是「箭头个数」。这两件事其实是同一个参数:
同一根轴上的三种说法:
| 说法 | 参数是什么 |
|---|---|
| Ackermann 的第一个参数 $m$ | 第几级运算 |
| Knuth 箭头 $a\uparrow^{n}b$ 里的 $n$ | 箭头个数 |
| Conway 链 $a\to b\to c$ 里的 $c$ | 箭头个数 |
区别只在你能把这个参数写多大:
- 箭头记号:参数得数着写, 3 个、4 个;
- Ackermann :参数是个自然数,可以取 4、5、100 ,但通常也只取小的;
- Conway 链:参数本身可以是一个 $3\to3\to64\to2$ 量级的数。
这就是「造大数」的完整套路:不是去找一个更大的数,而是把上一层的参数变成可计算的对象,然后递归地往上套。
5、五、小结
- 造大数只有一招:把上一级的运算重复 $b$ 次。
- 重复到腻了,就把「第几级」变成参数——Ackermann 函数。
- 参数不够大了,就让参数本身由更低的层级算出来——Conway 链。
- 全程没有用到任何新数学:加法、乘法、乘方的定义,加上「再重复一次」这个动作。
而这只是开始。上面这些数全都还在同一个层级里: Ackermann 函数停在 $\omega$ 层,而 Graham 数(把 $f(n)=3\uparrow^{n}3$ 这样的函数迭代 64 次)也只在 $\omega+1$ 层。它们之间的差别,用「重复」和「参数化」就足以解释。
真正需要换一套语言的是 TREE(3):那里的「长」不再来自重复,而来自「一个游戏最多能玩多少轮」。那是另一个话题了。
6、符号表
| 符号 | 含义 |
|---|---|
| $a\times b$ | 把「加 $a$」重复 $b$ 次 |
| $a^b$ | 把「乘 $a$」重复 $b$ 次 |
| $a\uparrow\uparrow b$ | 幂塔:把「取 $a$ 的幂」重复 $b$ 次,右结合 |
| $a\uparrow^{n}b$ | $n$ 个箭头,即第 $n+1$ 级运算 |
| $A(m,n)$ | Ackermann 函数,$m$ 是第几级运算 |
| $a\to b\to c\to\cdots$ | Conway 链式箭头 |
| Graham 数 $G$ | $g_1=3\uparrow\uparrow\uparrow\uparrow3$,$g_{k+1}=3\uparrow^{g_k}3$,$G=g_{64}$ |
| $\omega$ 层 | fast-growing hierarchy 里 Ackermann 函数所在的那一层 |
Q. E. D.