[学习笔记] 多项式拉格朗日反演与复合逆

不会多项式。

多项式复合函数

讲复合逆之前,先讲讲复合函数。这个问题是说,给定一个 n 次多项式 F(x),和一个 m 次多项式 G(x),你需要求一个 n 次多项式 H(x) ,满足条件:

H(x)F(G(x)) (mod xn+1)

换种说法,你要求的多项式应满足:

H(x)i=0n[xi]F(x)×G(x)i (mod xn+1)

做法

B=n。类似 BSGS:

i=0n[xi]F(x)G(x)i=i=0B1j=0B1[xiB+j]F(x)G(x)iB+j=i=0B1G(x)iBj=0B1[xiB+j]F(x)G(x)j

预处理出所有 G(x)jG(x)iB,这部分用 NTT 计算。然后对于 j=0B1[xiB+j]F(x)G(x)j 我们暴力计算,最后乘上 G(x)iB 即可。总时间复杂度 O(n2+nnlogn)

拉格朗日反演

现在我们讲讲复合逆。拉格朗日反演可以在 O(nlogn) 的时间求 [xn]G(x),其中 G(x) 满足 F(G(x))=xF(x) 是已知的多项式,并且 [x0]F(x)=[x0]G(x)=0[x1]F(x)0[x1]G(x)0G(x) 也被称为 F(x) 的复合逆。

引理:若 F(G(x))=x,那么 G(F(x))=x
证明:记 R[[x]]+ 为常数项为零且一次项非零的 R 上形式幂级数。我们知道函数的复合是定义在形式幂级数环 R[[x]] 上的二元运算,即 (FG)(x)=F(G(x)),其封闭性与结合性显然,所以构成半群。但 R[[x]]+ 具有更好的性质,下面我们将证明它在函数复合运算上构成群。引理等价于 G(x) 的左逆元等于右逆元,只要单位元 ϵ 同时是左幺元和右幺元,并且左右逆元都存在时,便有如下性质:设 α 存在左逆元 l 和右逆元 r,则 l=l(αr)=(lα)r=r。显然 R[[x]]+ 的单位元 ϵ(x)=x 满足性质,因此我们只需证明 G 的右逆元存在。使用待定系数法容易说明对于任意 A(x),B(x)R[[x]]+,方程 A(δ(x))=B(x)δ(x)R[[x]]+ 存在唯一解,因此 G(x) 的右逆元一定存在。这就证明了结论。

G(x)=i=1ngixi,代入 G(F(x))=x 得:

i=1ngi×F(x)i=x

两边同时求导:

i=1nigiF(x)i1F(x)=1

我们只关注 n 次项,将它提出:

ngnF(x)n1F(x)+i=1n1igiF(x)i1F(x)=1

两边同时除以 F(x)n 得:

ngnF(x)F(x)+i=1n1igiF(x)in1F(x)=1F(x)n

注意到 F(x)k 是 D-finite 的,对它求导得到 (F(x)k)=kF(x)k1F(x),即 F(x)kF(x)=(F(x)k+1)k+1,代入上式:

ngnF(x)F(x)+i=1n1giiin(F(x)in)=1F(x)n

不要忘记我们的目标是求出 gn,现在我们想办法把其他的系数全部消去。注意到,对于任意一个整系数多项式,其求导后 1 次项的系数一定为 0,因此我们将等式两边同时取 1 次项:

[x1]ngnF(x)F(x)=[x1]1F(x)n

对于等式右边:

[x1]1F(x)n=[xn1]xnF(x)n=[xn1]1(F(x)x)n

对于等式左边:

F(x)F(x)=f1+2f2x+3f3x2++nfnxn1f1x+f2x++fnxn=f1+2f2x+3f3x2++nfnxn1f1x(1+f2f1x++fnf1xn1)

p(x)=(1+f2f1x++fnf1xn1)1

F(x)F(x)=f1+2f2x+3f3x2++nfnxn1f1xp(x)=(x1+2f2f1+3f3f1x++nfnf1xn2)p(x)

由于 [x0]p(x)=1,于是

[x1]F(x)F(x)=1

于是

ngn=[xn1]1(F(x)x)n

gn=1n[xn1]1(F(x)x)n

多项式快速幂 + 多项式求逆即可。

扩展拉格朗日反演

扩展拉格朗日反演可以在 O(nlogn) 的时间求 [xn]G(x),其中 G(x) 满足 F(G(x))=H(x)F(x)H(x) 是已知的多项式。推导过程和拉格朗日反演完全一致,因此这里不再赘述了。结果是:

gn=1n[xn1]H(x)(F(x)x)n

事实上,可以认为拉格朗日反演是扩展拉格朗日反演中 H(x)=x 的一种特殊情况。

多项式复合逆

n1 次多项式 F(x)=i=0n1aixi。给定 nF(x) 的各项系数,要求一个 n1 次多项式 G(x) 满足:

G(F(x))x(modxn)

做法

上面提到的拉格朗日反演公式可以求出 G(x) 的一项系数,但现在我们要求所有系数。按照求多项式复合的方式做,令 B=n

G(x)=i=1n(1i[xi1]1(F(x)x)i)xi=i=0B1j=1B(1iB+j[xiB+j]1(F(x)x)iB+j)xiB+j=i=0B1j=1B(1iB+j[xiB+j](xF(x))iB(xF(x))j)xiB+j

预处理出所有 (xF(x))iB(xF(x))j,这部分用 NTT 计算。计算 [xiB+j](xF(x))iB(xF(x))j 这部分相当于给两个多项式,求出他们乘积的某一项系数,直接暴力即可。总时间复杂度 O(n2+nnlogn)

posted @   came11ia  阅读(726)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示