数学科普
边看边说序列的宇宙学(五)
作者:安迁
六、具体的应用:“1”,“2”和“3”的比例
先解释一下这里“应用”的意思。许多读者看到这个理论的第一个(或第二个第三个……)反应也许会是“那这个理论在实际中有什么用途呢?
边说边看理论中的“说”“看”过程其实是一种被称为“游程编码”的编码方式。这种编码方式有时被用作数据压缩的方式,如在一些图像格式中。也许因为是这个原因,康威的论文在第二次发表时,刊登在一本和通信有关的学术论文集上。(第一次发表在剑桥大学数学学会的会刊Eureka上。)如果要强调边看边说理论有什么实际应用,也许这是个好的切入点。
不过我觉得这理论其实并没有什么实际用途,至少到目前为止没看见它有。它的价值在于它的美,而它的美源于它起源的质朴和内容的(相对)深刻以及形式的奇诡之间的强烈对比。一个数学理论,它是美的,这就是很好的价值了。
本节和后面所说的“应用”,是用康威的理论去回答一些问题。这些问题并不依赖于理论而存在;从原则上说,以直接产生边看边说序列再作观察的方式也能回答这些问题;但从现实上这样做非常困难,或根本不可能。本节想问的问题就是,从1开始的边看边说序列,它的第100,或是第1000000项有多少个数字,其中分别有多少“1”,“2”和“3”?
用直接写出每一项的方法,我们很容易计算出这个序列的前面几项的长度: 1, 2, 2, 4, 6, 6, 8, 10, 14, 20, 26, 34, 46, 62, 78, …… 但是这个直接生成数字串并作统计的方法会变得越来越困难,所需要的计算量和储存空间越来越大。根据算术定理,序列长度以指数增长。取康威常数为1.3,以非常粗略的方式估计,它的第100项的长度大约会是1.3100≈2×1011,也就是千亿这个数量级,生成新数字串的计算量变得非常大。而它的第1000项的长度则要超过10100,此时光是储存数字串也变得不可能,因为可观测宇宙内的原子总量据估计也仅有1080个。如果我们想知道第1000000项数字串有多长,其中分别有多少“1”,“2”和“3”,靠直接生成数字串的方法是完全不可行的。
但通过康威理论,这个问题就容易解决了。
我们知道,从数字串1开始的边看边说序列在第8项演化成由一个72铪元素和一个50锡元素组成的化合物。从这一天起,通过查询元素列表中的“一天后衰变物”一栏,每天演化出来的化合物中的各元素数量都可以通过前一天化合物中各元素的数量来计算:比如说,如果前一天的化合物中有100个31镓元素,那么次日的化合物中就会因此产生100个1氢元素,200个20钙元素,100个30锌元素,100个63铕元素和100个89锕元素。由分割的原理,化合物中的每一个元素都可以看作是在独立演化而不和化合物中其他(同种或不同种的)元素的演化过程相互干扰。92种元素中的每一种都可如此算出次日产生的元素数量,求和后就可得出次日产生的化合物中每种元素的含量。下面给出了第8项到第20项以及第99和第100项的结果:
项 | 化合物中元素个数 |
---|---|
8 | 50锡:1, 72铪:1 |
9 | 49铟:1, 71镥:1 |
10 | 48镉:1, 70镱:1 |
11 | 47银:1, 69铥:1 |
12 | 20钙:1, 27钴:1, 46钯:1, 68铒:1 |
13 | 19钾:1, 26铁:1, 45铑:1, 61钷:1, 67钬:1 |
14 | 18氩:1, 25锰:1, 44钌:1, 60钕:1, 66镝:1, 67钬:1 |
15 | 14硅:1, 17氯:1, 20钙:1, 24铬:1, 43锝:1, 59镨:1, 63铕:1, 65铽:1, 66镝:1 |
16 | 13铝:1, 16硫:1, 19钾:1, 23钒:1, 42钼:1, 58铈:1, 62钐:1, 64钆:1, 65铽:1, 67钬:1 |
17 | 1氢:1, 12镁:1, 15磷:1, 18氩:1, 20钙:3, 22钛:1, 27钴:2, 30锌:1, 41铌:1, 57镧:1, 61钷:1, 63铕:1, 64钆:1, 66镝:1, 67钬:1 |
18 | 1氢:1, 11钠:1, 14硅:1, 17氯:1, 19钾:3, 20钙:1, 21钪:1, 26铁:2, 27钴:1, 29铜:1, 40锆:1, 56钡:1, 60钕:1, 61钷:1, 62钐:1, 63铕:1, 65铽:1, 66镝:1, 67钬:1, 68铒:1 |
19 | 1氢:3, 10氖:1, 13铝:1, 16硫:1, 18氩:3, 19钾:1, 20钙:3, 25锰:2, 26铁:1, 27钴:1, 28镍:1, 30锌:1, 39钇:1, 43锝:1, 55铯:1, 59镨:1, 60钕:1, 61钷:2, 62钐:1, 64钆:1, 65铽:1, 66镝:1, 67钬:3, 91镤:1 |
20 | 1氢:3, 9氟:1, 12镁:1, 14硅:2, 15磷:1, 17氯:3, 18氩:1, 19钾:3, 20钙:2, 24铬:2, 25锰:1, 26铁:1, 27钴:2, 29铜:1, 30锌:2, 38锶:1, 42钼:1, 54氙:1, 58铈:1, 59镨:1, 60钕:2, 61钷:1, 63铕:1, 64钆:1, 65铽:1, 66镝:3, 67钬:1, 90钍:1, 92铀:1 |
…… | …… |
99 | 1氢:4691100944, 2氦:165443203, 3锂:215681190, 4铍:115695809, 5硼:150822242, 6碳:196612989, 7氮:256289758, 8氧:334109221, 9氟:435521299, 10氖:567746714, 11钠:740109987, 12镁:963360027, 13铝:1255875949, 14硅:1637061009, 15磷:761282011, 16硫:992385048, 17氯:1293649677, 18氩:1686376168, 19钾:2198310128, 20钙:2865702632, 21钪:475403674, 22钛:619707840, 23钒:807869353, 24铬:1053079407, 25锰:1372805933, 26铁:1789538724, 27钴:2332796196, 28镍:708914937, 29铜:924108976, 30锌:1204656427, 31镓:73988320, 32锗:96469025, 33砷:1392190, 34硒:1815606, 35溴:2365672, 36氪:3085121, 37铷:4020174, 38锶:5242224, 39钇:6832700, 40锆:8906884, 41铌:11611903, 42钼:15135774, 43锝:19730743, 44钌:16815556, 45铑:21915698, 46钯:28573816, 47银:37243811, 48镉:48553385, 49铟:63292574, 50锡:82503511, 51锑:107561269, 52碲:140193810, 53碘:182776636, 54氙:238246907, 55铯:310575027, 56钡:404869781, 57镧:527760537, 58铈:687995253, 59镨:896840060, 60钕:1169110252, 61钷:1524039042, 62钐:787449908, 63铕:1026527981, 64钆:1107125354, 65铽:1443203081, 66镝:1881376627, 67钬:2452457782, 68铒:56140486, 69铥:61583963, 70镱:80267716, 71镥:104644933, 72铪:136410084, 73钽:12370610, 74钨:16129510, 75铼:8650442, 76锇:11278847, 77铱:14701905, 78铂:19164576, 79金:24984156, 80汞:32568011, 81铊:42453401, 82铅:55346940, 83铋:72137420, 84钋:94051424, 85砹:122587668, 86氡:159815386, 87钫:208325443, 88镭:271566398, 89锕:354021423, 90钍:387482170, 91镤:505122669, 92铀:5242224 |
100 | 1氢:6115208888, 2氦:215681190, 3锂:281139012, 4铍:150822242, 5硼:196612989, 6碳:256289758, 7氮:334109221, 8氧:435521299, 9氟:567746714, 10氖:740109987, 11钠:964752217, 12镁:1255875949, 13铝:1637061009, 14硅:2134087944, 15磷:992385048, 16硫:1293649677, 17氯:1686376168, 18氩:2198310128, 19钾:2865702632, 20钙:3735611106, 21钪:619707840, 22钛:807869353, 23钒:1053079407, 24铬:1372805933, 25锰:1789538724, 26铁:2332796196, 27钴:3041023181, 28镍:924108976, 29铜:1204656427, 30锌:1570353165, 31镓:96469025, 32锗:125738441, 33砷:1815606, 34硒:2365672, 35溴:3085121, 36氪:4020174, 37铷:5242224, 38锶:6832700, 39钇:8906884, 40锆:11611903, 41铌:15135774, 42钼:19730743, 43锝:25722440, 44钌:21915698, 45铑:28573816, 46钯:37243811, 47银:48553385, 48镉:63292574, 49铟:82503511, 50锡:107561269, 51锑:140193810, 52碲:182776636, 53碘:238246907, 54氙:310575027, 55铯:404869781, 56钡:527760537, 57镧:687995253, 58铈:896840060, 59镨:1169110252, 60钕:1524039042, 61钷:1986649110, 62钐:1026527981, 63铕:1338123040, 64钆:1443203081, 65铽:1881376627, 66镝:2452457782, 67钬:3197005997, 68铒:73195866, 69铥:80267716, 70镱:104644933, 71镥:136410084, 72铪:177813813, 73钽:16129510, 74钨:21021052, 75铼:11278847, 76锇:14701905, 77铱:19164576, 78铂:24984156, 79金:32568011, 80汞:42453401, 81铊:55346940, 82铅:72137420, 83铋:94051424, 84钋:122587668, 85砹:159815386, 86氡:208325443, 87钫:271566398, 88镭:354021423, 89锕:461470490, 90钍:505122669, 91镤:658459711, 92铀:6832700 |
接下来当然就很简单了,统计一下每种元素里“1”,“2”和“3”的数量,乘以化合物中此种元素的数量,再分别相加,就得到了化合物中“1”,“2”和“3”的数量。计算的结果是,第100项有511247092564个数字,其中有253103530928个”1”,63796211233个”2”和94347350403个”3”。“1”,“2”和“3”在此项中的比例大约分别是49.507084658%,32.038560926%和18.454354416%。(上面这三个百分比相加不严格等于100%,因为分别有尾数的四舍五入。下同。) 注意到这个结果和我们上面粗略的估计千亿这个数量级是相符的。
对第100项可以这样算,对第1000000项也同样可以这样算,没有什么原则上的不同。只是对第1000000项来说,其中所含的元素数量实在太多,如果在编程时使用普通的32位或64位甚至128位的整数类形来表示是远远不够的,必须使用支持任意长度整数的数据类型,比如Java语言中的BigInteger。不过在此无法将这些数字具体写出来:第1000000项的长度以十进制数表示出来的话会有115137位,写出来将是一本中篇小说的篇幅。“1”,“2”和“3”的数量也一样无法具体写出,它们在此项中的比例分别约为49.507077868%,32.038585700%和18.454336321%。
看来当项数比较大时,“1”,“2”和“3”在数字串中的比例会趋向定值。这其实是算术引理的推论。因为随着项数趋于无穷,各元素在数字串中的比例趋近于它的丰度。以每种元素中“1”,“2”和“3”的数目乘以它的丰度,再分别相加能得到三个数字a,b和c,将它们归一化操作(即分别除以a+b+c)后就得到了当项数趋于无穷时“1”,“2”和“3”的比例的理论值,结果是约49.507077857%,32.038585734%和18.454336411%,和上面的结果相符。
我们可以问,为什么上面使用的计算长度的方法要比直接产生此项数字串再统计其长度的暴力法的计算速度快得多。因为在这种方法中,元素之间的顺序这个信息被省略而不参与计算。在前面的表中,我们只知道每一项化合物中每种元素有多少,但不知道它们分别处于化合物的什么位置。依照化学中表示物质组成的化学式来作比方的话,直接产生某项数字串类似于要知道物质的结构式,而上面的计算则只是得到了物质的实验式。而我们要知道数字串的长度或是其中“1”,“2”和“3”的数量,却恰恰并不需要知道元素之间的顺序。
七、具体的应用:第1000000项的某位数字
前面一节中的计算因省略计算元素之间的信息而变得迅速,但康威的理论也同样能帮助我们快速地知道,以1开始的边说边看序列的某项数字串的某个具体位置的数字是什么。
比如我们可以计算出,序列的第1000000项是以“132113213221133112”开始的。这我们甚至可以用手算:它的第8项以72铪开头,于是第9项以71镥开头,然后依次以70镱,69铥,68铒,67钬,66镝,65铽开头,第16项又以67钬开头,我们发现了67钬→66镝→65铽→67钬……这个循环,所以此后所有3n的项都以65铽开头,3n+1的项都以67钬开头,3n+2的项都以66镝开头,于是第999999项以65铽开头,而第1000000项以65铽一天后的衰变物,也就是67钬64钆开头。要计算第1000000项是以什么结尾的可用类似办法。这其实是起首引理和结尾引理的推论。
任意给定自然数n,要计算第1000000项数字串的第n位是什么数字则比较麻烦一点,但原则上来说也不难,当然一般不能用手算。序列在第8项演化成72铪50锡。而按照前面的方法,我们可以精确计算72铪演化1000000-8=999992天后产生的化合物的长度d;如果d大于等于n,那么原问题就转化为72铪演化999992天后数字串第n位是什么数字,反之则转化为50锡演化999992天后数字串第n-d位数字是什么。这种方法可以一直继续下去直到求出结果:当化合物中有超过一个元素时,我们求出第一个元素最终产物的长度,以便知道我们感兴趣的那一位数字是否由它产生,如果不是,则可以抛弃这个元素(并修正所求数字所在的位数);当化合物中只有一个元素,则将其代换为它一天后的衰变物,再重复这个步骤。
上面的算法的具体实现则需要一点技巧,因为单独一次计算某元素在若干天后产物的长度虽然并不耗时,但如果每次使用都需要重新计算的话,所用的总时间也是惊人的。所以可以预先计算,要用时再查表。可是如果所有计算结果都储存的话,需要的空间相当大(大概超过2To)。笔者采用折衷的方式,储存每隔1000天的结果,将所需空间削减为原需的千分之一,中间结果则在需要时再当场计算填充。具体的程序实现属于编程和算法问题,在此就不详细介绍了。在一台并不很新的个人电脑上,笔者的程序用大约20分钟生成上面所说的元素产物长度表格,每回答一个“第1000000项数字串中间第n位是什么”的问题则需要大约10分钟。计算结果:序列从第1040000位开始的几个数字是3222112,它其实是一个3锂元素的结尾部分;第1090000位开始的几个数字是312,它其实是一个3钒元素的结尾部分。
参考文献:
[1] John Horton Conway, The weird and wonderful chemistry of audioactive decay, Eureka 46:5-16 (1985); reprinted in Open Problems in Communication and Computation, T.M. Cover & B. Gopinath, eds., Springer-Verlag, New York, 173–188 (1987).