怎么造一个大数

作者: , 共 5146 字

写葛立恒数那篇的时候,那个数是一层层叠出来的。叠法看着吓人,其实只有一招。这篇把这一招拆开讲:从加法和乘法出发,一步一步搭出一个能无限往上堆的楼梯,一直搭到 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 的幂塔叠三层:

$$3\uparrow\uparrow3=3^{3^3}=3^{27}$$

写成数就是 7,625,597,484,987。13 位,还能写全。再往上叠一层:

$$3\uparrow\uparrow4=3^{3^{3^3}}$$

这个数已经写不出来了( 13 位变成 3.6 万亿位),但位数还能算:

$$3^{27}\cdot\log_{10}3\approx3.638\times10^{12}$$

也就是三万六千亿位。作为对照:可观测宇宙的粒子数约 $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 函数,它只需要三行:

$$A(0,n)=n+1$$

$$A(m+1,0)=A(m,1)$$

$$A(m+1,n+1)=A(m,A(m+1,n))$$

第一次看像个普通递归,但它生成了一个完整的运算阶梯:

$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\to c\to d\to\cdots$$

规则(随用随定义):

  1. $a\to b$ 就是 $a^b$
  2. $a\to b\to c$ 就是 $a\uparrow^{c}b$——「$c$ 个箭头」;
  3. 链末尾的 1 可以删掉;
  4. 链长到四位以上时,第三位($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$ 恰好被两个这样的表达式夹住:

$$3\to3\to64\to2\ <\ G\ <\ 3\to3\to65\to2$$

( Conway 和 Guy 在《The Book of Numbers》里给出的结果。)所有大数里,很少能见到这种事:一个本来只能用递推描述的数,被两个写得出来的表达式精确夹住了。

4、四、两种记号,同一根轴

前面说 Ackermann 的 $m$ 是「第几级运算」, Conway 链的第三位是「箭头个数」。这两件事其实是同一个参数:

$$A(m,n)=\bigl(2\to(n+3)\to(m-2)\bigr)-3\qquad(m\ge3)$$

同一根轴上的三种说法:

说法 参数是什么
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.

葛立恒数是用箭头一层层堆出来的。还有一个数,定义简单到可以用纸笔画出来,却比葛立恒数大得多 —— 它叫 TREE(3)