多项式求逆
多项式的逆
如同一般整数的乘法逆元一样,我们可以定义多项式的“逆”。对于给出的一个n−1次多项式F(x),如果存在一个n−1次多项式,使得多项式乘法的结果F(x)∗G(x)在对xn取模后,只有常数项1,那么就把G(x)称为F(x)的逆,记作
F(x)∗G(x)≡1(modxn)
值得注意的是,多项式的取模和系数的取模是完全两码事。一个多项式可以理解成一个x进制数。当多项式对xn取模时,其实就是扔掉从xn开始的所有高次项。即多项式的取模是为了限定项数的。
F(x)模xn的逆有几项呢?事实上,在多项式问题中,“几项”这个问题是不重要的,因为如果愿意,我们可以认为所有多项式都有无限项,只不过高次的系数都是0罢了。重要的是,多项式有多少项会对我们解决问题产生影响。在这个问题中,多项式的逆只有n项对求解产生影响,所以如果模数是xn,我们便可以认为G(x)与F(x)都是n项的多项式。
多项式的逆是唯一的吗?我们知道整数的乘法逆元是唯一的,用反证法容易证明。而多项式的乘法本质上是系数的卷积。手动代入求解一下就可以发现多项式的逆也是唯一的:由F0我们可以解出G0就是F0的乘法逆元,再根据方程F0G1+F1G0≡0(modP)可以解得唯一的G1。然后不停地解出G2,G3,...,所以多项式的逆是唯一的。
求解多项式的逆
我们可以给F(x)的高次项补0使得n为2的幂次。由于多项式的逆是唯一的,因此补0后的G(x)就是补0后的F(x)的逆。而补0其实相当于什么事都没干。所以我们对n做的变换是完全没有问题的。以下假定n为2的幂次。
假设已经求解出了对xn/2取模后F(x)的逆H(x),则有
F(x)∗H(x)≡1(modxn/2)
根据多项式的逆的定义,又有
F(x)∗G(x)≡1(modxn/2)
因此
F(x)∗[G(x)−H(x)]≡0(modxn/2)
多项式可以当作一个x进制数来理解,因此如果两数的乘积为0,其中至少有一个数为0。而因为我们假定了F(x)的逆是有解的,因此F(x)不能为0,所以
G(x)−H(x)≡0(modxn/2)
也就是说G(x)和H(x)的前n/2项是一模一样的。现在,我们要开始考虑前n项的问题了。由于这个新的多项式,不妨令它为P(x)=G(x)−H(x),的前n/2项都为0,我们用系数卷积思考一下就会发现,P2(x)的前n−1项都为0。也就是
G2(x)+H2(x)−2G(x)H(x)≡0(modxn)
至此,我们已经将模数扩大为了xn。我们在新的等式两边同时乘以F(x)得
F(x)G2(x)+F(x)H2(x)−2F(x)G(x)H(x)≡0(modxn)
先前我们假定了F(x)∗G(x)≡1(modxn),所以可以代入化简得
G(x)+F(x)H2(x)−2H(x)≡0(modxn)
即
G(x)≡2H(x)−F(x)H2(x)(modxn)
G(x)≡H(x)[2−F(x)∗H(x)](modxn)
多项式求逆只需要按照上式递推即可。
但这里有个问题。先前我们在思考H(x)的时候是在模xn/2意义下的,而在这个式子里,当我们用到H(x)的时候是在模xn意义下的,那么H(x)的高次项会有影响吗?事实上,我们已经通过证明保证了P2(x)的前n−1项都为0,而这之后的变换又都是等价变换,因此我们知道最终得到的结果是正确的,并且一定是与H(x)的高次项无关的。只需要保证前后的两个H(x)的高次项是相同的即可。