科学领域中即闹含义之最大数字是小?
白书旭 4小时前 142科学领域的数字,都很小,用多重指数(多层科学计数法)就可以表达出来。
1层指数:粒子的数目。
1摩尔是6×10^23,而整个可观测宇宙范围内的质子数则是136×2^256(约为1.575×10^79。这个奇怪的表达式是Arthur Eddington给出的),光子数是1.1×10^89,而所有的基本粒子的数目则约为10^97。
2层指数:粒子的排列。
只需要很少的几个粒子,它们的排列数就已经可以超过宇宙中所有基本粒子的数目了。比如6阶魔方的状态数是1.57153×10^116。“微观状态数”就是这样一种排列的概念,而且参与排列的粒子数目更大。整个可观测宇宙的熵大约是10^120,这意味着微观状态数大概是。
3层指数:庞加莱回归时间。看这篇文章的第8页
到这个层次,单位已经不重要了(于是会出现“Planck times, millenia, or whatever”)。
一个箱子仅包含一个质量为M普朗克质量的黑洞,那么它的庞加莱回归时间是。如果把整个可观测宇宙的质量代入,就是这样的数字。最后,如果用林德暴胀模型来估计整个宇宙的大小,再代入前面的式子,那就会得到
这样的数字。
==========================================
题主一定会想:才这么点大,太无趣了。因为现实世界实在是太小太小了。如果你踏入数学领域,那么你将看到更加巨大的数字。
这些“更加巨大的数字”,我主张分成3类。第一类,最小的,是可定义、可计算的数,或者能被这样的数限制住的数。第二类,更大的,是可定义、不可计算的数,或者能被可定义的数限制住,却没有算法可以计算的数。第三类,最大的,则是不可定义的数。
一、Moser数
见白书旭的回答。作为对比,“5放进一个4边形”就已经超过科学领域的最大数字了。
二、Graham数
见白书旭的回答。作为对比,(就只有2层)就已经超过Moser数了。
三、Goodstein数列
这是一个非常重要的东西,从这里我们将引出序数在大数里的运用。
首先,把一个正整数n写成下面这种形式,称作“k进制形式”。
其中都是小于k的正整数,且都是正整数。
其次,定义“以k为底的遗传记法”。如果n<k,那么n是以k为底的遗传记法。如果想把一个不小于k的数写成以k为底的遗传记法,那就要先写成k进制形式,然后把指数都写成以k为底的遗传记法。
接下来就可以定义Goodstein数列了。给定一个起始数,就可以得到一种Goodstein数列。
可以用这种办法得到:先把写成以n为底的遗传记法,然后把里面出现的n都改成n+1,最后减去1。
比如起始数为10,那么
,写成以2为底的遗传记法,就是,简单一点就是。如果把2改成3,就得到。
,写成以3为底的遗传记法,就是。如果把3改成4,就得到。
,写成以4为底的遗传记法,就是。如果把4改成5,就得到。
,写成以5为底的遗传记法,就是。如果把5改成6,就得到。
,写成以6为底的遗传记法,就是。如果把6改成7,就得到。
,写成以7为底的遗传记法,就是。如果把7改成8,就得到。
,
……
这个数列看上去在一直递增,似乎没完没了的样子。但我们总还得问一句,如果某一项是0那怎么办?答:到此为止。如果某一项,那这个数列就只有n项,只有有限项。
下面的定理令人吃惊:
所有的Goodstein数列都只有有限项。
这样我们就能定义出Goodstein函数了。是以n为起始数的Goodstein数列的非零项数。
于是,G(1)=1,只有两项:1,0。
G(2)=3,只有四项:2,2,1,0。
G(3)=5,只有六项:3,3,3,2,1,0。
G(4)则比较大。
第1项:2^2=4;
第2项:3^3-1,但这种写法不是以3为底的遗传记法,得改写成2*3^2+2*3+2才行。
第3项:2*4^2+2*4+1
第4项:2*5^2+2*5
第5项:2*6^2+2*6-1=2*6^2+6+5
第6项:2*7^2+7+4
第10项:2*11^2+11
第11项:2*12^2+12-1=2*12^2+11
第12项:2*13^2+10
第22项:2*23^2
第23项:2*24^2-1=24^2+23*24+23
第24项:25^2+23*25+22
第46项:47^2+23*47
第47项:48^2+23*48-1=48^2+22*48+47
……
虽然我们没有办法把它一项一项地列出来,但可以想象出,这个过程,如果总是用遗传记法来表示,那么就像是一个倒计时的钟表,只不过每一个“小时”值好多“分钟”,每一个“分钟”值好多“秒”,而且随着项数的增加,每一个“分钟”值的“秒”数会增多,每一个“小时”值的“分钟”数也会增多,但不管怎样,这个倒计时总会结束。
无独有偶,集合论中的序数(ordinal)刚好也具有这种性质。如果一个序数的序列,每一项都小于前一项,那么一定只能有有限项。像刚才的倒计时那样,“每一项都小于前一项”的方式,可以是扣掉这一“秒”,也可以是把一个“分钟”换成许多“秒”,把一个“小时”换成许多“分钟”等等。这就启发我们定义一种通用的、基于序数的“倒计时”,称作Hardy hierarchy。
- ,其中n是任意自然数。
- ,其中n是任意自然数,α是任意序数。
- ,其中n是任意自然数,α是非零极限序数。
而最后这个表达式中的α[n],就是把一个“小时”换成许多“分钟”的方式。
用Cantor标准式来表示序数,即,其中都是正整数,且都是序数。用这种方式表示的非零极限序数,可以定义。而且。然后;如果β是非零极限序数,那么。
于是我们就得到了Goodstein函数的一种比较简单的表达式:
,其中α是把n写成以2为底的遗传记法,再把2换成ω,所得的序数。
作为对比,G(12)大于Graham数。Graham数若用Hardy hierarchy表示,仅仅介于和之间罢了,而Goodstein函数却能达到这种级别。
四、TREE(3)
TREE(3)源于TREE函数。
在所有由“顶点k染色的树”组成的,而且满足下面的两个条件的序列中,序列的最大长度就记作TREE(k)。
- 任意正整数i,序列的第i项只有不超过i个顶点
- 任意正整数i<j,序列的第i项不能嵌入第j项
这里,顶点染色的树之间的嵌入关系比较复杂,但可以转换成下面这个比较简单的定义。如果树A能够通过有限次“去掉一个叶子”和“去掉一个子顶点数为1的顶点,并把它的子顶点和它的父顶点连接起来”操作变成树B,那么B就能嵌入A。
定义到此为止。
来试一试吧!我们用一对括号表示一个顶点,最外层的括号表示根顶点,一对括号里面一层的括号是它的子顶点。用不同括号(如()、[]、{}、<>、()、【】、《》等)表示不同的顶点颜色。
TREE(1)=1
- (),只有1个顶点的树
TREE(2)=3
- 首先是[],然后我们就不能用任何带有[]的树了。
- 然后(())
- ()
接下来就到TREE(3)了。
- 首先当然是{}
- 然后[[]],当然,这里我们只列了一种可能的序列,因此我们只能得出TREE(3)的一个下限。
- [()()]
- [(()())],注意,由于最外面的小括号有2个子顶点,所以不能直接去掉,意味着这个树不能嵌入[()()]。
- [(((())))]
- (([((()))]))
- ([((()))][][])
- ([((()))][]()())
- ([((()))]()()()())
- ([((()))](())(())())
- ([((()))](()()())()())
……
接下来的事情有点复杂,所以我们还需要一个辅助函数来帮忙——tree函数。
在所有满足下面的两个条件的“树列”中,“树列”的最大长度记作tree(n)。
- 任意正整数i,“树列”的第i项只有不超过i+n个顶点
- 任意正整数i<j,“树列”的第i项不能嵌入第j项
tree和TREE的不同之处在于,tree的序列中,顶点数可以更多,但它全都只能用一种颜色。但,tree和TREE的相同之处在于,有限树的嵌入关系是Well-quasi-ordering。这就直接使得TREE(n)和tree(n)都是有限值,有点类似于Goodstein数列和序数。但和序数不同的是,树与树之间是可以互不嵌入的,但序数与序数之间肯定得有一个小于等于另一个。
不过,我们仍然可以作一个从有限树到序数的对应,使得如果两个树之间有嵌入关系,那一定是序数小的树嵌入序数大的;而任意两个树,序数大的树一定不能嵌入序数小的。然后,把初始的树选成一个尽可能大的序数,按照Goodstein数列那里说的办法,一点一点地降下来,直到0为止。最后用Hardy hierarchy把tree(n)还有TREE(3)表示出来!
于是,问题就转化成了,如何作一个从有限树到序数的对应,而且得到的序数上限可以尽可能地大?对于tree中的序列,这里给出了答案,不过它讨论的是有向树(就是分左右的树。其实无向树的情况也类似,极限是;作为对比,Goodstein函数的增长率仅仅到达罢了)。
为了表示更大的序数,我们需要一点新记号——φ函数。
,其中α是非零极限序数
,其中α是非零极限序数
,其中β是非零极限序数
以上仅仅是二元φ函数罢了,还不够。接下来是广义的φ函数(标准记法是,其中),只有这样才能赶上TREE序列。
- ,其中α是非零极限序数
- ,其中β是非零极限序数
- ,
- ,其中α是非零极限序数
- ,其中β是非零极限序数
- ,
其中#表示任意多个(或者0个)形如“α @ β”的项,“α @ 0”项可直接写作“α”,“0 @ β”这样的项则可以省略。
那么,接下来便是TREE(3)的序列中,有限树到序数的对应。
- []对应
- ([])对应
- (([]))对应
- ([]())对应
- ([](()()()))对应
- ([][])对应
- (([][]))对应
- (([][])(()()()))对应
- (([])[])对应
- ((([]))[])对应
- (([]())[])对应
- (([][])[])对应
- ((([][])[])[])对应
- (([])([]))对应
- (([][])([][]))对应
- ((([][])([][]))(([][])([][])))对应
- ([]()())对应
- ([](())())对应
- ([][]())对应
- ([](())(()))对应
- ([][][])对应
- ([]()()())对应
- ([][][][])对应
- ([]()()()())对应
- [()]对应
- [(())]对应
- [((()))]对应
- ……
中间的过程比较繁琐,不过最后还是可以得出结果的——
其中,tree(3)不像TREE(3)那样巨大,但也至少是262140。而tree函数则增长得和一样快,远远快于Goodstein函数。
五、SCG(3)
如果说TREE函数是因为有限树之间的嵌入关系是well-quasi-ordering而成为有限值,那么SCG函数则是因为有限图之间的嵌入关系是well-quasi-ordering而成为有限值——前者是后者的一种特殊情况。SCG是subcubic graph的缩写,这个函数的完整定义如下:
在所有满足下面的三个条件的“图列”中,“图列”的最大长度记作SCG(n)。
- 所有图的所有顶点的度都不超过3
- 任意正整数i,“图列”的第i项只有不超过i+n个顶点
- 任意正整数i<j,“图列”的第i项不能嵌入第j项
图的嵌入关系又可以这么定义。如果图A通过有限次“把一条边分成两段,中间添加一个顶点”的操作,图B通过有限次“去掉一个度为0的顶点”和“去掉一条边”的操作,成为相同的图,那么图A就能嵌入图B。
因为有限图之间的嵌入关系是well-quasi-ordering,所以我们也可以作一个从有限图(每个顶点的度不超过3)到序数的对应,像前面tree函数中所作的那样。只不过复杂得多,所需的序数也大得多——大得连φ函数都无法表示(可以用ordinal collapsing function表示)。然后把这些大得连φ函数都无法表示的序数放到Hardy hierarchy里面,那就是SCG函数的增长率。
作为对比,SCG(3)>TREE(TREE(…TREE(TREE(3))…)),其中有TREE(3)个TREE。
(不写SCG(3)的近似表达式了,太复杂)
六、燃烧数(fusible number)
给你们足够过的能够燃烧的绳子,已知每根绳子烧完需要1分钟,但是绳子不均匀,所以你没有办法在绳子燃烧的中途判断时间。那么你将如何测量出45秒?
这个问题看似简单,其中蕴含的模型可不简单。把这个模型中的数学关系提炼出来,可以得到这样一个关系。假设S是用这些绳子能够测量的所有时间(分钟)组成的集合,那么
这样,开头的问题就很明显啦。S中先有0,然后取a=0、b=0就有1/2,最后取a=0、b=1/2就有3/4。
但是,其中蕴含的模型可不简单。你会发现,在0~1/2之间有一段空白,这段空白的时间用这些绳子是烧不出来的。换句话说,超过0的能烧出的最小数是1/2分钟。于是定义
也就是说,m(x)是超过x的能烧出的最小数与x的差。
当x是自然数的时候,m(x)迅速地衰减。于是定义,这就是一个增长得飞快的函数。
这个函数增长得比Goodstein函数快,但比ZFC的可证性极限要慢。而它的准确的增长率仍是个未解之谜。
七、Loader数
如果仅仅给你们512个字符(不计空白)的空间,编出一段程序,在一台假想的、有着足够大的内存的计算机上,运行足够长的时间,你最多能让它输出多大的数呢?乍一看,512个字符少之又少,甚至根本难以把像TREE函数、SCG函数那样的东西定义出来,然而Ralph Loader却写出了下面这段C语言代码,输出一个疯狂的大数——Loader数。
#define R { return#define P P (#define L L (#define T S (v, y, c,#define C ),#define X x)#define F );}int r, a;P y, X R y - ~y << x;}Z (X R r = x % 2 ? 0 : 1 + Z (x / 2 FL X R x / 2 >> Z (x F#define U = S(4,13,-4,T t){ int f = L t C x = r; R f - 2 ? f > 2 ? f - v ? t - (f > v) * c : y : P f, P T L X C S (v+2, t U y C c, Z (X ))) : A (T L X C T Z (X ) F}A (y, X R L y) - 1 ? 5 << P y, X : S (4, x, 4, Z (r) F#define B (x /= 2) % 2 && (D (X { int f, d, c = 0, t = 7, u = 14; while (x && D (x - 1 C B 1)) d = L L D (X ) C f = L r C x = L r C c - r || ( L u) || L r) - f || B u = S (4, d, 4, r C t = A (t, d) C f / 2 & B c = P d, c C t U t C u U u) ) C c && B t = P ~u & 2 | B u = 1 << P L c C u) C P L c C t) C c = r C u / 2 & B c = P t, c C u U t C t = 9 ); R a = P P t, P u, P x, c)) C a F}main () R D (D (D (D (D (99)))) F
这里,假定整数类型可以容纳足够大的数而不溢出,当这段程序从main函数结束的时候,它的返回值就是Loader数。
Loader数的建立是基于一种强规范化的形式系统——构造演算而得到的。它是如此巨大,直到目前,仍然没有人能把它估计出来。
八、Busy beaver
现在,我们将远离第一类大数,进入第二类大数的领域,而Busy beaver则是第二类大数的大门。毫不夸张地说,第一类数和第二类数之间的差别,正如人与神仙之间的差别。因为,
- 第二类大数是不可计算的。
不仅如此,生成第二类大数的函数,它们的增长率都会超过一切可计算的函数。前面所述的大数,不论是Graham数、TREE(3)还是Loader数,它们都有算法把它算出来,只是你需要的时间、空间可能会很多罢了。
下面是这个函数的定义。
在所有n状态、2色的、能够停机的图灵机中,从开始运行(空白纸带)到停机为止写入的格子数的最大值,记作BB(n)。
很简洁,对不对?但这个定义里面就包含了一个不可解的问题——你怎么知道一个图灵机能不能停机?你可能会想,试着运行一下不就明白了?可是,当它运行了很多很多步以后,看上去还没有停机,那样你怎么能知道它到底是“不能停机”,还是“能停机”只不过需要更多的步数呢?
不过,对于某个特定的图灵机,如果你仔细琢磨,还是能得出它能否停机的结论的。但是,不存在这样一种算法,对于所有的图灵机,都能判断出能否停机。因此,也就不存在这样一种算法,能够对于所有的正整数n,得出BB(n)的值。这,正是“不可计算”的含义。
BB(1)=1
BB(2)=4
BB(3)=6
BB(4)=13
,这就超过整个宇宙的庞加莱回归时间了
BB(18)>Graham数
,这就超越Goodstein函数了
BB(1919)则被证明独立于ZFC。
上面这些不等式中,很多都是很弱的下界。比如BB(10)的下界就是从得到的。而取n=1,你发现BB(6)远远大于27。又如从前人们认为BB(64)>Graham数,但后来证明了BB(25)>Graham数,然后这个界限一直被缩小到了BB(18)。
与Busy beaver处在同一等级的,还有从元胞自动机、标记系统、λ演算、组合子演算、各式各样的高级编程语言等等这些系统引申出的函数。例如评论里所说的,如果我们定义f(x)为“一个长度为x的C语言程序能输出的最大数(规则类似于Loader数)”,那么f(512)至少是Loader数,并且这个f函数也是不可计算的,和BB(n)增长得一样快的,增长得比一切可计算函数都快的。
神仙,也有俯瞰人间的时候。当这些不可计算的“神仙”下凡,来到人间的时候,便成了可计算的函数。然而这些所谓的可计算的函数却可以轻轻松松地超越前面那些大数。这些“神仙”,一种通用的“凡间装束”,就是——
设T是一个形式演绎系统。可以把某个图灵机能停机这种命题转换成T中的命题。首先列出T中所有不超过n个字符的证明,然后在这些证明之中找出“图灵机M能停机”(其中图灵机M是2色的、不超过n状态的图灵机)的证明,最后取所有这些图灵机从开始运行(空白纸带)到停机为止写入的格子数的最大值,记作BB(T,n)。
既然上面这个定义已经是一种计算的办法,那么这个函数就是可计算的了。对于任何形式演绎系统T,BB(T,n)的可计算性在T中不能被证明,而且BB(T,n)总是增长得比T能够证明可计算的任何函数都要快。
比如Peano算术(PA),BB(PA,n)增长得和以及Goodstein函数一样快。
二阶算术的一个子系统,增长得比SCG函数还快。
ZFC,BB(ZFC,n)增长得肯定比燃烧数快,甚至可能比Loader数里面定义的D函数还快。
而在ZFC之上,则是ZFC再加上“存在具有‘某性质’的基数”一条公理,所得的玩意儿。其中最为强大的,加的是下面这条公理:(不知道怎么翻译)
I0: There exists a cardinal number ρ that satisfy "There exists a nontrivial elementary embedding ".
即使“神仙”下凡,隐藏了绝大部分的实力,成为BB(ZFC+I0,n),也能傲视“可计算的”群雄。
九、Ξ函数
即便是“神仙”一样的第二类大数,它们之间也有高下之分。上面说到的busy beaver,虽然能够傲视“可计算的”群雄,却是第二类大数的领域里最下等的角色。
Ξ函数是由组合子演算中的SKI演算引申出来的。为了理解它的定义,我们首先需要了解SKI演算。
首先定义SKI演算中的“公式”:
S是一个公式。K是一个公式。I是一个公式。
如果字符串a和b都是公式,那么(ab)也是一个公式。
然后是演算本身。下面3种操作的有限次复合称作β-规约:
- 把形如(((Sa)b)c)的公式变换为((ac)(bc))
- 把形如((Ka)b)的公式变换为a
- 把形如(Ia)的公式变换为a
SKI演算的计算能力和图灵机一样强。因此,按照下面的方法定义出的SKI函数,其增长率与busy beaver相当:
把不能进行β-规约的公式称作β-范式。从所有长度不超过n的公式开始,通过β-规约,所能得到的最长的β-范式的长度记作SKI(n)。这里,“长度”指的是一个公式里字母的个数,不计括号。
例如(((SS)S)(SI))经过β-规约得到((S(SI))(S(SI))),就不能进行β-规约了,这个((S(SI))(S(SI)))就是一个从长度为5的公式出发得到的β-范式,它的长度为6,所以。又如(((SI)I)((SI)I))经过β-规约得到((I((SI)I))(I((SI)I))),然后又得到(((SI)I)(I((SI)I))),又能得到(((SI)I)((SI)I))自己。不论如何操作,不论操作多少次,总是不能得到β-范式。
下面就是Ξ函数超越busy beaver的办法。定义一个新符号:Ω,作为一种公式。它在β-规约中的地位相当特殊:
- 对于形如(((Ωa)b)c)的公式,如果a能够通过β-规约得到I,那么把(((Ωa)b)c)变换为b,否则变换为c。
这个符号有能力引起一些悖论。可以证明存在一个这样的公式p,它可以β-规约为(((Ωp)(((SI)I)((SI)I)))I)。引出的问题是,p能不能β-规约为I呢?如果能,那么根据新规则,(((Ωp)(((SI)I)((SI)I)))I)将变换为(((SI)I)((SI)I)),它就不能β-规约为I;如果不能,那么根据新规则,(((Ωp)(((SI)I)((SI)I)))I)将变换为I。对于任意的公式,它是否会引起这样的悖论,是不可判定的(没有通用的算法),这就使得它比busy beaver还要强大。
最后,Ξ函数定义如下:在含有Ω的SKI演算中,从所有长度不超过n的公式开始,通过β-规约,所能得到的最长的β-范式的长度记作Ξ(n)。
Ξ(1)=1
Ξ(2)=2
Ξ(3)=3
Ξ(4)=4
Ξ(5)=6
Ξ(6)=17
Ξ(7)=51
,超过Graham数
人们对Ξ函数了解得太少,还不知道当n有多大的时候Ξ(n)能够超越busy beaver。
十、Rayo数
如果说busy beaver是第二类大数的大门,那么Rayo数便是第三类大数的大门。与前两类大数相比,Rayo数简直就是开挂。简单说来,Rayo数是在一阶集合论语言中用不超过个字符能够定义出的有限的数的上确界。
感觉是不是很像“用不超过十七个字能够表示的最大的数”之类的定义方式?为了避免自我指涉的麻烦,Rayo数选定的是一阶集合论语言这一形式语言,但为此付出的代价就是,Rayo函数(把Rayo数的定义里面的“”换成自变量)不能在一阶集合论语言中定义。
人们对Rayo函数了解得实在太少,还未发现它的一些函数值。
(全文完)