数学科普

如何分摊秘密(七)

作者:安迁

十、拉格朗日插值法

本节介绍拉格朗日插值法,学过的读者请略过。

从数值分析的角度来看,拉格朗日插值法常被描述成是用多项式函数来逼近某个实际函数的方法,总有点“误差”的味道在里面。但从代数的角度来看,我们并不需要假设有额外的“实际函数”存在。我们可以更简单地说,拉格朗日插值法,就是通过若干个点上多项式函数的值来找出这个多项式本身的方法。

具体地说,假如f(x)是一个多项式,而且我们知道当x取值为a1,a2,……,an时,多项式的值分别是f(a1)=b1,f(a2)=b2,……,f(an)=bn,我们希望能找到这个f(x),也就是用诸ai和bi的值把多项式f(x)来表达出来。现在暂时假设ai和bi都是整数。当然,每个ai必须各不相同。否则的话如果有ai和aj是一样的,bi和bj是不是一样?要是不一样,这相当于说f(x)在同一个点取两个不同的值,矛盾了;要是一样,相当于说同一个信息说了两遍,没必要。

给定一组ai和bi的值,可以求得的f(x)并不是唯一的。因为多项式p(x)=(x-a1)(x-a2)……(x-an)在每一个ai处的值都是0,所以如果f(x)是一个满足上面要求的多项式,f(x)+p(x)q(x)也同样满足要求,其中q(x)可以是任何多项式。但是如果我们再加一个条件:规定f(x)的次数必须小于n,那么这个时候这样的f(x)就是唯一的了。因为如果有两个多项式f(x)和g(x)都满足要求而且次数都小于n,那么f(x)-g(x)就是一个在所有ai处的值都是0,而且次数小于n的多项式,而我们知道这样的多项式只能是0,否则它就有n个不同的根却次数小于n,和代数基本定理矛盾(n-1次多项式最多只能有n-1个根)。所以从现在开始我们要求所找的f(x)的次数是小于n的。

找到f(x)的方法其实并不复杂。

先不管那些bi,我们先找一个次数小于n的多项式r1(x),使得r1(a1)=1,r1(a2)=0,r1(a3)=0,……,r1(an)=0,也即除了在a1那点取值为1外,在其他ai处取值都是0。

怎么找到r1(x)?考虑下面的式子: (a1-a2)(a1-a3)……(a1-an) 它的结果是一个不为0的数,因为ai之间两两不同,设这个数是d。如果我们把上面式子中的a1换成多项式的变量x,那么我们得到了一个n-1次多项式 (x-a2)(x-a3)……(x-an) 这个多项式在a1处的取值当然就是上面的式子的值d,而在其他ai处的值是0,因为这些乘积中总有一项是(ai-ai)=0。把上面的多项式除以d: (x-a2)(x-a3)……(x-an)/d 它在a1处的取值是1,而在其他ai处的值是0,就是我们需要的 r1(x) = (x-a2)(x-a3)……(x-an)/((a1-a2)(a1-a3)……(a1-an))

同样道理我们也可以找出在a2那点取值为1外,在其他ai处取值都是0的次数为n-1的多项式 r2(x) = (x-a1)(x-a3)……(x-an)/((a2-a1)(a2-a3)……(a2-an)) 以及类似的r3(x),……,rn(x)。每个rk(x)都在ak那点取值为1,而在其余ai处取值为0。

注意到上面这些r2(x)只和ai们有关,和bi们无关。我们回过头来再考虑那些bi,我们所求的f(x)不就是 f(x) = b1r1(x)+b2r2(x)+……+bnrn(x) 只要验证一下它在每个ai的值可知所言不虚。这就是所谓的拉格朗日插值法。下面看看具体例子。

