“微积分已经成了科学技术的最重要的语言。懂得微积分的人只要经过简单的训练,就能学会任何一门科学或技术,相反,不懂微积分的人要学习新的东西就比较困难。”
如果这是在1960年讲的一段话,那不会引起争议,但这段引语却取自一位美国重点大学的校长1985年的讲话。确实,微积分是科学技术的数学,它在科学技术中会像以前一样重要,但它不再那样显著了,它有了一个伙伴叫离散数学。
微积分之所以不再是提供科学技术的入场权的唯一数学,是因为计算机及计算机科学的发展。尽管人们已意识到计算机的革命,但很少人了解在数学领域所引起的变革。本文将介绍离散数学的主要内容,讨论它的一些应用;还将讨论离散数学对数学研究及其教育的一些重要影响。
离散数学与微积分的区别
在最基本的层次上,离散数学与微积分以及基于微积分的数学分析的连续数学之间的区别就是整数与实数之间的区别。后者是所有与连续函数特征有关的数学的基础。但数字计算机(以后简称为“计算机”)是离散的机器。因而可以简单地说计算机仅涉及整数,也就是说计算机所涉及的数是数轴上离散的点的集合。研究定义在离散的而不是连续的点的集合上的函数所需要的数学与主要研究连续函数的数学分析是有较大区别的。
回顾一下历史也许能帮助我们解释清楚为什么需要一门非传统的数学来研究计算机。虽然物理系统由许多分散的粒子——原子与分子——组成,但把它们看成是连续的来进行研究还是比较方便且非常准确的。因此,将物理定律模型化的标准方法是利用微积分,特别是微分方程。这个方法之所以能成功是因为其结果基本上是准确的。
随着数字计算器以及后来的计算机的出现,使得数值地求解微分方程或其它方程变得可能。一些读者可能已具备了使用计算器通过计算填写一张有规则的表来求解一般微分方程的经验。这种计算是用离散的近似值来替代微积分的导数或积分,因为只有前者能数值地处理。这样做的理由是如果连续参数的离散近似值足够好,计算的结果将会非常接近问题的实际答案且在后来的科学或工程性工作中是可用的。这标志着数值分析的成熟的开始。
随着计算机的出现,六十年代到七十年代初,数值分析成了数学的一门迅速发展的分支。它仍在迅速发展,但现在可称得上是数学的成熟分支了。通过数值分析技术解决的问题的标准范例是获得物理问题的微分方程,然后将它们转换成离散形式以便数值地求解它们。fc于离散物理学的连续近似值以及微分方程的离散近似值是相当精确的,以致能获得可用的最终结果,因此这项工作能很好地完成。
如果仅仅是数值分析需要离散数学的话,那么就很难说明这门数学起着与微积分类似的作用。虽然数值分析得到了广泛的应用,但它是专家的问题,不可能深深地影响教给大学生的数学。数值分析提供了连续的与离散的数学之间的重要接口,但今天它所完成的仅是离散数学应用中的一小部分。
离散数学得以发展的真正推动力来自于计算机科学本身以及诸如经济学及生物学等其它学科的需要。当经济学家与生物学家乌试图定量地分析问题时,他们开始使用了微积分所提供的模型,因为没有其它的模型可以使用,尽管被模型化了的基本情况经常是离散的。当计算机变得更有用、离散数学已提供了有用且容易理解的工具时,上述学科正逐步使用离散的而不是连续的模型。
计算机科学作为一门学科只有20年的历史,然而,由于它的迅速发展,它会也将会变成应用数学问题的资源。由于似乎所有这些问题都需要离散数学来求解它们,因此应用数学的中心将会很快移到该方向上。离散数学是否会变得比应用数学中的分析更重要不是问题的重点,关键在于两者将是如此重要以致没有一个计划将一生贡献给数学或其它非常依赖于数学的学科的人能担负得起忽略古典应用数学或新的应用数学——离散数学——所引起的损失。
应该注意到离散的与连续的数学之间的界限并不是很严格的。一些数学分支一一线性代数也许是最好的例子——既包含了离散的成分也包含了连续的成分。同样,值得注意的是应该将它们放在一起讲授,而不应该放在不同课程中讲授。
图 论
离散数学中应用得最广的分支之一图论是数学家以及计算机科学家研究最活跃的领域。对于数学家来讲,图并不是中学生所画的显示函数特征的几何图形。图论研究的是由顶点及边构成的结构:
问题是至少需要多少种颜色给地图着色才能使任意两个相邻的领域的颜色不同?四色定理阐述到:只需要四种颜色就能够给任何一个地图着色。
这个问题在十九世纪上半叶就已提出来了,但大约十年前才被伊利诺斯大学的两名数学家肯尼思 · 阿普尔及沃尔夫冈 · 哈肯使用图论解决了它。四色定理是如何成为图论的定理的?当地图上的两个区域之间有边界时,就把每个相应的区域替换成顶点,并用边将两个顶点连接在一起,此时地图就转变成一个图;图中顶点的数目等于地图中区域的数目。阿普尔与哈肯使用快速计算机通过分析大量可能的情况证明了该问题,到此,曾抵制了一些伟大数学家的攻击达一个多世纪的问题向基于图论数学的计算机分析低了头。
离散数学中最实际的问题是如图1所示的旅行商问题:旅行商必须访问且仅访问每个城市一次(图中的顶点)然后返回家;目标是找出最短的一条路径。也许你认为这很容易,只要列举所有可能的路径,计算出每个的距离就行了。像图中所示的只有五个城市时是较容易的,但假设有20个城市,那有多少可能性呢?回答是(n-1)!(其中n是城市数)。n=20,那么19!大约等于1017,是相当大的数。如果n=50,在任一计算机上一味地计算所有可能性的方法所花的时间将比宇宙的生命还要长。
各种技术可以用来加快计算的速度、事实上已设计出了一些针对这一问题的相当复杂的算法,但没有一个能克服上面提到的困难:当n增大时,问题的大小是指数增长的。
是否存在能找到旅行商问题中最短路径的算法,而计算并不随顶点数目指数增长?我们还知道。该答案隐藏在计算机科学理论中最重要的未解决的问题之中,该问题的技术名称是P=NP?问题。研究这种问题的计算机科学的分学科称为计算复杂性。
树是一种特殊的图,它在计算机科学中特别重要。
虽然没有给边标方向,但是树是有向图,因为每个边的方向都是隐含向下的。一个有向图称得上是树必须具备什么特征?正像例子中所暗示的,不能存在环(封闭的路径),除最上面的节点(根)以外,每个节点都仅只有一个从上指向它的边,根是没有边指向它的。树的一个应用是玩游戏。图2中的游戏树给出了一个简单游戏的图解表示,在这个游戏中,时有四根棒,在每一轮中,每个玩的人必须拿一根或二根棒,拿最后一根棒的人为赢。如何玩才对呢?图2给出了答案。这种树在计算机下棋程序中起着重要的作用。
差分方程
微分方程的离散类似物是差分方程。简单的例子是下面的一个方程,它是这样一种情况的模型:你以固定利息率r投资P,k年后投资值为Pk
Pk+1=Pk(1+r),k>0,P0=P (1)
这就是一个差分方程。正如微分方程一样,条件P0=P是初始条件。方程1的解是一个等比序列
Pk=(1+V)kP(2)
例如,如果你开始(第0年)将金额P记入个人退休金(IRA),N年后将它提取出来(没有罚款),根据等式2你将具有的总额A为A=(1-t)PN=(1-t) (1+r)NP,t是你提款时的税率。固定利息率以及单一税率的假设使问题得以简化,但这个假设可以被取消,方程1也就会变得比较复杂且难于求解。
如果不是把钱投入IRA中,而是存入储蓄账目或金融市场账目中,利息率还是r,对应于方程1的方程是Pk+1= (1+r)Pk,k>0,P0=P(1-t) ,因为在你投入首笔资金之前必须付税款,每年也还要付你所得到的利息的税款。这个差分方程是不难以求解的,N年后总值为
A=PN=[1+ r(1-t)] P(1-t) (3)
当税率(t)为30%,N=40时,则由方程2推导出的A与由方程3推导出的A的比为3.04,也就是说,40年后你从IRA中获得的经费将是从每年都要付税款的储蓄中获得的3倍。
差分方程有用的另一个领域是成员总数研究。在该领域中,大部分模型都是离散的。例如,考虑一下一种动物捕食另一种动物的情形,如狼与兔子。方程
Rn= aRn-1-bWn-1a,b>0 (4)
说明了阶段n(如一年)中兔子的数目Rn正比于其阶段n-1的数目以及阶段n-1中狼的数目。系数a—般比1大,它反映了兔子出生率比自然死亡率高;而b的值则反映了在一个阶段内一只狼要杀死多少只兔子。反映阶段n中狼的数目的方程可能是
Wn=cWn-1(5)
系数c类似于方程4中的a,反映了狼的出生与死亡的比率。方程4与5是一个联立方程对,可以这样来求解:方程5与方程1形式相同,先求解它,将结果代入方程4,最后可得Rn=Ran-bW(cn-an)/(c-a)及Wn=Wcn,其中R和W分别是兔子和狼的初始密度(n=0)。虽然它是一个非常简单的模型,然而它却可以用来弄清楚兔子与狼的比例(R/W)为多少时能使兔子的总数得以稳定。例如,假设c=1,可得Rn-Rn-1= an[(a-1)R-bW]。因此兔子总数的减少,保持稳定或增加将取决于(a-1)R-bW是小于、等于还是大于零。
不管差分方程多么复杂,我们都可直接从方程本身,求出从0 ~ n的序列值而得出该方程的解。
组合论
计算机科学中最需要组合论的方面是算法分析。作为例子,让我们研究一下给有n项的表按数值或字母序排序的问题。这也许是计算机完成的最公用的一个任务,因为许多数据处理的应用都是以它为基础的,因此,有效地完成它是非常重要的。著名的排序算法是冒泡排序法,其过程是这样的(如图3所示):比较表中的前两项,如果不成序,就互换它们;然后比较下两项,如此循环下去一直到达表的底部。此时最大的元素将在第n位上。然后重新开始,重复此过程,在每一遍中忽略那些已知在正确位置上的元素。最多n-1遍后,表就被排序好了。小元素就像“冒泡”一样冒到了表的顶部,因此给此算法取了这个名字。
图4给出了冒泡排序的算法。它的效率如何?为了回答这个问题,我们主要来研究一下算法中的关键动作“比较”,因为它是最经常完成的一个动作:对于从1到n-1的每个i值,要完成i次比较。因此比较的总数为1+2+3+…+n-2+ n-1,即为n(n-1)/2,比较总次数总是正比于n2。
该算法的效率可以改善吗?可以!通过记下每一遍中最后进行交换的位置改善此算法,因为在它下面的元素已处于正确位置,下一遍不必再检查它们。其结果将如何呢?在最坏情况下(初始序列为n,n-1,…,2,1)仍需要n(n-1)/2次比较。但平均情况下比较次数是少了些。然而平均数仍正比于n2,是比例常数比1/2小而已。
存在比较次数在最坏情况或平均情况下增长得比n2慢的排序算法吗?回答是肯定的,有一些排序算法其比较次数在平均情况及最坏情况下均正比于nlogn。
数理逻辑
逻辑中的关键实体命题或谓词的“值”为真或假——转换成二进制时分别为1或0。虽然很久以来逻辑主要用来作为研究数学理论基础的工具,但自从计算机硬件的初期,它就被用来设计计算机硬件。用来设计硬件的逻辑形式是布尔代数。使用布尔代数技术不仅可设计逻辑电路,还可设计出较复杂的集成电路。
最近,数理逻辑在计算机科学的两个分支中显得非常重要。一是算法与计算机程序的验证,逻辑语言被用来描述算法或程序的输入与输出,以及用来作为算法或程序的断言。然后将这些用来构造有关算法或程序做了它原想做的事情的证明。例如,对于图4中的算法,可以将如下断言放在“for”循环之前
读作“对于所有的k,1到j的k,xk小于或等于xj+1”,该断言要求在循环之前的j+1次执行之前,第j+1项不小于前面所有的项,这正是冒泡排序法所希望的。机械定理证明器(设计来证明定理的计算机程序)将使用类似的断言来证明算法或程序的正确性。这是一个具有远大前途的相当新的研究领域,它对程序设计方法学研究有着较大的影响。
使用数理逻辑的另一个重要方面是直接将它作为所谓的逻辑程序设计的程序设计语言。日本在1981年宣布逻辑程序设计语言PROLOG将作为开发第五代计算机的软件工具。PROLOG可以应用在数据库中,在这当中除了检索或修改数据外,它经常被用来回答有关数据库中客体之间的关系的询问。说逻辑程序设计将会变得多么重要为时尚早,但有一点是清楚的,数理逻辑在程序设计中的运用为其它很多应用提供了一些有用的工具。
数学研究与教育
数学家研究他们感兴趣的领域,科学资金的作用确实能在一定程度上影响应该强调哪些研究领域,但它很可能是趋势的追随者而不是引导者。尽管认为数学的目的是为科学服务这一观点已比较陈旧,但应用数学的研究却受到了其它科学中需要解决的问题的相当大的影响。虽然物理科学中还有很多问题需要应用数学来解决,但大部分问题来源于计算机科学。由于这些问题绝大部分包含在离散数学中,因此我们期望这个与古典应用数学相关的应用数学领域中的研究工作能逐步增多。事实上我们已经看出了这个势头了。
大多数非数学家不久将看到正是在数学教育中首先使离散数学的重要性得以提高。大学的头两年,离散数学与微积分在数学中已占有同样的比重。这对数学课有着深远的影响,它也将对如何进行微积分以及需要微积分支撑的物理科学及工程等学科的教学产生重要的影响。最近几年已经出版了很多有关离散数学的文献及教科书并且还在不断增加。
这是否预示了另外一门“新的数学”还不清楚。当然六十年代新数学的冲击仍影响着我们,但如果离散数学成为九十年代的新数学,那将是由于科学与技术的改变需要教给我们下一代的数学必须与他们的专业有关。
[American Scientist,1986年11~12月]