专栏文章

最新最热多项式复合逆

算法·理论参与者 4已保存评论 4

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
4 条
当前快照
1 份
快照标识符
@mlgxsjwh
此快照首次捕获于
2026/02/11 02:30
上周
此快照最后确认于
2026/02/11 02:30
上周
查看原文

声明

本文大部分译自参考文献 [1],还有一些自己的理解和补充。

问题引入

对于一个特征值足够大的域 K\mathbb{K},定义 K[ ⁣[x] ⁣]\mathbb{K}[\![x]\!] 表示以 K\mathbb{K} 中元素为系数的形式幂级数。
那么,对于给定的多项式 f(x)f(x) 以及 n,kn,k,我们希望求出:
[xk]f(x)0, [xk]f(x)1,,[xk]f(x)n1[x^k]f(x)^0,\ [x^k]f(x)^1,\dots,[x^k]f(x)^{n-1}
设次数为 nn 的多项式乘法复杂度为 M(n)M(n),那么本文可以给出该问题的一个 O(M(n+k)log(n+k))O(M(n+k)\log(n+k)) 的解法。

Bostan-Mori 算法

该算法提出于参考文献 [2]。
对于给定的 nn 次多项式 f(x),g(x)f(x),g(x) 以及 kk,Bostan-Mori 算法能够求出:
[xk]f(x)g(x)[x^k]\frac{f(x)}{g(x)}
复杂度为 O(M(n)logk)O(M(n)\log k)

引理 1

f(x)f(x)f(x)f(-x) 可以表示为 H(x2)H(x^2)​,即只包含偶数项。

证明

提取 f(x)f(x) 的奇偶次项,写成 f(x)=c0(x2)+xc1(x2)f(x)=c_0(x^2)+xc_1(x^2),那么 f(x)f(x)=c0(x2)2x2c1(x2)2f(x)f(-x)=c_0(x^2)^2-x^2c_1(x^2)^2

