外来客网

计算方法之推恩令

(武帝)用主父偃谋,令诸侯以私恩裂地,分其子弟,而汉为定制封号,辙别属汉郡。汉有厚恩,而诸侯地稍自分析弱小云。

分治法是常用的解题方法。把一个比较难的大问题分解为几个比较简单的小问题,分而治之(divide and conquer),就不会有“老虎吞天,无从下口”的感觉了。计算机算法里常用的“递归法”也是一种分治法。

有限项∑ni=1ik的求和公式就可以用分治法得到。这里的n和k都是正整数。如果n=100和k=1,就是神童高斯的著名求和公式1+2+3+…+100=5050。对于一般性的n,如果k=1,则∑ni=1i=n(n+1)/2。求解的方法很简单,把第一项和最后一项相加,把第二项和倒数第二项相加,等等,都可以得到n+1,一共有n/2这样的组合。但是,这个方法不适合k>1的情况。k>1的情况可以用分治法来处理。重新考虑k=1的情况。

由(i+1)2=i2+2i+1可知,i=((i+1)2−i2−1)/2。除了一个常数项以外,i是由两项的差组成的。i+1也是如此,但是它的负号项和i的正号项正好抵消了。由此可知,∑ni=1i=((n+1)2−1)/2−n/2=n(n+1)/2。对于k=2,因为(i+1)3=i3+3i2+3i+1,所以i2=((i+1)3−i3−3i−1)/3。三次方的项是一正一负,所以求和的结果是((n+1)3−1)/3,而一次方和常数项求和的结果都是已知的,直接带入就可以了。这个方法可以推广到任意的k,因为(i+1)k+1可以用牛顿二项式展开(杨辉三角),ik可以表示为两个k+1次方的差,以及k−1次方和更低阶的幂。k+1次方的差的n项求和最后只包括两项,而k−1次方和更低阶的幂的求和公式是已经知道的了。

可以看出,这个方法跟数学归纳法非常相似。

顺便说一下,如果把n取为无穷大,而令k=−s(s可以取复数),上述求和就变成了∑∞i=1i−s=∑∞i=11is,这就是著名的ζ函数,这两天吵得火热的黎曼猜想就与此有关。黎曼认为,ζ函数的非平凡零点的实部都等于1/2。这个猜想困扰了数学界接近160年了,阿提亚(M. Atiyah)声称自己证明了这个猜想。

行列式的计算也可以采用分治法(递归法)。

n阶行列式|aij|(n×n个数排成了n行、n列)的数值由n!个项的和构成,每一项包含由n个乘积构成,乘积的每个引自来自于n行列式的不同行和不同列(所以有n!

种不同的排列方式),乘积前面还有个正负号(决定于排列的奇偶性)。

计算n阶行列式,可以先随便选定一行元素,每个元素乘以它的子行列式(删除该元素所在行和所在列后剩下来的n−1阶行列式,(n−1)×(n−1)),再由该元素位置决定正负号,然后把n个这样的项加起来就可以了。所以,n阶行列式就约化为n个n−1阶行列式的求和了。

一阶行列式只有一个数,该行列式的数值就是这个数。二阶行列式有4个数,行列式的数值由2项构成,a11a22−a21a12,也就是说,左上到右下的连线减去左下到右上的连线。三阶行列式有9个数,行列式的数值由6项构成,a11a22a33+a12a22a31+a13a21a32−a31a22a13−a32a23a11−a33a21a12。一个简单的记忆方法是,把三阶行列式左边的两列复制到行列式的右边,这样就得到一个3×5的矩阵,这个矩阵有3条从左上到右下的斜线和3条从左下到右上的斜线,用前3条斜线减去后3条斜线,就可以了。

4阶以上的行列式没有简单的算法,但是原则上可以用递归法求解。

之所以说是原则上,因为没有人真的用这种方法求行列式的值。这种方法需要求n!

个项的和,而每个项又有n个数相乘,总计(n+1)!

次运算,这样会累死人的。肯定要采用其他更加有效的方法。

如果行列式碰巧有一行(或一列)的元素都等于零,那么你就走运了:这个行列式的值就等于零,因为n!