我们考虑6个点,也就是n=6,取ai=i,其中i从1到6。这意味着我们将通过f(1),f(2),……,f(6)的值来找到f(x)。计算一下各ri(x): r1(x) = (x-2)(x-3)(x-4)(x-5)(x-6)/((1-2)(1-3)(1-4)(1-5)(1-6)) = -(x-2)(x-3)(x-4)(x-5)(x-6)/120 r2(x) = (x-1)(x-3)(x-4)(x-5)(x-6)/((2-1)(2-3)(2-4)(2-5)(2-6)) = (x-1)(x-3)(x-4)(x-5)(x-6)/24 r3(x) = (x-1)(x-2)(x-4)(x-5)(x-6)/((3-1)(3-2)(3-4)(3-5)(3-6)) = -(x-1)(x-2)(x-4)(x-5)(x-6)/12 r4(x) = (x-1)(x-2)(x-3)(x-5)(x-6)/((4-1)(4-2)(4-3)(4-5)(4-6)) = (x-1)(x-2)(x-3)(x-5)(x-6)/12 r5(x) = (x-1)(x-2)(x-3)(x-4)(x-6)/((5-1)(5-2)(5-3)(5-4)(5-6)) = -(x-1)(x-2)(x-3)(x-4)(x-6)/24 r6(x) = (x-1)(x-2)(x-3)(x-4)(x-5)/((6-1)(6-2)(6-3)(6-4)(6-5)) = (x-1)(x-2)(x-3)(x-4)(x-5)/120 值得注意的是,即便象最初所说,诸ai和bi都是整数,所得的多项式的系数也有可能不是整数,而是有理数。

如果b1到b6分别取1,4,9,16,25,36,那么 f(x) = r1(x)+4r2(x)+9r3(x)+16r4(x)+25r5(x)+36r6(x) = x2 这正是平方序列的通项公式。

如果b1到b6分别取1,1,2,3,5,8,那么 f(x) = r1(x)+r2(x)+2r3(x)+3r4(x)+5r5(x)+8r6(x) = -(1/40)x5+(11/24)x4-(25/8)x3+(241/24)x2-(287/20)x+8 这当然不是斐波那契数列的通项公式,只是以上式为通项公式的数列的前6项恰好和斐波那契数列相同,它再接下去的几项是8,-6,-55,-173……就和斐波那契数列完全不一样了。

如果取“边看边说序列”的前几项,把它们当作是十进制数,也就是b1到b6分别取1,11,21,1211,111221,312211,那么拉格朗日插值法照样能找到合适的多项式: f(x) = r1(x)+11r2(x)+21r3(x)+1211r4(x)+111221r5(x)+312211r6(x) = -(11597/6)x5+(100285/3)x4-(416905/2)x3+(1766885/3)x2-(2247644/3)x+337211 以上式为通项公式的数列的前几项是:1,11,21,1211,111221,312211,228921,-1103269,-5470279,-15711269……

中学数学课程里为什么不正式地介绍一下拉格朗日插值法呢?从难度上来说这并不高,结果也相当漂亮。我私底下以为,有部分原因会不会是一旦中学生掌握了这个找通项公式的大杀器,就会拿来和老师们抬杠——比如说,坚持认为1,1,2,3,5,8的下一项是8,或者干脆是任何一个数如12345678,因为反正用拉格朗日插值法也能产生出一个6次多项式,它的前7项分别是1,1,2,3,5,8,12345678。

在前面对拉格朗日插值法进行叙述时我们假设了ai和bi都是整数,我们发现最后得到的多项式的系数却未必是整数,但如果我们假设它们是有理数,那么最后得到的多项式的系数就一定是有理数,因为由构造过程可知,系数总是ai和bi之间的加减乘除。这个推理过程也可以应用到ai和bi都是实数或者复数的情况,最后所得的多项式系数也必定分别是实数的或是复数的,因为它们都是域。

很自然地,我们也可以考虑ai和bi取在有限域GF(N)上的情形,上面介绍拉格朗日插值法的所有论证都还成立——除了一点,GF(N)上没有代数基本定理。但是在GF(N)上照样有“n次多项式最多只有n个根”的结论(证明略),所以在GF(N)上关于拉格朗日插值法的叙述仍旧可以成立。

在下一节我们将看到,在有限域GF(N)上的拉格朗日插值,将成为有效率地分摊秘密的有力工具。

<(六)
(八)>