现在,场景转为课堂,任何时间、任何地方的课堂。 [1] 它可能是在公元前1750年左右古巴比伦城市尼普尔的一所房子里,正在训练成为书吏的学生俯身在泥板上书写楔形文字;也可能是大约公元150年中国汉代的一所书院,豪族子弟正在用算筹求解算术题,而算术是他们的“六艺”之一;它也可能是在公元1500年前后文艺复兴时期比萨或奥格斯堡这样的繁华商业城市里的“计算师”的家里,雄心勃勃的商人正在研习印度数字 [2] 以及复式记账法;或者可能是在现在的任何一所小学,那里的孩子正在学习乘法表,可能是纸质版的,也可能是电子版的。从古代美索不达米亚幸存下来的最古老的书面文献,一直到晚近的文献,都可以看出,算法的自然家园是课堂,它的自然媒介是教科书,其材质可能是泥板、纸莎草纸、棕榈叶、竹简、羊皮纸或纸。几千年来,算法与计算工具没有关系,也与今天的绝大多数应用程序没有关系,尽管今天的一些应用程序让“算法”这个词成了数字时代的象征。实际上,算法的首要内容是计算,而不是计算工具;有人称,计算机具有漫长而久远的历史,其实,这类说法的资料来源绝大多数是一些相当武断的文献。
要理解20世纪以前的算法,必须牢牢记住这一背景知识。及至20世纪,人类在数学领域里的实践,仍然与古代文献所记载的情况一样,几乎都是围绕寻求特定问题的解决方案而展开的。但是,由于数理逻辑和计算机科学的发展,这类实践规则转变为高度抽象和普遍的原理。今天,这些原理是支撑数学和计算机编程的基础。将这段晚近的实践溯源到1 000年以前,是不恰当的,那样做有可能忽略了算法的某些本质特征,它们与我们今天所理解的完全不同。
今天,人们提起算法,总强调它们广泛的通用性,但从历史上看,算法几乎总是用于解决十分具体的问题,例如,在给定直径的条件下,计算圆形场地的面积,或者将一定数量的面包分成不相等的几份,而不是用于计算一些递归条件的算术函数,例如,φ(k+1, x 2 ,...x n )=μ [k, φ(x 2 ,... x n )x 2 , ..., x n ] [3] 。1928年,数学家戴维·希尔伯特提出“决策问题”( Entscheidungsproblem ),要求数学家设定一个程序,有了这个程序,只需通过有限的步骤,就可以知道是否可以从一组给定的公理中推导出某个表达式。自此,算法成为数学证明的核心标准。 [4] 但从历史上看,算法一直是与公理化证明这一理想状态相对立的,通常被贴上带有贬义的“仅限于此”之类的标签,以强调这类“仅限算法”与欧几里得式论证的差别。在漫长的历史中,计算是数学课程的基石,而不是顶峰。它们是基础,是后来所有数学研究的前提。计算是学生最先学到、必须学好的课程。
前现代与现代算法的观点之间还有一个进一步的差异,这也是本章论述计算机出现之前的算法的一个核心内容。在前现代,计算由人执行,而不是由机器执行。计算的机械化是一个渐进的过程,它始于18世纪末将劳动分工原则运用到人工计算上,到19世纪中期,出现了可靠的、可大规模生产的计算机,如“托马斯四则运算器” [5] 。在此后的近一个世纪里,在天文台、保险公司、人口普查局和战时武器项目中,只要需要进行工业规模的计算,人类就会与机器协同工作,共同应用算法,这一点我们将在第五章中看到。只是到了20世纪的最后25年,得益于可以预先编程的电子设备,才出现了近乎完全自动化的算法执行。然而,早在19世纪初,甚至在可以用计数机器,更不用说用计算机可靠地执行算法之前,这类计算就已经被说成是“机械化的”。这说明,人们开始以一种新的方式看待算法,认为算法可以在不被人了解,甚至人根本不懂的情况下,只需按照规则,就可以得到执行,由此开辟了一种标准化趋势,在标准化下,具体情境不再被考虑。在19世纪和20世纪,按照第三章中介绍的“粗放型”规则和“细密型”规则的区分,算法成了所有规则中最细密的规则,而细密型规则又进一步成了所有规则的模型。
本章的目的首先是重建什么是前现代算法,以及它们在实践中是如何发挥作用的,其次是追溯算法在计算机出现之前是如何变得机械化的。这两项研究内容的时间和空间规模是不对称的。算法在许多文化中已经使用了数千年,但算法的机械化到两个多世纪前才出现,主要是在经济、政治和科学现代化的背景下。尽管时间线不同,但这两项研究所追踪的目标都是变动的:“算法”与“机械”都不是一成不变的,而它们最终的联手可以解释细密型规则如何可行。