项的每一个都包含这一行的元素。如果有一行里只有一个元素不为零,那么你选中这个元素,n阶行列式的计算就简化为n−1阶行列式了。如果你的运气好,每一行都只有一个元素为零(而且不同列),那么你把乘起来就可以了。这就是对角行列式(需要适当地重新安置各行和各列),如果对角行列式的所有对角元素为1,就是单位矩阵。

如果你观察到一个k×(n−k)的小矩阵里的元素都是零,就可以把原来的行列式拆分为k阶行列式和n−k阶行列式的乘积。如果你运气好,你可能发现行列式的左下方(或右上方,除了对角线)的元素都是零,这就是所谓的下三角行列式,其数值就是对角线元素的乘积。

一般来说,你没有这么好的运气。这时候,你就要创造条件自己上了——高斯消元法就是干这个的。行列式的目的是什么?为什么要采用上述的方式来定义行列式?其实,行列式就是用来求解n个变量的n阶线性线性方程组的。每个线性方程组是一个限制条件,n个变量需要n个限制条件才能唯一求解。限定条件多于n个,就是“超定”方程组,不一定有解,婆婆太多、束手束脚;限定条件少于n个,就是“欠定”方程组,有太多的解,山高皇帝远、无法无天。但是,如何确定n

个限定条件确实是独立的呢?这就要计算系数行列式的数值,等于零就不是独立的,否则就是独立的。自己求解一遍二阶和三阶的线性方程组,就会明白的。

某个限定条件乘以一个常数,显然不会改变自己的独立性,所以行列式的某行上的公因子可以提取出来。某个限定条件与另一个限定条件相加,并不会改变后者的独立性,所以行列式的一行加上另一行,并不会改变行列式的数值。行列式如果有两行一模一样,这个行列式一定等于零,因为交换两行以后,行列式应该变符号,但还是原来的行列式,所以只能等于零了。

利用这几个性质,就可以一行行地处理,使得一般性的行列式变为下三角行列式,然后就容易计算了。可以知道,这种过程只需要进行大约n3

次的运算。与(n+1)!相比,n3真的是太平易近人了。

那么,n!到底有多大呢?我们知道,2!=2,3!=6,4!=24,5!=120,6!=720,再往后算就有些累了。我们能不能简单地估计一下n!呢?

注意到x=elnx,就可以把n!这样的乘积转化为求和运算。n!=elnn!=e∑ni=1lni,指数上的部分是个求和,∑ni=1lni,这个求和可以用积分来近似,∑ni=1lni≈∫n1lnx dx。利用分部积分法,∫n1lnx dx=xlnx−∫xd(lnx)=x(lnx−1),就可以得到 ∑ni=1lni≈n(lnn−1),也就是说,n!≈(ne)n。

现在,你也许会叫起了撞天屈:我们还没有学微积分呢,更别提什么分部积分法了!别着急,这种估计不用分部积分法也是可以的。

回到原始的问题,求n!。把第一项和最后一项乘起来,把第二项和倒数第二项乘起来,等等,根据xy≤(x+y)2/4,可以知道n! 大约是(n+12)n+1(大部分数还是靠近n/2的),跟前面的估计值n!≈(ne)n相差不大。

重新做求和∑ni=1lni。把每一项lni替换为lni=ilni−(i−1)lni,带入求和式并重新安置各项就得到,∑ni=1lni=ilni−∑i(i−1)[lni−ln(i−1)]。因为lni−ln(i−1)=ln[i/(i−1)]=ln[1+1/(i−1)]≈1/(i−1),代回原式就再次得到∑ni=1lni≈n(lnn−1)。

你看,其实并不难的,每一步你都会的——唯一能吓住你的是你自己。只要你在战略上藐视敌人,在战术上重视敌人,想办法把一个看起来可怕的大问题分解为若干个可以处理的小问题,你就能够解决它的。请记住:在这个世界上,读书和考试是最简单的事情。任何一道题出现在考卷上,你一定能够在五分钟里做出来的。如果做不出来,肯定是自己想错了,换个思路就是了。试题出现在考卷上这件事本身就是一个巨大的提示:

一切考试题都是纸老虎!

评论 (0)