1.1 始于计算,终于计算
在荒莽的历史尽头,我们常常听说人类之所以能够凭借虚弱的身躯,一次又一次地打退其他凶猛动物的猖狂进攻,而终于成就为今日当之无愧的“万兽之王”,这个 原因有很多种解释,比如说是劳动,说是手,说是大脑,莫衷一是,各有各的理论和证据,确实是个很难取得定论的问题,因此我想提出一种新的解释,大概是不会 遭到立刻的覆灭性打击。
人类的进化始于计算,我相信。
在有关非洲黑猩猩的纪录片里面,可以看到黑猩猩也会用手使用工具,一个黑猩猩家庭为了生活也勤于劳动,一个黑猩猩群落社会里面的形形色色的政治行为,显示 它们的大脑也不是很闲,但有一次我看到黑猩猩们抢香蕉时,总是把自己已经抢到手的香蕉给弄丢了而无知觉,突然觉得它们最缺乏的也许是算数的能力。
所以我想,人类的起源一定跟计算有莫大的关系。
当然这些都是戏说而已,不过如果说人类的科学是从计算开始的,应该是不会有太大的争议的。
也许有人说人类的科学活动应该是起源于观察,但从动物行为学的角度来看,观察这种行为是很难界定的,而计算则是非常好界定的行为,因为最原始的计算行为显然应该就是数数。
可以想像,当人类开始意识到自我在这个世界的孤独存在时,对于日月星辰和风雨雷电的无常和力量该是多么地恐惧啊!而人类把自己从这种恐惧当中解救出来的第一个方法应该就是算数。
算数导致了人类最早的科学活动,即天文学和几何学。人们从对日月星辰的计数当中发现了天体的运行是有常的,而不是什么不可琢磨的妖魔鬼怪在主宰;从对土地 与山河的度量中建立了明确的几何概念,从而对自己所生活的世界开始了真正的理解。而这种理解活动一旦开始,就无法停止了,演变至今,就构成了我们人类最值 得自豪的成就-科学。
科学的历史表明了它的基础,就是计算。
如果我们只是一味地观察,我们会纪录下来大量的经验,然而却无法理解这些经验的含义,更进一步,对于经验有了总结归纳之后,哪怕是进行计算的确切程度不同,也会导致不同的对于自然的理解。
一个很著名的例子,就是太阳系行星的运动的问题。
对于古人来说,所谓行星的意思就是那些星星是相对于恒星在明显地运动,在漫天的相互位置不变的恒星的对比之下,很少的这种匆匆行者是非常引人注目的。于是 很早开始人们就纪录这些行星的运行轨道。在古希腊时代,最有名的关于这些行星运动的研究是托勒密完成的,他对有关行星的纪录数据进行了计算,得到了一个极 其“圆满”的行星运动模型,即以地球为宇宙中心,行星围绕地球做严格圆周运动。现在看来,他的观测数据肯定不会是很精确,而他的计算也不会很准确,一直到 开普勒,在获得了非常精确的行星轨道运行的数据的基础上,进行了大量的计算,最终得到了革命性的开普勒三定律。
接下来牛顿出场了,他更是一个计算天才,正是通过计算,从开普勒三定律获得了他的最伟大的发现,万有引力定律。
然后还是通过计算,我们现在可以运用牛顿万有引力公式的计算而把脚印留到月球的寂寞沙尘上。
还有一个非常独特的例子,就是中国的古代科学和技术,更是强烈地依赖计算。
相比于古希腊,中国的古代数学几乎完全是以计算为中心的,翻开中国的古代数学书,一个鲜明的特点就是几乎完全是针对问题的数学计算方面的内容,而很少有古希腊传统的公理,定理与证明。
实际上,古代中国在技术上一直领先于世界,很难说跟这种重视计算的风格没有关系。其中最有名的例子就是祖冲之关于圆周率的计算,而我们现在都很清楚,祖冲 之的计算不仅是为圆周率提供了一个远比西方要精确的具体数值,更重要的是提供了一种非常通用的计算方法,即一种近似积分计算,而这种计算方法对于古代中国 的技术进步的重要作用,正是一个表明计算的重要性的典范。
如果说计算在科学的早期发展中扮演了关键的作用,那么我们还是可以说计算仍然在现代科学技术扮演着关键的角色。
固然现代的科学技术领域广阔而渊深,然而哪里没有计算的身影呢?甚至在某些科学哲学家的看法里面,能否进行计算是衡量一个理论是否已经成为科学的一个部门的标准。也许这种说法不免偏激,但是计算对于科学与技术的意义,确实是一个深刻的问题。
我们不妨考察一下物理学里面计算所占据的地位,也许有助于更深地理解这个问题。
几乎是一直到十九世纪,物理学还是以实验为主要内容,进入二十世纪之后,一场物理学革命飞快地竖立了理论物理学的丰碑,足以与传统的实验物理学分庭抗礼。 而这种局面在二战时期就开始改变,二战后在实验物理与理论物理之外,计算物理鼎足而立,导致这种变局的最关键的因素就是电子计算机的发明。
在计算机没有发明之前,人们不得不采取各种方式来回避过于庞大的计算问题,而大量的关键问题,又非得进行庞大的计算不可,以物理学为例,一旦我们透彻地解 决了线性问题之后,接踵而来的就是远比线性现象更为广泛的非线性现象,对于非线性问题,我们已经掌握的解析方法极其贫乏,这就逼迫我们走上直接计算之路。
而除了非线性问题之外,物理学乃至整个自然科学看待世界的方式都是原子式的,即我们总是可以把一个现象理解为它的组成成分的相互作用的结果,于是我们就有 了分子,原子等基本的科学观念,这种做法一直都是充满胜利的,然而这种胜利也是伴随着沉重代价的,即当我们重新面对复杂现象时,不得不从它的组成成分开始 考虑,这就是统计物理学的基本思想,显然这种做法给我们带来了繁重的计算任务,因为迄今为止,我们人类对于一个包含超过了3个的,具有相互作用的成员的系统的精确解析求解,已经是有点一筹莫展了,更何况常见的那些动辄包含了成千上万成员的系统呢?因此在很大一部分情况下,我们唯一的选择,就是直接的计算。
因此我们可以说,计算确实是科学的基石之一。
至于我们所生活的这个几乎完全由科学技术所塑造的世界,哪里没有计算的身影呢?如果说计算帮助我们理解了自然,进一步我们还可以说计算创造了我们的生活。
任何一个科学上的对于自然的新的理解,要转变为为人所用的技术时,基本的途径就是计算。道理很显然,当我们要制造一种自然界从未出现过的物品时,我们需要 的是具体的制造数据,而不能只是一堆公式,那么数据从哪里来呢?当然只能从对公式的计算得来。因此我们可以把计算理解为理论的实现途径。即理论无论是要反 映真实世界,还是要体现到我们的实际物品上,它都需要通过一条叫计算的路,理论武装了我们的大脑,而计算则创造了我们的世界。
所以我们可以说,人类的历史,最早是始于计算,而这个历史的实现的最前沿,则仍然是终于计算。
1.2 描述计算的语言
长久以来,人类的计算都是依靠自己来完成的,但如果仔细考虑一下,就会发现计算的实质是把一个经过清楚的分析,明确了求解的方法的问题,分解为明确,可 行,而有限的步骤,显然这种工作本质上是机械性的,如果把已经得到求解方法的问题还交给人脑来计算,显然有浪费人力之嫌;从另外一个方面来讲,往往一个需 要专门加以计算的问题,也是一个需要进行庞大的计算的问题,庞大到人力已经难以胜任的程度。
因此这两个方面都要求人类发明能够进行计算的机器,这就直接导致了计算机的发明。
今天当我们面临需要计算的问题时,对付问题的就不再只是一个大脑,而是一个大脑加上一台机器。所以接下来的问题就是如何让大脑与计算机协同工作,使得大脑能够专门用来寻求问题的算法,而计算机能够被用来计算解。
这种协同工作的第一个要求就是人需要能够把自己对于问题的计算过程的理解表示为机器的机械运动。首先人对于问题及其求解的理解是可以非常清晰地依靠数学语言来加以描述说明的。然后我们再看机器那一端。
所谓计算机就是能够自动执行一系列机器动作的机器,对于那些机器动作,我们可以把它们和基本的计算操作对应起来,这就使得有可能把计算问题的能行的计算步 骤分解为有限的机器操作,这里剩下的问题就是一方面是我们熟知的描述问题求解的数学语言,另一方面就是描述机器操作的语言,这两个方面的语言如何对应的问 题。
下面我们讨论一个非常简单的例子,用来说明这里面的语言翻译问题。
一个一元二次方程的求解是一个很简单的数学问题。设方程的形式为:

