怎么造一个大数

作者: , 共 8195 字

葛立恒数那个数是一层层叠出来的,叠法看着吓人,其实只有一招。这篇把这一招拆开讲,顺便把大数记号这一路的演进理一遍:先重温箭头符号,再看 Ackermann 函数怎么把这一招做成一个函数(它和箭头其实是一回事),最后看 Conway 链怎么把它再推广一层。文中符号随用随定义,末尾附一张符号表。

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 的多少次方、塔有几层;
  • 越过这条线,就只能靠记号本身和递推规则来描述。

想再往上走,就得再发明一个新符号:$\uparrow\uparrow\uparrow\uparrow$、五箭头、六箭头,每加一级都要一个新符号。大数总在发明新记号,原因就在这儿。不是数学家用符号故弄玄虚,是没有记号就说不了话。

2、二、Ackermann 函数

那能不能不发明新符号,把「第几级」也变成一个参数?也就是写一个函数,第一个参数说明用第几级运算,第二个参数说明规模。

能。这就是 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、它和箭头符号是一回事

上面那张表和箭头符号那张表,是同一张表。写成公式就是:

$$A(m,n)=2\uparrow^{m-2}(n+3)-3\qquad(m\ge3)$$

$m$ 每加 1 就多一个箭头,只是底数从 3 换成了 2 ,再减 3 的偏移,台阶本身没变。所以 Ackermann 函数和 Knuth 箭头是同一根轴上的两种写法,一个用函数写,一个用记号写。

区别在形式。箭头是记号,得手数着写几个; Ackermann 是函数,$m$ 是个自变量,可以取 4、5、100 ,也可以是别处算出来的。变成函数之后才能迭代它,才能把上一轮的结果喂回参数里。下一步用的就是这个。

2.2、一个容易搞反的时间顺序

看起来更自然的箭头符号,其实出现得更晚。

Ackermann 函数是 1928 年的事。Knuth 的箭头符号要到 1976 年才发表,晚了将近五十年。更早的那个,反而是不太直观的那个。

因为 Ackermann 弄这个函数的目的不是造大数,而是证明一个逻辑定理。1926 年, Hilbert 猜想每个能算出来的函数都是原始递归的,通俗说就是都能用有限层循环嵌套写出来。1927 年, Hilbert 的学生 Sudan 造出第一个反例, 1928 年他的另一个学生 Ackermann 造出第二个,就是上面这个。

两个函数都定义得很简单,都能算,但它们需要的递归深度超出任何固定的循环嵌套层数。所以 Ackermann 函数的本职是证明一个逻辑定理:可计算不等于原始递归。至于它后来成了计算机科学里增长最快的常用函数之一,成了大数阶梯的通用公式,那是副产品。Knuth 箭头则是几十年后为了让人写起来、读起来方便才发明的。

3、三、Conway 链:把 Ackermann 推广到多元

Ackermann 函数只有两个参数,一个管第几级运算,一个管规模。想再往上走,自然的一步是把它推广到多个参数。

多元 Ackermann 函数 $A(x_1,x_2,\dots,x_n)$ 有四条规则($X$ 是任意一串数,$Y$ 是一串 0 ):

$$A(Y,a)=a+1$$

$$A(X,b+1,0)=A(X,b,1)$$

$$A(X,b+1,a+1)=A(X,b,A(X,b+1,a))$$

$$A(X,b+1,0,Y,a)=A(X,b,a,Y,a)$$

拿这四条和第二节的三行对一遍:中间两条和二元版一字不差,只是挪到了最后两个参数上。真正新的是第四条,当倒数第二个参数是 0 时,把最后那个数搬进左边的空位,再把前一个数减 1。也就是用掉一个参数,递推往上抬一层:$n$ 个参数对应 $\omega^{n-1}$ 层,两个参数是 $\omega$ 层,三个参数是 $\omega^2$ 层,四个是 $\omega^3$ 层。

(顺带一提, Ackermann 1928 年的原版本来就是三变量的,课本里那个两变量版是后来简化出来的。)

而多元版本最直观的写法是右箭头:

多元 Ackermann 写成右箭头
$A(x,y)$ $3\to y\to x-2$
$A(1,1,x)$ $3\to3\to x\to2$

二元的这一格是精确的:$A(m,n)=\bigl(2\to(n+3)\to(m-2)\bigr)-3$。三元往上就是同一层级的近似,两边可以互相夹住。

把一串数用右箭头串起来,就是 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 可以删掉,$X\to 1$ 和 $X\to 1\to a$ 都等于 $X$;
  4. 其余情况,一律用同一条递推把末两位换掉:
    $$X\to y\to z\quad\Longrightarrow\quad X\to\bigl(X\to(y-1)\to z\bigr)\to(z-1)$$

第 4 条说的是:末位减 1 ,倒数第二位的位置换成整条链刚算出来的那个大数。末位一路减到 1 ,链就缩短,最后落回三位链收工。

