# 多项式(Polynomials)
多项式对我们而言并不陌生,从中学的一次、二次函数到大学线性代数里的n次多项式,它在代数学里具有重要的作用。而在本节,我们将尝试将多项式应用于模运算及密码学的应用中,探讨如何应用其性质构造秘钥共享。
- 首先我们回顾一下多项式的形式:p(x)=adxd+ad−1xd−1+⋯+a1x+a0,其中x为变量,ai(0≤i≤d)为系数(均为实数),d为多项式的次数(degree)。
- 定义多项式p(x)的根a满足:p(a)=0(即函数图像与x轴的交点坐标)
- 下面给出两个关于多项式的重要性质:
- 任意d次非零多项式至多有d个根。
- 给定d+1个点(x1,y1),⋯,(xd+1,yd+1),其中所有点的x坐标互不相同,那么就有且仅有一个d次多项式p(x)满足p(xi)=yi(1≤i≤d+1)。
# 多项式插值(Polynomial Interpolation)
- 那么,如何从已知的d+1个点推出d次多项式的表达式呢?这里就要用到一种插值的方法:拉格朗日插值。
- 它的原理本质与中国剩余定理比较相似:即构造一系列项的和,对于每个项,当代入某个点xi时值为yi,而代入xj(j=i)时值为0。
- 具体而言,我们可以构造以下基项:
Δi(x)=∏j=i(xi−xj)∏j=i(x−xj)={1,x=xi0,x=xi
那么多项式p(x)就可以表示为:p(x)=i=1∑d+1yiΔi(x)
- 举个简单的例子:假设多项式函数过点(1,5),(6,8),(7,2),那么各个Δi(x)可如下计算:
Δ1(x)=(1−6)(1−7)(x−6)(x−7)=301x2−3013x+57Δ2(x)=(6−1)(6−7)(x−1)(x−7)=−51x2+58x−57Δ3(x)=(7−1)(7−6)(x−1)(x−6)=61x2−67x+1
- 所以多项式为
p(x)=5Δ1(x)+8Δ2(x)+2Δ3(x)=−1011x2+1083x−511
- 可以验证其满足经过这三个点。
# 性质2的证明
- 前面我们已经证明了存在性,下面就来证明其唯一性。
- 假设除了p(x),还有另一个不同的多项式q(x)满足经过这d+1个点。则考察r(x)=p(x)−q(x):因为p(x)与q(x)均为d次多项式,所以r(x)的次数也至多为d,那么由性质1(后面会证明),r(x)至多有d个根。而又因为p(x)−q(x)=0在d+1个点上均成立,故r(x)应该有d+1个根,产生矛盾。所以只能p(x)=q(x)。
# 多项式除法(Polynomial Division)
# 性质1的证明
- 为了证明性质1,我们先证明下面两个引理:
- 如果a是d次多项式p(x)的根(d≥1),那么p(x)可表示为(x−a)q(x),其中q(x)为d−1次多项式。
- 由条件得(x−a)∣p(x),故p(x)=(x−a)q(x)+r(x),而r(x)次数只能为0,所以只能为常数项c。又因为p(a)=0,所以c=0,故原式成立。
- 如果d次多项式p(x)有d个各不相同的根a1,⋯,ad,那么它就可以表示为c(x−a1)⋯(x−ad),其中c为非零实数。
- 对d进行归纳:
- 当d=0时,结论显然成立;
- 若d=k时结论成立,那么对于d=k+1次多项式p(x)(根为a1,⋯,ak+1),由上面的引理得p(x)=(x−ak+1)q(x),其中q(x)为k次多项式。
- 又因为p(ai)=(ai−ak+1)q(ai)=0对任意1≤i≤k均成立,故a1,⋯,ak均为q(x)的根。由归纳假设得q(x)=c(x−a1)⋯(x−ak)(c为非零实数),所以p(x)=c(x−a1)⋯(x−ak)(x−ak+1)。
- 归纳完成。
- 有了第二条引理,我们就能立刻得到性质1(因为任意a∈/{a1,⋯,ad}都不是p(x)的根)。
# 有限域(Finite Fields)
- 下面我们对多项式系数的数域进行讨论。上面的所有结论对应的系数都是在实数域上,但当我们将实数域换成复数域或有理数域时,这些结论也成立。然而,如果换成整数域(或自然数域),结论就不一定成立(具体而言,性质2不成立)。
- 实际上,我们对两个性质进行的证明都是基于其对应数域的运算封闭性展开的,所以对于整数域(自然数域),因为其在除法计算上不封闭,所以性质2就无法推出。
- 不过,对于整系数多项式,我们可以加入模p运算(这里p为质数),将整数域限制在{0,1,⋯,p−1},这样就又能做到四则运算均封闭了(做除法时除了0都存在乘法逆元)。所以在这个数域上,两条性质同样成立。
- 注:如果p为合数又会导致两个性质不成立。比如:当p=4时,x3≡0(mod4)的解有0,2,4,6,不满足性质1,类似也不满足性质2。
- 对于这个有限域,也被记为Fp或GFp(G代表Galois,伽罗瓦)【这就涉及到一些群论(抽象代数)的一些知识,感兴趣的可自行探索】
# 多项式个数统计
- 对于模p的整数域上的多项式,我们可以进一步研究以下问题:经过若干个点的不同d次多项式有多少?如果要从系数角度讨论满足的多项式会比较复杂,但如果我们换个角度——从多项式经过的点的角度,那么就会简单很多:
- 由上面得到的结论,一个d次多项式至少需要d+1个不同点唯一确定。那么,如果给定了m个点(m≤d+1),就剩下d+1−m个点没有被确定,而每个点的值域均为{0,1,⋯,p−1}种可能,总共就有pd+1−m种可能的多项式。
# 秘密共享(Secret Sharing)
- 那么多项式如何应用在秘密共享系统中呢?我们可以想象下面这个场景:
- 为了预防敌国的打击,C国部署了核弹防御系统,为了保证非必要不启用,系统设置了核弹发射密码(这里简化为整数s);而密码只能由n个重要人员得到,且:
- 只有这些人中至少k(k>1)个人共享信息,密码才能被计算出;
- 任意k−1个人共享信息,都无法计算出真实密码;
- 这里就可以使用多项式为各个人员分配信息:
- 首先,确定一个比s大的质数p,将数域限制在模p的整数域中;
- 然后,随机生成一个k−1次多项式P(x),要求满足P(0)=s;接着分别将P(1),P(2),⋯,P(n)的值提供给各个重要人员。
- 那么:
- 对于其中任意k−1个重要人员,如果他们共享信息,那么就只能确定多项式经过的k−1个点,而满足条件的多项式仍然有k个,即密码仍然有k种可能(这样猜测正确的概率与每个人单独猜测的概率相同);
- 而只要人员数达到k个,就可以利用拉格朗日插值法(注:涉及到的所有除法都转化为乘以对应的乘法逆)解出P(x),进而计算出s。
- 所以这种系统就保证了共同决策的最小规模,维护了系统的安全。