概述
多项式求逆元是多项式除法和多项式取模的必要过程,在竞赛中,有时候多项式求逆元的应用比多项式的除法还要多,用快速傅里叶变换以及倍增算法可以做到在 O(nlogn) 的时间内求出一个多项式的逆元
基本概念
在介绍多项式的逆元之前,先说明一些概念:多项式的度、多项式的逆元、多项式的除法和取余
对于一个多项式 A(x) ,称其最高项的次数为这个多项式的度(degree),记作 degA
对于多项式 A(x),B(x) ,存在唯一的 Q(x),R(x) 满足 A(x)=Q(x)B(x)+R(x) ,其中 degR<degB ,我们称 Q(x) 为 B(x) 除 A(x) 的商, R(x) 为 B(x) 除 A(x) 的余数,可以记作
多项式的逆元
对于一个多项式 A(x) ,如果存在 B(x) 满足 degB≤degA 并且
那么称 B(x) 为 A(x) 在 modxn 意义下的逆元(inverse element),记作 A−1(x)
求解过程
现在考虑如何求 A−1(x) ,当 n=1 时, A(x)≡c(modx) , c 是一个常数,这样, A−1(x) 就是 c−1
对于 n>1 的情况,设 B(x)=A−1(x) 由定义可以知道
假设在 modx⌈n2⌉ 意义下 A(x) 的逆元是 B′(x) 并且我们已经求出,那么
再将 (1) 放到 modx⌈n2⌉ 意义下
两边平方
这里解释一下平方后为什么模的 x⌈n2⌉ 也会平方,这是因为,左边多项式在 modxn 意义下为 0 ,那么就说明其 0 到 n−1 次项系数都为 0 ,平方了之后,对于第 0≤i≤2n−1 项,其系数 ai 为 ∑ij=0ajai−j ,很明显 j 和 i−j 之间必然有一个值小于 n ,因此 ai 必然是 0 ,也就是说平方后在 modx2n 意义下仍然为 0
然后同时乘上 A(x) ,移项可以得到
这样就可以得到 modxn 意义下的逆元了,利用 FFT 加速之后可以做到在 O(nlogn) 时间内解决当前问题,最后总的时间复杂度也就是
顺便一提,由这个过程可以看出,一个多项式有没有逆元完全取决于其常数项是否有逆元
代码实现
假设我已经有了计算快速傅里叶变换的函数 transform(int deg, complex_t* x, complex_t*w) 以及单位根表 eps 和 inv_eps
下面是数论版的,并且是完整的代码实现
应用
预处理 Bernoulli 数
Bernoulli 数的指数生成函数(EGF)是
将 ex 泰勒展开就可以改写成
然后利用刚刚所说的方法,求出这个多项式的逆元就可以得到 Bernoulli 数了
计算有标号简单连通无向图个数
看这篇文章,在列出方程后最后可以用多项式求逆优化