3.1、前三位就是箭头

链 展开 值
$3\to3$ $3^3$ 27
$3\to3\to2$ $3\uparrow\uparrow3=3^{3^3}$ 7,625,597,484,987
$3\to3\to3$ $3\uparrow\uparrow\uparrow3$ 塔高 7,625,597,484,987 层
$3\to3\to64$ $3\uparrow^{64}3$ 64 个箭头

到这里为止, Conway 链和 Knuth 箭头完全一样,也就是 Ackermann 函数那一层。新东西从第四位开始。

3.2、第四位:第三位的含义变了

三位链里,第三位是箭头个数。一旦出现第四位,第三位就变成了迭代次数,箭头个数每一轮由上一轮的结果顶上。这里最容易读岔。

固定前两位为 3、3 ,把第三位依次取 1、2、3、4 :

链 等于 箭头个数
$3\to3\to1\to2$ 27 0
$3\to3\to2\to2$ $3\uparrow^{27}3$ 27
$3\to3\to3\to2$ $3\uparrow^{3\uparrow^{27}3}3$ $3\uparrow^{27}3$
$3\to3\to4\to2$ $3\uparrow^{3\uparrow^{3\uparrow^{27}3}3}3$ 上一行那个数

第三位写的是 1、2、3、4 ,箭头个数却是 0、27、$3\uparrow^{27}3$、$3\uparrow^{3\uparrow^{27}3}3$。每一轮都把上一轮算出来的整个数,塞进箭头个数的位置。

$d=2$ 时精确写出来是这样:

$$a\to b\to c\to2\;=\;a\uparrow^{\,a\to b\to(c-1)\to2}b,\qquad\text{起点}\;a\to b\to1\to2=a^b$$

3.3、和葛立恒数是同一个动作

再看 $3\to3\to64\to2$。这里的 64 不是 64 个箭头,是从 27 出发,把同一步做 63 次:

$$x\;\longmapsto\;3\uparrow^{x}3$$

第一次得到 $3\uparrow^{27}3$,第二次得到 $3\uparrow^{3\uparrow^{27}3}3$,第 63 次就是 $3\to3\to64\to2$。

葛立恒数的递推用的是同一个映射:

起点 每一步 次数
Conway 链 $3\to3\to64\to2$ $27$ $x\mapsto3\uparrow^{x}3$ 63
葛立恒数 $G$ $3\uparrow\uparrow\uparrow\uparrow3$ $x\mapsto3\uparrow^{x}3$ 63

同一个映射,同样 63 步,只有起点不同。这个映射是严格递增的,起点小结果就小,于是

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

这是 Conway 和 Guy 在《The Book of Numbers》里给出的结果,右边那个只是多迭代了一步。一个本来只能用递推描述的数,被两个写得出来的表达式夹住了。

三个位是把箭头个数填上一个数,四个位是把箭头个数交给一条同款链去算。第三位数的是算几轮,第四位数的是这件事套几层。

3.4、三种写法,同一根轴

绕回来再看, Ackermann 的第一个参数 $m$、箭头 $a\uparrow^{n}b$ 里的 $n$、链 $a\to b\to c$ 里的 $c$,说的是同一件事:

说法 参数是什么
Ackermann 的第一个参数 $m$ 第几级运算
Knuth 箭头 $a\uparrow^{n}b$ 里的 $n$ 箭头个数
Conway 链 $a\to b\to c$ 里的 $c$ 箭头个数

而且三者和 Ackermann 可以互相换算:

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

区别只在你能把这个参数写多大:

  • 箭头记号:参数得数着写, 3 个、4 个;
  • Ackermann :参数是个自然数,可以取 4、5、100 ,但通常也只取小的;
  • Conway 链:参数本身可以是一个 $3\to3\to64\to2$ 量级的数。

每一层解决的问题都一样:上一层把参数写死了,下一层就把这个参数解放出来,变成可以算的东西。造大数的套路就这一条。

4、四、还没到换语言的地方

上面这些数全都还在同一个层级里。Ackermann 函数停在 $\omega$ 层,葛立恒数(把 $f(n)=3\uparrow^{n}3$ 这样的函数迭代 64 次)也只在 $\omega+1$ 层。它们之间的差别,用「重复」和「参数化」就解释完了,全程没有用到任何新数学。

真正需要换一套语言的是 TREE(3)。那里的「长」不来自重复,而来自一个游戏最多能玩多少轮。那是另一个话题了。

5、符号表

符号 含义
$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(x_1,\dots,x_n)$ 多元 Ackermann 函数,$n$ 个参数对应 $\omega^{n-1}$ 层
$a\to b\to c$ Conway 链:前三位就是箭头,$c$ 是箭头个数
$a\to b\to c\to d$ 第四位起第三位变成迭代次数,箭头个数由上一轮结果顶上
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)。
今天又去雁栖湖捡板栗。说三件事。