形式幂级数复合|复合逆
形式幂级数的复合和复合逆也是常见的形式幂级数操作,对于没有特殊性质的 𝑓f 之前我们一直使用的多是 𝑂(𝑛2)O(n2)
的算法来计算 𝑓(𝑔)mod𝑥𝑛f(g)modxn
其中 𝑓 ∈ℂ[[𝑥]],𝑔 ∈𝑥ℂ[[𝑥]]f∈C[[x]],g∈xC[[x]]
,但是因为效率较低应用较少.我们介绍 Kinoshita–Li 的 𝑂(𝖬(𝑛)log𝑛)O(M(n)logn)
的算法,其中 𝑂(𝖬(𝑛))O(M(n))
为两个次数为 𝑂(𝑛)O(n)
的多项式相乘的时间.
形式幂级数/多项式的复合
若要计算 𝑓(𝑔(𝑥))mod𝑥𝑛f(g(x))modxn 那么需要 𝑓(𝑔(𝑥))f(g(x))
的每一项系数都是有限项之和,所以之前要求 𝑓(𝑥) ∈ℂ[[𝑥]],𝑔(𝑥) ∈𝑥ℂ[[𝑥]]f(x)∈C[[x]],g(x)∈xC[[x]]
,而如果 𝑓(𝑥),𝑔(𝑥) ∈ℂ[𝑥]f(x),g(x)∈C[x]
也可以满足这个条件.因为我们需要将 𝑓(𝑔(𝑥))f(g(x))
的系数截断,不妨直接考虑 𝑓(𝑥),𝑔(𝑥)f(x),g(x)
都是多项式的情况.对于 𝑓(𝑥) =∑𝑛−1𝑗=0𝑓𝑗𝑥𝑗f(x)=∑j=0n−1fjxj
,有
𝑓(𝑔(𝑥))=𝑛−1∑𝑗=0𝑓𝑗𝑔(𝑥)𝑗f(g(x))=∑j=0n−1fjg(x)j
𝑓(𝑦−1)1−𝑦⋅𝑔(𝑥)=∑𝑗≥0(⋯+𝑓𝑗𝑦−𝑗+⋯)𝑔(𝑥)𝑗𝑦𝑗𝑓(𝑔(𝑥))=[𝑦0]𝑓(𝑦−1)1−𝑦⋅𝑔(𝑥)f(y−1)1−y⋅g(x)=∑j≥0(⋯+fjy−j+⋯)g(x)jyjf(g(x))=[y0]f(y−1)1−y⋅g(x)
根据 常系数齐次线性递推 中提到的 Bostan–Mori 算法,Kinoshita 和 Li 指出可以将其修改为二元形式:
𝑃(𝑦)𝑄(𝑥,𝑦)mod𝑥𝑛=(𝑃(𝑦)𝑄(𝑥,𝑦)𝑄(−𝑥,𝑦)mod𝑥𝑛)𝑄(−𝑥,𝑦)mod𝑥𝑛=(𝑃(𝑦)𝑉(𝑥2,𝑦)mod𝑥𝑛)𝑄(−𝑥,𝑦)mod𝑥𝑛=(𝑃(𝑦)𝑉(𝑧,𝑦)mod𝑧⌈𝑛/2⌉)∣𝑧=𝑥2𝑄(−𝑥,𝑦)mod𝑥𝑛P(y)Q(x,y)modxn=(P(y)Q(x,y)Q(−x,y)modxn)Q(−x,y)modxn=(P(y)V(x2,y)modxn)Q(−x,y)modxn=(P(y)V(z,y)modz⌈n/2⌉)|z=x2Q(−x,y)modxn
这样递归的计算在 𝑛 =1n=1 时我们只需计算
𝑃(𝑦)𝑄(𝑥,𝑦)mod𝑥=𝑃(𝑦)𝑄(0,𝑦)∈ℂ((𝑦))P(y)Q(x,y)modx=P(y)Q(0,y)∈C((y))
在计算 𝑃(𝑦)𝑉(𝑧,𝑦)mod𝑧⌈𝑛/2⌉ ∈ℂ𝑧)P(y)V(z,y)modz⌈n/2⌉∈Cz) 时我们不需要保留所有 𝑦y
的系数,因为最后我们只需要提取 𝑦0y0
的系数,所以 𝑦>0y>0
的系数是不需要的,而因为求出前者之后需要将其乘以若干个形如 𝑄( −𝑥,𝑦) ∈ℂ[𝑥,𝑦]Q(−x,y)∈C[x,y]
的「多项式 」,所以只需要保留对于 𝑦0y0
有贡献的系数即可.我们准备好给出伪代码:
𝐀𝐥𝐠𝐨𝐫𝐢𝐭𝐡𝐦 𝖢𝗈𝗆𝗉(𝑃(𝑦),𝑄(𝑥,𝑦),𝑛,𝑚):𝐈𝐧𝐩𝐮𝐭: 𝑃=∑0≤𝑗<𝑛𝑝𝑗𝑦−𝑗∈ℂ((𝑦)),𝑄∈ℂ[𝑥,𝑦],𝑛,𝑚∈ℕ>0.𝐎𝐮𝐭𝐩𝐮𝐭: [𝑦(−𝑚,0]]𝑃(𝑦)𝑄(𝑥,𝑦)mod𝑥𝑛.𝐑𝐞𝐪𝐮𝐢𝐫𝐞: [𝑥0𝑦0]𝑄=1.1𝐢𝐟 𝑛=1 𝐭𝐡𝐞𝐧 𝐫𝐞𝐭𝐮𝐫𝐧 ([𝑦−𝑚+1]𝑃(𝑦)𝑄(0,𝑦),…,[𝑦0]𝑃(𝑦)𝑄(0,𝑦))2𝑉(𝑥2,𝑦)←𝑄(𝑥,𝑦)𝑄(−𝑥,𝑦)mod𝑥𝑛3𝑑←deg𝑦𝑄(−𝑥,𝑦)4(𝑡−(𝑚+𝑑)+1,…,𝑡0)←𝖢𝗈𝗆𝗉(𝑃(𝑦),𝑉(𝑥,𝑦),⌈𝑛/2⌉,𝑚+𝑑)5𝑇(𝑥,𝑦)←∑0𝑗=−(𝑚+𝑑)+1𝑡𝑗𝑦𝑗6𝑈(𝑥,𝑦)=∑𝑑𝑗=−(𝑚+𝑑)+1𝑢𝑗𝑦𝑗←𝑇(𝑥2,𝑦)𝑄(−𝑥,𝑦)mod𝑥𝑛7𝐫𝐞𝐭𝐮𝐫𝐧 (𝑢−𝑚+1,…,𝑢0)Algorithm Comp(P(y),Q(x,y),n,m):Input: P=∑0≤j<npjy−j∈C((y)),Q∈C[x,y],n,m∈N>0.Output: [y(−m,0]]P(y)Q(x,y)modxn.Require: [x0y0]Q=1.1if n=1 then return ([y−m+1]P(y)Q(0,y),…,[y0]P(y)Q(0,y))2V(x2,y)←Q(x,y)Q(−x,y)modxn3d←degyQ(−x,y)4(t−(m+d)+1,…,t0)←Comp(P(y),V(x,y),⌈n/2⌉,m+d)5T(x,y)←∑j=−(m+d)+10tjyj6U(x,y)=∑j=−(m+d)+1dujyj←T(x2,y)Q(−x,y)modxn7return (u−m+1,…,u0)
那么我们有
𝑓(𝑔(𝑥))mod𝑥𝑛=𝖢𝗈𝗆𝗉(𝑓(𝑦−1),1−𝑦⋅𝑔(𝑥),max{1+deg𝑓,𝑛},1)mod𝑥𝑛f(g(x))modxn=Comp(f(y−1),1−y⋅g(x),max{1+degf,n},1)modxn
注意第三个参数是因为 𝑔(0)g(0) 可能不为零,如果 deg𝑓 ≥𝑛degf≥n
此时不能截断 𝑓(𝑥)f(x)
来计算 𝑓(𝑔(𝑥))f(g(x))
,我们也可以选择计算 𝑓(𝑔) =𝑓 ∘(𝑥+𝑔(0)) ∘(𝑔−𝑔(0))f(g)=f∘(x+g(0))∘(g−g(0))
,此时可以取 𝐹 :=𝑓(𝑥+𝑔(0))mod𝑥𝑛F:=f(x+g(0))modxn
和 𝐺 :=𝑔 −𝑔(0)G:=g−g(0)
转而计算 𝖢𝗈𝗆𝗉(𝐹(𝑦−1),1−𝑦⋅𝐺(𝑥),𝑛,1)Comp(F(y−1),1−y⋅G(x),n,1)
.
另外因为调用的限制最后递归终止时的 𝑄(0,𝑦)−1Q(0,y)−1 是可以直接导出的,不需要使用形式幂级数的乘法逆元算法来计算,我们只需计算一次乘法然后提取需要的系数.
常见的特殊形式复合
我们常用的 多项式初等函数 都可以通过复合计算:
𝑔(0)=1, 𝑔−1=1+(1−𝑔)+(1−𝑔)2+⋯𝑔(0)=1, log𝑔=−1−𝑔1−(1−𝑔)22−(1−𝑔)33−⋯𝑔(0)=0, exp𝑔=1+𝑔1!+𝑔22!+𝑔33!+⋯𝑔(0)=1, 𝑔𝑒=1+𝑒1(𝑔−1)+𝑒(𝑒−1)2(𝑔−1)2+⋯g(0)=1, g−1=1+(1−g)+(1−g)2+⋯g(0)=1, logg=−1−g1−(1−g)22−(1−g)33−⋯g(0)=0, expg=1+g1!+g22!+g33!+⋯g(0)=1, ge=1+e1(g−1)+e(e−1)2(g−1)2+⋯
在复合逆的计算中我们也会用到求幂函数.
Kronecker 代换
在分析时间复杂度之前我们先考虑如何作二元多项式乘法,一种想法是将系数「打包」,这一方法由 Kronecker 在 1882 年通过 𝑦 ↦𝑥𝑁y↦xN 将 𝑅[𝑥,𝑦]R[x,y]
上的乘法缩减为 𝑅[𝑥]R[x]
上的乘法,但是要求 𝑁N
足够大.
不妨设 deg𝑥(𝐴𝐵) <𝑁degx(AB)<N,那么我们计算 𝐴(𝑥,𝑥𝑁)𝐵(𝑥,𝑥𝑁)A(x,xN)B(x,xN)
之后仍然可以还原出 𝐴(𝑥,𝑦)𝐵(𝑥,𝑦)A(x,y)B(x,y)
且「打包」和「拆包」的时间为线性.
我们使用 Kronecker 代换再计算一元多项式乘法即可,不难发现在 𝑛n 为二的幂时上述算法可以在 𝑂(𝖬(𝑛)log𝑛)O(M(n)logn)
时间完成,因为每一次递归中 𝑦y
的次数翻倍,但是 𝑥x
的次数减半.
模板(P5373【模板】多项式复合函数)
代码相对于原算法作了一些简化及修改,使得代码更短.
---|---
## 形式幂级数的复合逆
现给出 𝑓 ∈𝑥ℂ[[𝑥]]f∈xC[[x]] 且 𝑓′(0) ≠0f′(0)≠0,求出 𝑔(𝑥)mod𝑥𝑛g(x)modxn 满足 𝑓(𝑔) ≡𝑔(𝑓) ≡𝑥(mod𝑥𝑛)f(g)≡g(f)≡x(modxn).
根据 [Lagrange 反演](../lagrange-inversion/),对于 𝑛 >1,𝑘 ≥0n>1,k≥0 我们有
[𝑥𝑛−1]𝑓(𝑥)𝑘=𝑘𝑛−1[𝑥𝑛−1−𝑘](𝑔(𝑥)𝑥)−(𝑛−1)[xn−1]f(x)k=kn−1[xn−1−k](g(x)x)−(n−1)
也就是我们如果能对 𝑘 =0,1,…,𝑛 −1k=0,1,…,n−1 求出 [𝑥𝑛−1]𝑓(𝑥)𝑘[xn−1]f(x)k,那么就可以求出其复合逆.
Kinoshita 和 Li 指出我们可以考虑二元有理函数
11−𝑦⋅𝑓(𝑥)=∑𝑗≥0𝑓(𝑥)𝑗𝑦𝑗11−y⋅f(x)=∑j≥0f(x)jyj
且这个问题有一个更一般的形式即 Power Projection 问题:我们考虑计算
𝑢:=[𝑥𝑛−1]𝑃(𝑥,𝑦)𝑄(𝑥,𝑦)mod𝑦𝑚u:=[xn−1]P(x,y)Q(x,y)modym
当 𝑛 −1 =0n−1=0 时显然有 𝑢 =𝑃(0,𝑦)𝑄(0,𝑦)mod𝑦𝑚u=P(0,y)Q(0,y)modym,否则我们有
𝑃(𝑥,𝑦)𝑄(𝑥,𝑦)=𝑃(𝑥,𝑦)𝑄(−𝑥,𝑦)𝑄(𝑥,𝑦)𝑄(−𝑥,𝑦)=𝑈𝑒(𝑥2,𝑦)+𝑥𝑈𝑜(𝑥2,𝑦)𝑉(𝑥2,𝑦)P(x,y)Q(x,y)=P(x,y)Q(−x,y)Q(x,y)Q(−x,y)=Ue(x2,y)+xUo(x2,y)V(x2,y)
那么
𝑢=⎧{ { {⎨{ { {⎩[𝑥𝑛−1]𝑈𝑒(𝑥2,𝑦)𝑉(𝑥2,𝑦) if 𝑛−1 is even,[𝑥𝑛−1]𝑥𝑈𝑜(𝑥2,𝑦)𝑉(𝑥2,𝑦) if 𝑛−1 is odd.=⎧{ { {⎨{ { {⎩[𝑥⌈𝑛/2⌉−1]𝑈𝑒(𝑥,𝑦)𝑉(𝑥,𝑦) if 𝑛−1 is even,[𝑥⌈𝑛/2⌉−1]𝑈𝑜(𝑥,𝑦)𝑉(𝑥,𝑦) if 𝑛−1 is odd.u={[xn−1]Ue(x2,y)V(x2,y) if n−1 is even,[xn−1]xUo(x2,y)V(x2,y) if n−1 is odd.={[x⌈n/2⌉−1]Ue(x,y)V(x,y) if n−1 is even,[x⌈n/2⌉−1]Uo(x,y)V(x,y) if n−1 is odd.
我们给出其伪代码:
𝐀𝐥𝐠𝐨𝐫𝐢𝐭𝐡𝐦 𝖯𝗈𝗐𝖯𝗋𝗈𝗃(𝑃(𝑥,𝑦),𝑄(𝑥,𝑦),𝑛,𝑚):𝐈𝐧𝐩𝐮𝐭: 𝑃,𝑄∈ℂ[𝑥,𝑦],𝑛,𝑚∈ℕ>0.𝐎𝐮𝐭𝐩𝐮𝐭: [𝑥𝑛−1]𝑃(𝑥,𝑦)𝑄(𝑥,𝑦)mod𝑦𝑚.𝐑𝐞𝐪𝐮𝐢𝐫𝐞: [𝑥0𝑦0]𝑄=1.1𝐰𝐡𝐢𝐥𝐞 𝑛>1 𝐝𝐨2𝑈(𝑥,𝑦)←𝑃(𝑥,𝑦)𝑄(−𝑥,𝑦)mod𝑥𝑛mod𝑦𝑚3𝐢𝐟 𝑛−1 is even 𝐭𝐡𝐞𝐧4𝑃(𝑥,𝑦)←∑⌈𝑛/2⌉+1𝑗=0([𝑥2𝑗]𝑈(𝑥,𝑦))𝑥𝑗5𝐞𝐥𝐬𝐞6𝑃(𝑥,𝑦)←∑⌈𝑛/2⌉+1𝑗=0([𝑥2𝑗+1]𝑈(𝑥,𝑦))𝑥𝑗7𝐞𝐧𝐝 𝐢𝐟8𝑉(𝑥,𝑦)←𝑄(𝑥,𝑦)𝑄(−𝑥,𝑦)mod𝑥𝑛mod𝑦𝑚9𝑄(𝑥,𝑦)←∑⌈𝑛/2⌉+1𝑗=0([𝑥2𝑗]𝑉(𝑥,𝑦))𝑥𝑗10𝑛←⌈𝑛/2⌉11𝐞𝐧𝐝 𝐰𝐡𝐢𝐥𝐞12𝐫𝐞𝐭𝐮𝐫𝐧 (𝑃(0,𝑦)𝑄(0,𝑦)mod𝑦𝑚)Algorithm PowProj(P(x,y),Q(x,y),n,m):Input: P,Q∈C[x,y],n,m∈N>0.Output: [xn−1]P(x,y)Q(x,y)modym.Require: [x0y0]Q=1.1while n>1 do2U(x,y)←P(x,y)Q(−x,y)modxnmodym3if n−1 is even then4P(x,y)←∑j=0⌈n/2⌉+1([x2j]U(x,y))xj5else6P(x,y)←∑j=0⌈n/2⌉+1([x2j+1]U(x,y))xj7end if8V(x,y)←Q(x,y)Q(−x,y)modxnmodym9Q(x,y)←∑j=0⌈n/2⌉+1([x2j]V(x,y))xj10n←⌈n/2⌉11end while12return (P(0,y)Q(0,y)modym)
同样的我们也可以直接导出 𝑄(0,𝑦)−1Q(0,y)−1 而不需要计算形式幂级数的乘法逆元,那么复合逆的算法就是
𝐀𝐥𝐠𝐨𝐫𝐢𝐭𝐡𝐦 𝖱𝖾𝗏(𝑓(𝑥),𝑛):𝐈𝐧𝐩𝐮𝐭: 𝑓∈𝑥ℂ[[𝑥]],𝑓′(0)≠0,𝑛∈ℕ≥2.𝐎𝐮𝐭𝐩𝐮𝐭: 𝑔(𝑥)mod𝑥𝑛 such that 𝑓(𝑔)≡𝑔(𝑓)≡𝑥(mod𝑥𝑛).1𝑡←𝑓′(0)2𝐹(𝑥)←𝑓(𝑡−1𝑥)3∑𝑛−1𝑘=0𝑎𝑘𝑦𝑘←𝖯𝗈𝗐𝖯𝗋𝗈𝗃(1,1−𝑦⋅𝐹(𝑥),𝑛,𝑛)4𝐺(𝑥)←∑𝑛−1𝑘=1𝑛−1𝑘𝑎𝑘𝑥𝑛−1−𝑘5𝐻(𝑥)←(𝐺(𝑥)1/(𝑛−1))−1mod𝑥𝑛−16𝐫𝐞𝐭𝐮𝐫𝐧 ((𝑡−1𝑥)∘(𝑥⋅𝐻))Algorithm Rev(f(x),n):Input: f∈xC[[x]],f′(0)≠0,n∈N≥2.Output: g(x)modxn such that f(g)≡g(f)≡x(modxn).1t←f′(0)2F(x)←f(t−1x)3∑k=0n−1akyk←PowProj(1,1−y⋅F(x),n,n)4G(x)←∑k=1n−1n−1kakxn−1−k5H(x)←(G(x)1/(n−1))−1modxn−16return ((t−1x)∘(x⋅H))模板([P5809【模板】多项式复合逆](https://www.luogu.com.cn/problem/P5809))
代码相对于原算法作了一些简化及修改,使得代码更短.
---|---
由转置原理导出
Power Projection 问题是 Modular Composition 的转置,Kinoshita 和 Li 指出我们前文的复合算法可以由 Power Projection 算法直接转置得到.同样的,如果优化可以应用于 Power Projection 算法,其也可以应用于 Modular Composition 算法.我们省略细节.
参考文献
- Yasunori Kinoshita, Baitian Li.Power Series Composition in Near-Linear Time. FOCS 2024.
- Alin Bostan, Ryuhei Mori.A Simple and Fast Algorithm for Computing the N-th Term of a Linearly Recurrent Sequence. SOSA 2021: 118-132
- R. P. Brent and H. T. Kung. 1978.Fast Algorithms for Manipulating Formal Power Series. J. ACM 25, 4 (Oct. 1978), 581–595.
- Daniel J. Bernstein. "Fast multiplication and its applications." Pages 325–384 in Algorithmic number theory: lattices, number fields, curves and cryptography, edited by Joe Buhler, Peter Stevenhagen, Cambridge University Press, 2008, ISBN 978-0521808545.
本页面最近更新: 2026/1/7 08:56:54,更新历史 发现错误?想一起完善?在 GitHub 上编辑此页! 本页面贡献者:Tiphereth-A, c-forrest, hly1204 本页面的全部内容在CC BY-SA 4.0 和 SATA 协议之条款下提供,附加条款亦可能应用