多项式复合与复合逆之新科技

· · 算法·理论

简介

noshi91 提供了一个新 trick [1],降低了很多经典问题的复杂度,并且该算法是 practical 的,好写又快。

原算法

考虑对于形式幂级数 f,如何求 [x^k] f^0,[x^k]f^1,\ldots [x^k] f^{n-1}.

考虑二元形式幂级数

[x^k]\frac{1}{1- y f}=[x^k]\sum_k y^k f^k=\sum_k y^k [x^k]f^k,

实际上只需要求出 [x^k]\frac{1}{1-yf} 即可。

使用 Bostan-Mori 算法。即对于

[x^k]\frac{f(x,y)}{g(x,y)},

每次将分子分母乘上 g(-x,y), 变成

[x^k]\frac{f(x,y)g(-x,y)}{g(x,y)g(-x,y)},

此时 g(x,y)g(-x,y) 没有 x 的奇数次项,可以写成 h(x^2,y), 至于分子可以分离其奇偶次项,得到 f(x,y)g(-x,y)=a(x^2,y)+xb(x^2,y).

那么就是求

[x^k] \frac{a(x^2,y)}{h(x^2,y)}+ x \frac{b(x^2,y)}{h(x^2,y)}.

k 是奇数,则只有前一项有用,若 k 是偶数,则只有前一项有用。此时只保留这一项,那么就相当于求

[x^{k/2}]\frac{a(x,y)}{h(x,y)}, [x^{(k-1)/2}] \frac{b(x,y)}{h(x,y)}

中的某一个。

不断递归,直到 k=0, 此时即求 \frac{f(0,y)}{g(0,y)}.

考虑分析过程中多项式次数。每次 x 需要保留的次数减半(因为只需要求到 k/2 次项),而 y 的次数至多加倍。所以过程中 x,y 次数的乘积永远是 O(n) 的。

使用二元 FFT 等计算卷积,一轮复杂度 O(n\log n),总复杂度 O(n\log^2n).

多项式复合——转置原理

多项式复合可以写成

f_j=\sum_{i=0}^{n-1} g_i [x^j]h^i.

利用转置原理,其转置问题即

g_i=\sum_{j=0}^{n-1} f_j [x^j]h^i.

若令 F(x)=\sum_{i=0}^{n-1} x^i f_{n-1-i}, 那么

g_i=\sum_{j=0}^{n-1} [x^{n-1-j}] F [x^j]h^i=[x^{n-1}] F h^i.

所以即求 BGF

[x^{n-1}]\frac{F}{1-y h}

利用前面介绍的做法,即 O(n\log^2n) 解决。

多项式复合逆——牛顿迭代

通过多项式复合,可以立刻通过牛顿迭代求复合逆。

具体来讲,若 F(G(x))=x,而 F(G_i(x))\equiv x \pmod {x^i},那么

x=F(G(x))\equiv F(G_i(x))+ F'(G_i(x))(G(x)-G_i(x)) \pmod{x^{2i}}.

通过多项式复合,每次精度翻倍,复杂度

T(n)=T(n/2)+O(n\log^2n)=O(n\log^2n).

多项式复合逆——拉格朗日反演

也可以通过拉格朗日反演直接得到复合逆。根据 [2],

[x^k] F^i=\frac{i}k [x^{k-i}] \left(\frac{G}{x}\right)^{-k}.

左侧直接利用之前介绍的方法求得,那么即求出了 \left(\frac{G}{x}\right)^{-k},就可以解出来 G 了。

实现

应用

已经不管我的事了,我已经退役了

列欧拉数直接就是多项式复合。现在可以 practical 地求了。

后面的忘了。

参考文献

  1. 原作者: https://noshi91.hatenablog.com/entry/2024/03/16/224034
  2. https://codeforces.com/blog/entry/77551