那么方程的解的一般公式为:


注意我们现在的目的是计算,而不是求解析解,因此得到这个公式不是问题的结束,而是问题的开始,即运用这个公式,在a,b,c都有具体取值的情况下,求出具体的数值解。因为如果该方程描述的是一个抛体运动,那么我们需要知道的当然是解的数值,以便我们了解和控制该抛体运动。
所以我们还需要进一步把这个数学表述转述为一个具体的求值过程的描述如下:
(1) 获得a,b,c的具体取值;
(2) 根据a,b,c的具体取值计算
的值;
(3) 如果
大于0,那么分别计算上面的两个公式的数值,得到两个不同的实数根;
(4) 如果
=0,那么计算公式
,得到的x的值就是方程的两个相同的根;
(5) 如果
小于0,那么分别计算上面的两个公式的数值,得到两个不同的复数根。
这样得到的上面的5个计算步骤描述,才是希望计算机所执行的计算过程的一个大概描述。当然这个描述是基于我们已经获得的对于一元二次方程的求解问题的数学上的彻底了解。
那么描述计算机的操作的语言是什么样的形式呢?
我们知道所谓计算机的工作在本质上是运行一些基本的机械电子操作,固然我们可以把那些操作根据运算法则而定义为相应的运算,例如一个开关电路的信号叠加, 可以适当地定义为二进制数值的加法,但显然不可能期望依靠这种物理现象能够直接地表达更加复杂的计算,例如上面公式里面的开平方。幸好我们依靠数学,可以 做到把任何复杂的计算分解或近似分解为极少数简单计算的叠加与组合。因此最终我们已经至少在理论上可以期望使用计算机来完成那些具有明确求解过程的计算任 务。
然而问题是当我们需要向计算机提交一个数值计算任务时,如果总是要求我们首先把计算任务的描述按照计算机所能够理解和执行的程度来进行的话,无疑会使得向 计算机提交计算任务成为一件极其麻烦的事情,本来我们利用计算机的目的是为了减轻自己的机械劳动工作量,如果向计算机提交问题是如此麻烦的话,显然不符合 我们发明计算机的初衷。
因此进入二十世纪五十年代后,提出了计算机高级语言的概念,所谓高级语言,就是非常接近我们平常对于数学问题的描述的语言,而所谓给出计算机高级语言,实 质上并不是说计算机能够直接理解高级语言了,而是把高级语言到计算机内部的机器语言的翻译工作本身交给计算机来完成,因为这种翻译工作在规范了高级语言之 后,是计算机自身就完全可以做到的,当然这个翻译任务本身又是一个需要我们首先明确给出一般解答的计算问题。
世界上第一个诞生的计算机高级语言就是我们在这本书里要给出的FORTRAN。
阅读(115 次)
Share This