将式子进行重写:
f(x)g(x)=f(x)g(x)g(x)g(x)=xP(x2)+Q(x2)H(x2)\frac{f(x)}{g(x)}=\frac{f(x)g(-x)}{g(x)g(-x)}=\frac{xP(x^2)+Q(x^2)}{H(x^2)}
其中,H(x2)H(x^2) 是将 g(x)g(x)g(x)g(-x) 重写,而 P(x2),Q(x2)P(x^2),Q(x^2) 分别是提取 f(x)g(x)f(x)g(-x) 的奇数项和偶数项。
那么:
[xk]f(x)g(x)={[xk/2]P(x)H(x),2k[xk/2]Q(x)H(x),2k[x^k]\frac{f(x)}{g(x)}=\begin{cases} \displaystyle [x^{\lfloor k/2\rfloor}]\frac{P(x)}{H(x)} &,2\mid k \\ \displaystyle [x^{\lfloor k/2\rfloor}]\frac{Q(x)}{H(x)} &,2\nmid k \end{cases}
可以递归到规模减半的子问题,递归边界为 k=0k=0,是平凡的。
注意 P(x),Q(x),H(x)P(x),Q(x),H(x) 的次数仍然是 nn,所以该算法时间复杂度为 O(M(n)logk)O(M(n)\log k)

原问题的算法

我们假设 [x0]f(x)=0[x^0]f(x)=0,否则,我们可以让 f(x)f(x) 减去常数项求解,最后多一次卷积。
ansi=[xk]f(x)ians_i=[x^k]f(x)^i,那么我们有:
ansi=[xkyi]jyjf(x)j=[xkyi]11yf(x)ans_i=[x^ky^i]\sum_jy^jf(x)^j=[x^ky^i]\frac{1}{1-yf(x)}
于是我们只需要求出 [xk]11yf(x)[x^k]\dfrac{1}{1-yf(x)},结果是 K[ ⁣[y] ⁣]\mathbb{K}[\![y]\!] 中的元素。
我们应用 Bostan-Mori 算法。观察算法过程:每进行一次迭代,yy 的次数就会翻倍;由于我们可以把分子分母对 xk+1x^{k+1} 取模,而 kk 减半,从而 xx 的次数也会减半。因此 x,yx,y 的次数之积是 O(n+k)O(n+k) 的,可以在 O(M(n+k))O(M(n+k)) 的时间复杂度内计算二元多项式的乘法。
整个算法的复杂度是 O(M(n+k)log(n+k))O(M(n+k)\log (n+k))
在算法竞赛中,K\mathbb{K} 通常为 NTT 模数域,此时时间复杂度为 O((n+k)log2(n+k))O((n+k)\log^2(n+k))

求解多项式复合逆

原文题有另外的一个解法,来自参考文献 [3]。其中用到了复合逆。我们可以通过一种“算两次”的方法反解出复合逆。下面介绍这种方法:
我们仍然要求 [xk]11yf(x)[x^k]\dfrac{1}{1-yf(x)}。但是这次我们设 H(x)=11yxH(x)=\dfrac{1}{1-yx} 然后使用拉格朗日反演,设 g(x)g(x)f(x)f(x) 的复合逆,那么:
[xk]11yf(x)=1k[xk1]H(x)(xg(x))k=1k[xk1]y(1yx)2(xg(x))k\begin{aligned}% [x^k] \dfrac{1}{1-yf(x)}&=\dfrac{1}{k}[x^{k-1}]H'(x)\left(\dfrac{x}{g(x)}\right)^k \\ &=\dfrac{1}{k}[x^{k-1}]\dfrac{y}{(1-yx)^2}\left(\dfrac{x}{g(x)}\right)^k \end{aligned}
我们有 1(1x)2=i=0+ixi+1\displaystyle \frac{1}{(1-x)^2}=\sum_{i=0}^{+\infty} ix^{i+1},带入得到:
[xk]11yf(x)=1k[xk1]yi=0k(i+1)xiyi(xg(x))k[x^k]\frac{1}{1-yf(x)}=\frac{1}{k}[x^{k-1}]y\sum_{i=0}^k (i+1)x^iy^i\left(\dfrac{x}{g(x)}\right)^k
然后取 yiy^i 系数得到:
ansi=[xkyi]11yf(x)=ik[xki](xg(x))k\begin{aligned} ans_i&=[x^ky^i]\frac{1}{1-yf(x)} \\ &=\frac{i}{k}[x^{k-i}]\left(\dfrac{x}{g(x)}\right)^k \end{aligned}
于是我们只需要求出 (x/g(x))kmodxk+1(x/g(x))^k\bmod x^{k+1} 就可以得到所有 ansians_i
反之亦然,我们可以通过本文的方法得到 ansians_i,并逆推出 (x/g(x))kmodxk+1(x/g(x))^k\bmod x^{k+1},然后再进行开 kk 次根、求逆的操作,就可以得到 g(x)g(x)
至此,我们完成了对多项式复合逆的求解。

求解多项式复合函数

根据参考文献 [4],多项式复合函数可以与多项式复合逆在相同复杂度内计算。
下面讲解如何使用复合逆求解复合函数。
假设我们有多项式 P(x)=i=1n1pixi, Q(x)=i=0n1qixi\displaystyle P(x)=\sum_{i=1}^{n-1} p_ix^i,\ Q(x)=\sum_{i=0}^{n-1}q_ix^i,目标是求出 R(x)=Q(P(x))modxnR(x)=Q(P(x))\bmod x^n
首先我们可以假设 p1=1, q0=0p_1=1,\ q_0=0,否则假设有 k<nk<n 满足 p1=p2==pk1=0, pk0p_1=p_2=\dots=p_{k-1}=0,\ p_k\neq 0,那么:
P~(x):=P(x)pkkQ~(x):=Q(pkxk)q0R(x)=Q~(P~(x))+q0\begin{aligned} & \tilde{P}(x):=\sqrt[k]{\frac{P(x)}{p_k}} \\ & \tilde{Q}(x):=Q(p_kx^k)-q_0 \\ & R(x)=\tilde{Q}(\tilde{P}(x))+q_0 \end{aligned}
就可以转化成 p1=1, q0=0p_1=1,\ q_0=0​ 的情形。
P(1)(x)P^{(-1)}(x) 表示 P(x)P(x) 的复合逆,然后我们写出一些定义:
V(x):=P(1)(x)modx2nVˉ(x):=(V(x)xnQ(x)V(x))modx2nPˉ(x):=V(1)(x)modx2n\begin{aligned} & V(x):=P^{(-1)}(x) \bmod x^{2n} \\ & \bar{V}(x):=(V(x)-x^nQ(x)V'(x)) \bmod x^{2n} \\ & \bar{P}(x):=V^{(-1)}(x) \bmod x^{2n} \end{aligned}

引理 1

P(x)=Pˉ(x)(modxn+1)P(x)=\bar{P}(x)\pmod{x^{n+1}}

证明

knk\le n,根据拉格朗日反演,我们有:
[xk]Pˉ(x)=1k[xk1](xV(x)xnQ(x)V(x))k=1k[xk1](V(x)xxnQ(x)V(X))n=1k[xk1]i=0+(ni)(1)ixniQ(x)iV(x)i(V(x)x)ni\begin{aligned}% [x^k]\bar{P}(x)&=\frac{1}{k}[x^{k-1}]\left(\frac{x}{V(x)-x^nQ(x)V'(x)}\right)^k \\ &=\frac{1}{k}[x^{k-1}]\left(\frac{V(x)}{x}-x^nQ(x)V'(X)\right)^{-n} \\ &=\frac{1}{k}[x^{k-1}]\sum_{i=0}^{+\infty}\binom{-n}{i}(-1)^ix^{ni}Q(x)^iV'(x)^i\left(\frac{V(x)}{x}\right)^{-n-i} \end{aligned}
i1i\ge 1 时后面式子的次数 n\ge n,而 k1<nk-1<n,所以只用考虑 i=0i=0 的项。那么:
[xk]Pˉ(x)=1k[xk1](xV(x))n=[xk]P(x)\begin{aligned}% [x^k]\bar{P}(x)&=\frac{1}{k}[x^{k-1}]\left(\frac{x}{V(x)}\right)^n \\ &=[x^k]P(x) \end{aligned}
所以 P(x)=Pˉ(x)(modxn+1)P(x)=\bar{P}(x)\pmod{x^{n+1}}

引理 2

P(Vˉ(x))=P(V(x))xnP(V(x))Q(x)V(x)(modx2n)P(\bar{V}(x))=P(V(x))-x^nP'(V(x))Q(x)V'(x)\pmod{x^{2n}}

证明

直接将 P(Vˉ(x))P(\bar{V}(x)) 进行展开:
P(Vˉ(x))=i=1n1pi(V(x)xnQ(x)V(x))i=i=1n1pij=0i(ij)(1)jV(x)ijxnjQ(x)jV(x)j\begin{aligned} P(\bar{V}(x))&=\sum_{i=1}^{n-1} p_i\left(V(x)-x^nQ(x)V'(x)\right)^i \\ &=\sum_{i=1}^{n-1}p_i\sum_{j=0}^i\binom{i}{j}(-1)^jV(x)^{i-j}x^{nj}Q(x)^jV'(x)^j \end{aligned}
j2j\ge 2 时后半部分 modx2n=0\bmod x^{2n}=0,所以只取 j=0,1j=0,1
P(Vˉ(x))=i=1n1piV(x)i+i=1n1ipiV(x)i1xnQ(x)V(x)=P(V(x))xnP(V(x))Q(x)V(x)\begin{aligned} P(\bar{V}(x))&=\sum_{i=1}^{n-1}p_iV(x)^i+\sum_{i=1}^{n-1}i p_i V(x)^{i-1}x^nQ(x)V'(x) \\ &=P(V(x))-x^nP'(V(x))Q(x)V'(x) \end{aligned}
于是引理 2 得证。

因为 P(V(x))=xP(V(x))=x,所以有 P(V(x))=V(x)P(V(x))=1P'(V(x))=V'(x)P'(V(x))=1。于是我们可以重写引理 2:
P(Vˉ(x))=xxnQ(x)(modx2n)P(\bar{V}(x))=x-x^nQ(x) \pmod{x^{2n}}
然后我们将 Pˉ(x)\bar{P}(x) 替换 xx,得到:
P(x)=Pˉ(x)Pˉ(x)nQ(Pˉ(x))(modx2n)P(x)=\bar{P}(x)-\bar{P}(x)^nQ(\bar{P}(x))\pmod{x^{2n}}
根据引理 1 有 P(x)=Pˉ(x)(modxn+1)P(x)=\bar{P}(x)\pmod{x^{n+1}},而 Pˉ(x)n\bar{P}(x)^n 的最低次项是 xnx^n。因此 Pˉ(x), Q(Pˉ(x))\bar{P}(x),\ Q(\bar{P}(x))n\ge n 次项在乘完后次数会 2n\ge 2n,因此可以对 xnx^n 取模。于是这两个 Pˉ(x)\bar{P}(x) 都可以替换为 P(x)P(x)
P(x)=Pˉ(x)P(x)nQ(P(x))(modx2n)P(x)=\bar{P}(x)-P(x)^nQ(P(x))\pmod{x^{2n}}
也即:
xnR(x)=(xP(x))n(Pˉ(x)P(x))(modx2n)x^nR(x)=\left(\frac{x}{P(x)}\right)^{n}(\bar{P}(x)-P(x))\pmod{x^{2n}}
因此我们只需要计算出 V(x),Vˉ(x),Pˉ(x)V(x),\bar{V}(x),\bar{P}(x) 便可以求出 R(x)modx2nR(x)\bmod x^{2n},时间复杂度显然是和求复合逆等价的,为 O(M(n)logn)O(M(n)\log n)

参考文献

[1] noshi91. FPS の合成と逆関数、冪乗の係数列挙 Θ(n(log(n))2)\Theta(n (\log(n))^2). https://noshi91.hatenablog.com/entry/2024/03/16/224034.
[2] A. Bostan & R. Mori (2021). A Simple and Fast Algorithm for Computing the NN-th Term of a Linearly Recurrent Sequence. arXiv:2008.08822 [cs.SC]
[3] zscoder. Generating Functions in Competitive Programming (Part 2). https://codeforces.com/blog/entry/77551.
[4] R. P. Brent and H. T. Kung (1978). Fast Algorithms for Manipulating Formal Power Series. J. ACM 25, 4 (Oct. 1978), 581–595.

评论

4 条评论,欢迎与作者交流。

正在加载评论...