专题 · 12 环 · 1 环的主人不在馆里
计算机
终点:你手边任何一台机器里的那颗处理器
「照着步骤做」这件事本身被一点点看清楚:先有了名字,再有了记数法,再被写成代数,最后被问「有没有做不到的事」——答案是有,而正是这个答案给出了机器的设计图。
缩略轴按先后排列,间距不表示年数;实心=馆里有他,空心=还没有。
- 约820
把解题写成一串照着做就行的步骤算法
花拉子米约780–约850《algebra 与 algorithm》
他那本讲印度数字的书,十二世纪的拉丁译本开头一句是「花拉子米如是说」,Algoritmi dixit。译名在欧洲变成了这类步骤的通称,「算法」这个词就是这么来的。他本人没有定义过算法,是他的书名替他做了这件事。
- 1617
把数拆成 1、2、4、8,乘法只剩挪子与并子算法
棋盘上只有两条规矩:竖走一格值翻倍,斜走值不变。两个因数摆在两边,交点落子,斜着滑到边上,两子并一子——一套不用背九九表的乘法,每一步都机械得可以交给别人照做。他没有 0 和 1 这两个符号,只有字母与棋子;可数的二进制拆法、除以二取余的换法、移位相加的乘法,都已经在这一卷里。
- 1703
只用 0 和 1 记数语言
二进制不是他先想到的,但他是第一个把它写成一篇正式论文、并且认真对待它的人。他关心的其实是别的:他觉得 0 与 1 能造出万物这件事有神学意味。要再等两百三十四年,才有人发现二进制真正的用处在开关上。
- 1847
逻辑可以写成代数结构
他的 x 从头到尾是一类东西,不是真假值:乘是取交,1 减是取补。x·x = x 这条在数的代数里只有 0 和 1 满足的式子,在他这里对每一类都成立——这正是后来能落到开关上的那一条。
- 1861
加法与乘法只从「下一个数」递归定义语言
他与弟弟合写的中学课本里,a + b 定义为使 a + (b + e) = a + b + e 成立的那一项,乘法再由加法递归出来,交换律、结合律一条条用归纳法证。皮亚诺 1889 年写明他的证明用的就是这本书;戴德金 1888 年补证了这种定义确实定义得出东西。哥德尔 1931 年那篇里拿来编码的递归函数、今天程序里的递归,写法都是这个样子:先说第一个,再说「下一个」怎么由这一个得来。
- 1890
一整篇证明写成符号,每一步只按形式变形语言
皮亚诺1858–1932《用符号写成的论文,与没有词尾的拉丁语》
他 1890 年那篇存在定理,四十七页全写成逻辑式,开头交代:用日常语言把它完整展开会复杂得过了头。ε、Λ、反写的 C 这些记号,连同 1889 年他给自然数写下的公理,被罗素与怀特海搬进了《数学原理》;哥德尔 1931 年那个证不出来的句子,就是在「皮亚诺公理加上《数学原理》的逻辑」这个系统里造的。证明一旦成了按规则变形的符号串,就轮到机器来检查它、执行它。
- 1931
任何一套够强的公理系统,都有它证不出来的真话边界
他的办法是给每一个公式编一个号,让系统能谈论自己。这一步——把程序当数据编码——后来被图灵直接搬进了机器的设计里。
- 1936
一条纸带、一张规则表,就够了语言
真正改变世界的不是那台机器,是下一页:既然每台机器都能写成一张表,那张表也能当作另一台机器的输入——一台机器就能模拟全部机器。通用机的概念在这里,而不在任何一台实物上。
- 1937
一个开关网络,就是一个布尔表达式结构
香农二十一岁的硕士论文把布尔代数按在继电器电路上:串联是与,并联是或,电路的化简成了式子的化简。九十年前写下的一套符号,忽然成了造电话交换机的工具——「结构」型数学最干净的一例。
- 1945
程序与数据住在同一块存储器里语言
冯·诺依曼1903–1957《一条指令也是一个数,所以它改得动》
《EDVAC 报告初稿》把机器分成运算、控制、存储、输入、输出五部分,并且让指令和数据用同一种方式存放。今天所有通用处理器仍是这个样子。这份报告署名只有他一个人,而莫奇利与埃克特的贡献被这件事盖住了,是计算机史上争议最久的一桩公案。
- 1965
一个对象自己有多少信息边界
不问这串数从哪个概率分布里来,只问能把它印出来的最短程序有多长;换一种编程方法只差一个与对象无关的常数。代价是这个长度本身算不出来——他在同一篇里写明,这个函数即便处处有限也不是一般递归的,理由与停机问题同源。今天「这段数据还能压多小」「这串密钥够不够乱」「这个模型是不是只是把训练集背了下来」,问的都是它。
- 1971
有些问题算得出,却算不快边界
库克1939–不在馆里
图灵划的是「能不能算」,这一条划的是「算得动算不动」。库克证明布尔可满足性是 NP 里最难的一类;莱文在苏联独立得到同样的结论。P 是不是等于 NP 至今没有答案,而现代密码学的安全性正建立在「不等于」这个假设上。