摘要:中国古代数学具有悠久的传统。本文论述了中国古代数学的算法化、机械化特征及其对世界数学发展主流的历史贡献,并指出了解中国古代数学发展特征对于现实创新活动的借鉴意义。
1、中国古代数学的发展
在古代世界四大文明中,中国数学持续繁荣时期最为长久。从公元前后至公元14世纪,中国古典数学先后经历了三次发展高潮,即两汉时期、魏晋南北朝时期和宋元时期,并在宋元时期达到顶峰。
与以证明定理为中心的希腊古典数学不同,中国古代数学是以创造算法特别是各种解方程的算法为主线。从线性方程组到高次多项式方程,乃至不定方程,中国古代数学家创造了一系列先进的算法(中国数学家称之为“术”),他们用这些算法去求解相应类型的代数方程,从而解决导致这些方程的各种各样的科学和实际问题。特别是,几何问题也归结为代数方程,然后用程式化的算法来求解。因此,中国古代数学具有明显的算法化、机械化的特征。以下择要举例说明中国古代数学发展的这种特征。
1.1、线性方程组与“方程术”
中国古代最重要的数学经典《九章算术》(约公元前2世纪)卷8的“方程术”,是解线性方程组的算法。以该卷第1题为例,用现代符号表述,该问题相当于解一个三元一次方程组:
3x+2y+z=39
2x+3y+z=34
x+2y+3z=26
《九章》没有表示未知数的符号,而是用算筹将xyz的系数和常数项排列成一个(长)方阵
123
232
311
263439
“方程术”的关键算法叫“遍乘直除”,在本例中演算程序如下:用右行(x)的系数(3)“遍乘”中行和左行各数,然后从所得结果按行分别“直除”右行,即连续减去右行对应各数,就将中行与左行的系数化为0。反复执行这种“遍乘直除”算法,就可以解出方程。很清楚,《九章算术》方程术的“遍乘直除”算法,实质上就是我们今天所使用的解线性方程组的消元法,以往西方文献中称之为“高斯消去法”,但近年开始改变称谓,如法国科学院院士、原苏黎世大学数学系主任P.Gabriel教授在他撰写的教科书[4]中就称解线性方程组的消元法为“张苍法”,张苍相传是《九章算术》的作者之一。
1.2、高次多项式方程与“正负开方术”
《九章算术》卷4中有“开方术”和“开立方术”。《九章算术》中的这些算法后来逐步推广到开更高次方的情形,并且在宋元时代发展为一般高次多项式方程的数值求解。秦九韶是这方面的集大成者,他在《数书九章》(1247年)一书中给出了高次多项式方程数值解的完整算法,即他所称的“正负开方术”。
用现代符号表达,秦九韶“正负开方术”的思路如下:对任意给定的方程
f(x)=a[0]x^n+a[1]x^(n-1)+……+a[n-2]x^2+a[n-1]x+a[n]=0(1)
其中a[0]≠0,a[n]<0,要求(1)式的一个正根。秦九韶先估计根的最高位数字,连同其位数一起称为“首商”,记作c,则根x=c+h,代入(1)得
f(c+=a[0](c+h)^n+a[1](c+h)^(n-1)+……+a[n-1](c+h)+a[n]=0
按h的幂次合并同类项即得到关于h的方程:
f(h)=a[0]h^n+a[1]h^(n-1)+……+a[n-1]h+a[n]=0(2)
(注:这里(2)和(1)式子里的a[i],一般是不一样的。)
于是又可估计满足新方程(2)的根的最高位数字。如此进行下去,若得到某个新方程的常数项为0,则求得的根是有理数;否则上述过程可继续下去,按所需精度求得根的近似值。
如果从原方程(1)的系数a[0],a[1],…,a[n]及估值c求出新方程(2)的系数a[0],a[1],…,a[n]的算法是需要反复迭代使用的,秦九韶给出了一个规格化的程序,我们可称之为“秦九韶程序”,他在《数书九章》中用这一算法去解决各种可以归结为代数方程的实际问题,其中涉及的方程最高次数达到10次,秦九韶解这些问题的算法整齐划一,步骤分明,堪称是中国古代数学算法化、机械化的典范。
1.3、多元高次方程组与“四元术”
绝不是所有的问题都可以归结为线性方程组或一个未知量的多项式方程来求解。实际上,可以说更大量的实际问题如果能化为代数方程求解的话,出现的将是含有多个未知量的高次方程组。
1.4、一次同余方程组与“中国剩余定理”
中国古代数学家出于历法计算的需要,很早就开始研究形如:
X≡Ri(modai)i=1,2,...,n(1)
(其中ai是两两互素的整数)的一次同余方程组求解问题。公元4世纪的《孙子算经》中已有相当于求解下列一次同余组的著名的“孙子问题”:
X≡2(mod3)≡3(mod5)≡2(mod7)
《孙子算经》作者给出的解法,引导了宋代秦九韶求解一次同余组的一般算法——“大衍求一术”。现代文献中通常把这种一般算法称为“中国剩余定理”。
1.5、插值法与“招差术”
插值算法在微积分的酝酿过程中扮演了重要角色。在中国,早从东汉时期起,学者们就惯用插值法来推算日月五星的运动。起初是简单的一次内插法,隋唐时期出现二次插值法(如一行《大衍历》,727年)。由于天体运动的加速度也不均匀,二次插值仍不够精密。随着历法的进步,到了宋元时代,便产生了三次内插法(郭守敬《授时历》,1280年)。在此基础上,数学家朱世杰更创造出一般高次内插公式,即他所说的“招差术”。朱世杰的公式相当于
f(n)=n△+n(n-1)/2!△2+n(n-1)(n-2)/3!△3+n(n-1)(n-2)(n-3)/4!△4+……
这是一项很突出的成就。
这里不可能一一列举中国古代数学家的所有算法,但仅从以上介绍不难看到,古代与中世纪中国数学家创造的算法,有许多即使按现代标准衡量也达到了很高的水平。这些算法所表达的数学真理,有的在欧洲直到18世纪以后依赖近代数学工具才重新获得(如前面提到的高次代数方程数值求解的秦九韶程序,与1819年英国数学家W.霍纳重新导出的“霍纳算法”基本一致;多元高次方程组的系统研究在欧洲也要到18世纪末才开始在E.别朱等人的著作中出现;解一次同余组的剩余定理则由欧拉与高斯分别独立重新获得;至于朱世杰的高次内插公式,实质上已与现在通用的牛顿-格列高里公式相一致)。这些算法的结构,其复杂程度也是惊人的。如对秦九韶“大衍求一术”和“正负开方术”的分析表明,这些算法的计算程序,包含了现代计算机语言中构造非平易算法的基本要素与基本结构。这类复杂的算法,很难再仅仅被看作是简单的经验法则了,而是高度的概括思维能力的产物,这种能力与欧几里得几何的演绎思维风格截然不同,但却在数学的发展中起着完全可与之相媲美的作用。事实上,古代中国算法的繁荣,同时也孕育了一系列极其重要的概念,显示了算法化思维在数学进化中的创造意义和动力功能。以下亦举几例。
1.6、负数的引进
《九章算术》“方程术”的消元程序,在方程系数相减时会出现较小数减较大数的情况,正是在这里,《九章算术》的作者们引进了负数,并给出了正、负数的加减运算法则,即“正负术”。
对负数的认识是人类数系扩充的重大步骤。公元7世纪印度数学家也开始使用负数,但负数的认识在欧洲却进展缓慢,甚至到16世纪,韦达的著作还回避负数。
1.7、无理数的发现
中国古代数学家在开方运算中接触到了无理数。《九章算术》开方术中指出了存在有开不尽的情形:“若开方不尽者,为不可开”,《九章算术》的作者们给这种不尽根数起了一个专门名词——“面”。“面”,就是无理数。与古希腊毕达哥拉斯学派发现正方形的对角线不是有理数时惊慌失措的表现相比,中国古代数学家却是相对自然地接受了那些“开不尽”的无理数,这也许应归功于他们早就习惯使用的十进位制,这种十进位制使他们能够有效地计算“不尽根数”的近似值。为《九章算术》作注的三国时代数学家刘徽就在“开方术”注中明确提出了用十进制小数任意逼近不尽根数的方法,他称之为“求微数法”,并指出在开方过程中,“其一退以十为步,其再退以百为步,退之弥下,其分弥细,则……虽有所弃之数,不足言之也”。
十进位值记数制是对人类文明不可磨灭的贡献。法国大数学家拉普拉斯曾盛赞十进位值制的发明,认为它“使得我们的算术系统在所有有用的创造中成为第一流的”。中国古代数学家正是在严格遵循十进位制的筹算系统基础上,建立起了富有算法化特色的东方数学大厦。
1.8、贾宪三角或杨辉三角
从前面关于高次方程数值求解算法(秦九韶程序)的介绍我们可以看到,中国古代开方术是以(c+h)^n的二项展开为基础的,这就引导了二项系数表的发现。南宋数学家杨辉著《详解九章算法》(1261年)中,载有一张所谓“开方作法本源图”,实际就是一张二项系数表。这张图摘自公元1050年左右北宋数学家贾宪的一部著作。“开方作法本源图”现在就叫“贾宪三角”或“杨辉三角”。二项系数表在西方则叫“帕斯卡三角”(1654年)。
1.9、走向符号代数
解方程的数学活动,必然引起人们对方程表达形式的思考。在这方面,以解方程擅长的中国古代数学家们很自然也是走在了前列。在宋元时期的数学著作中,已出现了用特定的汉字作为未知数符号并进而建立方程的系统努力。这就是以李冶为代表的“天元术”和以朱世杰为代表的“四元术”。所谓“天元术”,首先是“立天元一为某某”,这相当于“设为某某”,“天元一”就表示未知数,然后在筹算盘上布列“天元式”,即一元方程式。该方法被推广到多个未知数情形,就是前面提到的朱世杰的“四元术”。因此,用天元术和四元术列方程的方法,与现代代数中的列方程法已相类似。
符号化是近世代数的标志之一。中国宋元数学家在这方面迈出了重要一步,“天元术”和“四元术”,是以创造算法特别是解方程的算法为主线的中国古代数学的一个高峰。
多元高次方程组的求解即使在今天也绝非易事。历史上最早对多元高次方程组作出系统处理的是中国元代数学家朱世杰。朱世杰的《四元玉鉴》(1303年)一书中涉及的高次方程达到了4个未知数。朱世杰用“四元术”来解这些方程。“四元术”首先是以“天”、“地”、“人”、“物”来表示不同的未知数,同时建立起方程式,然后用顺序消元的一般方法解出方程。朱世杰在《四元玉鉴》中创造了多种消元程序。
通过《四元玉鉴》中的具体例子可以清晰地了解朱世杰“四元术”的特征。值得注意的是,这些例子中相当一部分是由几何问题导出的。这种将几何问题转化为代数方程并用某种统一的算法求解的例子,在宋元数学著作中比比皆是,充分反映了中国古代几何代数化和机械化的倾向。
2、中国古代数学对世界数学发展的贡献
数学的发展包括了两大主要活动:证明定理和创造算法。定理证明是希腊人首倡,后构成数学发展中演绎倾向的脊梁;算法创造昌盛于古代和中世纪的中国、印度,形成了数学发展中强烈的算法倾向。统观数学的历史将会发现,数学的发展并非总是演绎倾向独占鳌头。在数学史上,算法倾向与演绎倾向总是交替地取得主导地位。古代巴比伦和埃及式的原始算法时期,被希腊式的演绎几何所接替,而在中世纪,希腊数学衰落下去,算法倾向在中国、印度等东方国度繁荣起来;东方数学在文艺复兴前夕通过阿拉伯传播到欧洲,对近代数学兴起产生了深刻影响。事实上,作为近代数学诞生标志的解析几何与微积分,从思想方法的渊源看都不能说是演绎倾向而是算法倾向的产物。
从微积分的历史可以知道,微积分的产生是寻找解决一系列实际问题的普遍算法的结果。这些问题包括:决定物体的瞬时速度、求极大值与极小值、求曲线的切线、求物体的重心及引力、面积与体积计算等。从16世纪中开始的100多年间,许多大数学家都致力于获得解决这些问题的特殊算法。牛顿与莱布尼兹的功绩是在于将这些特殊的算法统一成两类基本运算——微分与积分,并进一步指出了它们的互逆关系。无论是牛顿的先驱者还是牛顿本人,他们所使用的算法都是不严格的,都没有完整的演绎推导。牛顿的流数术在逻辑上的瑕疵更是众所周知。对当时的学者来说,首要的是找到行之有效的算法,而不是算法的证明。这种倾向一直延续到18世纪。18世纪的数学家也往往不管微积分基础的困难而大胆前进。如泰勒公式,欧拉、伯努利甚至19世纪初傅里叶所发现的三角展开等,都是在很长时期内缺乏严格的证明。正如冯·诺伊曼指出的那样:没有一个数学家会把这一时期的发展看作是异端邪道;这个时期产生的数学成果被公认为第一流的。并且反过来,如果当时的数学家一定要在有了严密的演绎证明之后才承认新算法的合理性,那就不会有今天的微积分和整个分析大厦了。
现在再来看一看更早的解析几何的诞生。通常认为,笛卡儿发明解析几何的基本思想,是用代数方法来解几何问题。这同欧氏演绎方法已经大相径庭了。而事实上如果我们去阅读笛卡儿的原著,就会发现贯穿于其中的彻底的算法精神。《几何学》开宗明义就宣称:“我将毫不犹豫地在几何学中引进算术的术语,以便使自己变得更加聪明”。众所周知,笛卡儿的《几何学》是他的哲学著作《方法论》的附录。笛卡儿在他另一部生前未正式发表的哲学著作《指导思维的法则》(简称《法则》)中曾强烈批判了传统的主要是希腊的研究方法,认为古希腊人的演绎推理只能用来证明已经知道的事物,“却不能帮助我们发现未知的事情”。因此他提出“需要一种发现真理的方法”,并称之为“通用数学”(mathesisuniversakis)。笛卡儿在《法则》中描述了这种通用数学的蓝图,他提出的大胆计划,概而言之就是要将一切科学问题转化为求解代数方程的数学问题:
任何问题→数学问题→代数问题→方程求解而笛卡儿的《几何学》,正是他上述方案的一个具体实施和示范,解析几何在整个方案中扮演着重要的工具作用,它将一切几何问题化为代数问题,这些代数问题则可以用一种简单的、几乎自动的或者毋宁说是机械的方法去解决。这与上面介绍的古代中国数学家解决问题的路线可以说是一脉相承。
因此我们完全有理由说,在从文艺复兴到17世纪近代数学兴起的大潮中,回响着东方数学特别是中国数学的韵律。整个17—18世纪应该看成是寻求无穷小算法的英雄年代,尽管这一时期的无穷小算法与中世纪算法相比有质的飞跃。而从19世纪特别是70年代直到20世纪中,演绎倾向又重新在比希腊几何高得多的水准上占据了优势。因此,数学的发展呈现出算法创造与演绎证明两大主流交替繁荣、螺旋式上升过程:
演绎传统——定理证明活动
算法传统——算法创造活动
中国古代数学家对算法传统的形成与发展做出了毋容置疑的巨大贡献。