多项式求逆元
概述
多项式求逆元是多项式除法和多项式取模的必要过程,在竞赛中,有时候多项式求逆元的应用比多项式的除法还要多,用快速傅里叶变换以及倍增算法可以做到在 $\mathcal O(n\log n)$ 的时间内求出一个多项式的逆元
基本概念
在介绍多项式的逆元之前,先说明一些概念:多项式的度、多项式的逆元、多项式的除法和取余
对于一个多项式 $A(x)$,称其最高项的次数为这个多项式的度(degree),记作 $deg A$
对于多项式 $A(x), B(x)$,存在唯一的 $Q(x), R(x)$ 满足 $A(x) = Q(x)B(x) + R(x)$,其中 $deg R < deg B$,我们称 $Q(x)$ 为 $B(x)$ 除 $A(x)$ 的商,$R(x)$ 为 $B(x)$ 除 $A(x)$ 的余数,可以记作
\[ A(x) \equiv R(x) \pmod {B(x)} \]
多项式的逆元
对于一个多项式 $A(x)$,如果存在 $B(x)$ 满足 $deg B \leq deg A$ 并且
\[A(x)B(x) \equiv 1 \pmod {x^n}\]那么称 $B(x)$ 为 $A(x)$ 在 $\bmod x^n$ 意义下的逆元(inverse element),记作 $A^{-1}(x)$
求解过程
现在考虑如何求 $A^{-1}(x)$,当 $n=1$ 时,$A(x) \equiv c \pmod x$,$c$ 是一个常数,这样,$A^{-1}(x)$ 就是 $c^{-1}$
对于 $n>1$ 的情况,设 $B(x) = A^{-1}(x)$ 由定义可以知道
\[\begin{equation} \label{eqn1} A(x)B(x) \equiv 1 \pmod {x^n} \end{equation}\]假设在 $\bmod x^{\lceil \frac{n}{2} \rceil}$ 意义下 $A(x)$ 的逆元是 $B’(x)$ 并且我们已经求出,那么
\[\begin{equation} \label{eqn2} A(x)B'(x) \equiv 1 \pmod {x^{\lceil \frac{n}{2} \rceil}} \end{equation}\]再将 $(\ref{eqn1})$ 放到 $\bmod x^{\lceil \frac{n}{2} \rceil}$ 意义下
\[\begin{equation} \label{eqn3} A(x)B(x) \equiv 1 \pmod {x^{\lceil \frac{n}{2} \rceil}} \end{equation}\]然后 $(\ref{eqn2}) - (\ref{eqn3})$ 就可以得到
\[B(x) - B'(x) \equiv 0 \pmod {x^{\lceil \frac{n}{2} \rceil}}\]两边平方
\[B^2(x) - 2B'(x)B(x) + B'^2(x) \equiv 0 \pmod {x^n}\]这里解释一下平方后为什么模的 $x^{\lceil \frac{n}{2} \rceil}$ 也会平方,这是因为,左边多项式在 $\bmod x^n$ 意义下为 $0$,那么就说明其 $0$ 到 $n-1$ 次项系数都为 $0$,平方了之后,对于第 $0 \leq i \leq 2n-1$ 项,其系数 $a_i$ 为 $\sum_{j=0}^i a_ja_{i-j}$,很明显 $j$ 和 $i-j$ 之间必然有一个值小于 $n$,因此 $a_i$ 必然是 $0$,也就是说平方后在 $\bmod x^{2n}$ 意义下仍然为 $0$
然后同时乘上 $A(x)$,移项可以得到
\[B(x) \equiv 2B'(x) - A(x)B'^2(x) \pmod {x^n}\]这样就可以得到 $\bmod x^n$ 意义下的逆元了,利用 FFT 加速之后可以做到在 $\mathcal O(n\log n)$ 时间内解决当前问题,最后总的时间复杂度也就是
\[T(n) = T(\frac{n}{2}) + \mathcal O(n \log n) = \mathcal O(n \log n)\]顺便一提,由这个过程可以看出,一个多项式有没有逆元完全取决于其常数项是否有逆元
代码实现
假设我已经有了计算快速傅里叶变换的函数 transform(int deg, complex_t* x, complex_t* w)
以及单位根表 eps
和 inv_eps
下面是数论版的,并且是完整的代码实现
应用
预处理 Bernoulli 数
Bernoulli 数的指数生成函数(EGF)是
\[\frac{x}{e^x-1}=\sum_{i=0}^\infty B_i \frac{x^i}{i!}\]将 $e^x$ 泰勒展开就可以改写成
\[\frac{x}{e^x-1}=\frac{1}{\sum_{i=0}^\infty \frac{x^i}{(i+1)!}}\]然后利用刚刚所说的方法,求出这个多项式的逆元就可以得到 Bernoulli 数了
计算有标号简单连通无向图个数
看这篇文章,在列出方程后最后可以用多项式求逆优化
-
2015-05-22 20:55:48多项式除法及求模 | Miskcoo's Space (#1)[…] 多项式求逆元 […]
-
2015-05-28 12:42:28BZOJ-3456. 城市规划 | Miskcoo's Space (#2)[…] 这样求出 G(x) 的逆元然后和 C(x) 乘起来就可以得到 F(x),也就是答案了,由于模数十分特殊,可以利用 FFT 优化(多项式求逆看这里) […]
-
2015-06-08 08:41:56牛顿迭代法在多项式运算的应用 | Miskcoo's Space (#3)[…] 然后这个问题嘛…… 可以回忆一下多项式求逆的过程 […]
-
2015-09-03 12:12:53从多项式乘法到快速傅里叶变换 | Miskcoo's Space (#4)[…] 关于多项式的求逆元,可以看这里 […]
-
2016-03-29 19:15:22CMJ (#5)高考加油~~~ 可以理解 (mod x^n) 其实是在提取出多项式的 x^0~x^n-1 项么。
-
2016-03-29 23:43:05miskcoo (#6) reply to可以
-
2016-08-04 11:02:04sjj118 (#7)请问n一定要是2的幂吗?
-
2016-08-04 11:37:23miskcoo (#8) reply to如果不是2的幂次的话先把高次项补零补齐到2的幂
-
2017-11-22 09:37:43Elpsywk (#9)请问博主,最后的复杂度为什么是nlogn呢?这里有点没有看懂……
-
2017-11-25 00:20:57miskcoo (#10) reply tohttps://en.wikipedia.org/wiki/Master_theorem_(analysis_of_algorithms)
-
2018-02-16 14:04:05ACM网上较好教程整合(不定期更新) - PerfectPan's Blog (#11)[…] 多项式求逆元:http://blog.miskcoo.com/2015/05/polynomial-inverse […]
-
2019-01-18 18:20:45Planet6174 (#12)「平方后为什么模的 $x^{\lceil \frac{n}{2} \rceil}$ 也会平方」那里讲得太绕了 我可能会这样讲:根据 $B(x) - B'(x) \equiv 0 \pmod {x^{\lceil n/2 \rceil}}$,左边一定是一个形如 $k\cdot x^{\lceil n/2 \rceil}$ 的多项式,它的平方(即 $(B(x) - B'(x))^2$)为 $k^2x^n$($n$ 为偶数)或 $k^2x^{n+1}$($n$ 为奇数) ,显然二者均能被 $x^n$ 整除
-
2019-01-28 22:24:10Kewth (#13)请问博主,“n = 1 时 A(x) = c (mod x) 此时 A 的逆就是 c 的逆“那一块,c 是常量,x 是变量,为什么 c 在模 x 意义下会有逆
-
2019-03-10 21:46:27Sagimune (#14) reply tomod x 意为去掉多项式中x及更高次项吧
-
2020-02-12 09:48:29ixRic (#15) reply to可以这样想:$A(x)=Q(x)\cdot x^n$,因此$A^2(x)=Q^2(x)\cdot x^{2n}$,所以「平方后为什么模的$x^{\lceil \frac{n}{x} \rceil}$也会平方」。