多项式

多项式题单

FFT

快速傅里叶变换,对于两个多项式的乘法能够做到 \(O(nlogn)\) 的时间复杂度。

引入:单位根

对于所有满足 \(x^n=1\) 的复数解,我们称之为 \(n\) 次单位根。
其几何意义就是在复平面上均匀分布在单位圆(模为1的圆)上,构成正 \(n\) 边形的顶点,其中一个顶点固定为实数1。

欧拉公式:

\[e^{ix}=\cos x+i\sin x \]

那么有:

\[e^{i\pi}=1\\ (e^{\frac{i\pi}{k} })^k=1 \]

所以这样就可以得到所有单位根的初始项:

\[w_{2n}=e^{\frac{\pi}{n} }=\cos \frac{\pi}{n}+\sin \frac{\pi}{n} \]

这样便可以推出单位圆上上半弧上的单位根,把 \(i\)\(-1\) 便可以得到下半弧上的单位根。

可以发现前 \(n\) 次单位根可以构成群,对于任意一个单位根的幂,一定也是单位根。

思路

对于两个多项式 \(f(x)\)\(g(x)\) ,需要求 \(h=f\times g\)

整体分成三个步骤:

1.分别求出 \(f(w_i)\)\(g(w_i)\)

2.令 \(h(w_i)\) =\(f(w_i)\times h(w_i)\)

3.求出 \(h\) 的系数

实现 \(FFT\)\(IFFT\)即可。

NTT

引入:原根

原根的性质与单位根类似,对于 \(g\) 的所有幂,也能构成一个群。

我们可以同理的得到它的所有初始项:

\[w_{2n}=g^{\frac {\phi (p) }{2n}} \]

思路

\(FFT\) 相似

多项式求逆

\[A \times B =1(mod\ \ x^n) \]

考虑倍增,有:

\[B_m=B_{2m} (mod\ \ x^{m})\\ B_m-B_{2m}=0 (mod\ \ x^{m})\\ (B_m-B_{2m})^2=0 (mod\ \ x^{2m})\\ B_m^2+B_{2m}^2-2B_mB_{2m}=0 (mod\ \ x^{2m})\\ A(B_m^2+B_{2m}^2-2B_mB_{2m})=0 (mod\ \ x^{2m})\\ AB_m^2+B_{2m}-2B_m=0 (mod\ \ x^{2m})\\ B_{2m}=2B_m-AB_m^2 (mod\ \ x^{2m})\\ B_{2m}=B_m(2-AB_m) (mod\ \ x^{2m})\\ \]

只需 $$NTT$$ 即可,时间复杂度 \(O(nlogn)\)

多项式开根

\[B \times B =A(mod\ \ x^n) \]

同样考虑倍增,有:

\[B_m=B_{2m} (mod\ \ x^{m})\\ B_m-B_{2m}=0 (mod\ \ x^{m})\\ (B_m-B_{2m})^2=0 (mod\ \ x^{2m})\\ B_m^2+B_{2m}^2-2B_mB_{2m}=0 (mod\ \ x^{2m})\\ B_m^2+A-2B_mB_{2m}=0 (mod\ \ x^{2m})\\ B_{2m}=\frac{B_m^2+A}{2B_m} \]

需要用到求逆,时间复杂度 \(O(nlogn)\) ,常数很大。

多项式除法

\(F\)\(G\)

\[F=GQ+R \]

其中 \(F\) 最高次为 \(n\)\(G\) 最高次为 \(m\)\(Q\) 最高次为 \(n-m\)\(F\) 最高次小于 \(m\)

对于一个多项式 \(A(x)\) ,我们令 \(A'(x)=x^nA(\frac {1}{x})\)

有:

\[F(x)=G(x)Q(x)+R(x)\\ F(\frac1x)=G(\frac1x)Q(\frac1x)+R(\frac1x)\\ F'(x){\frac1x}^n=G'(x)Q'(x){\frac1x}^n+R'(x){\frac1x}^{m-1}\\ F'(x)=G'(x)Q'(x)+R'(x)x^{n-m+1}\\ F'(x)=G'(x)Q'(x) (mod\ \ x^{n-m+1})\\ F'(x)G'(x)^{-1}=Q'(x) (mod\ \ x^{n-m+1})\\ \]

通过一个多项式求逆便可以算出 \(Q\) ,然后便可以减出 \(R\)

常系数齐次线性递推

思路

有特征多项式 \(p\) :

\[p(x)=-a_k-a_{k-1}x-...-a_1x^{k-1}+x^k \]

答案初始状态为:

\[f=x^n \]

那么 \(f\%p\) 就能得到第 \(n\) 项所对的前 \(k\) 个初始项的系数。

考虑除特征方程的意义:每次将最高位消除,若当前的最高位 \(x^m\) 的系数为 \(t\) ,那么相当于我会对 \(f\) 减去 \(tx^{m-k}p\) ,此时最高位一定消去,而前 \(k\) 高位加上了 \(t\) 倍的由 \(m\) 位展开的系数,本质上就是将最高位化简。

实现

上述过程中的 \(x^n\) 可以用快速幂实现,每次乘法完都要对 \(p\) 取模,那么多项式的长度是 \(O(k)\),整体复杂度\(O(klogklogn)\)

注意到每次取模的求逆都是 \(p\) ,那么直接提前对 \(p\) 求一次逆就行。

多项式 ln

\[B=ln(A) \]

两边分别求导:

\[B'=\frac {A'}{A} \]

只需要对 \(A\) 求导和求逆,最后将 \(B'\) 积分即可。

时间复杂度:\(O(nlogn)\)

多项式 exp

\[B=exp(A) \]

考虑牛顿迭代:

\[ln(B)=A\\ f=ln(B)-A\\ f'=\frac {1}{B}\\ B_{2m}= B_m-\frac{f}{f'} \\ = B_m-(1-ln(B_m)+A) \]

时间复杂度:\(O(nlogn)\)

倍增。

多项式快速幂

\[B=A^k \]

由于 \(NTT\) 是循环卷积,所以直接 \(k\) 次方空间是存不下,考虑求指:

\[ln(B)=ln(A)k\\ B=exp(ln(A)k) \]

此时 \(A_0=1\) 就已经可以计算了。对于 \(A_0\ne 1\) ,先整体左移去除前导零,在整体除以 \(A_0\),最后在变换回来就行了。

时间复杂度:\(O(nlogn)\)

多项式多点求值

\(x_i\) 处的 \(y_i\)

\(f_{l,r}\) 表示该多项式满足在 \(x_l\)\(x_r\) 处的取值正确,\(g_{l,r}=\sum_{i=l}^{r} (x-x_i)\)

满足 \(f_{l,r}=f_{1,n}\%g_{l,r}\) ,发现对于 \(f\) 的次数等于长度减一。

分治处理,先预处理 \(g\),对于 \([l,r]\) 分成 \([l,mid]\)\([mid+1,r]\) ,将两个小区间分别模对应的 \(g\) 值,答案为长度为一的区间的常数项。

时间复杂度:\(O(nlog^2n)\)

多项式快速插值

给定 \(x_i\) 处的 \(y_i\) ,求原多项式。

与求值同样的设法。

尝试从下往上合并 \(f\)\(f= f_L\times g_R+f_R\times g_L\) ,这样满足了两边的 \(f\) 的值不会互相影响。但是发现可能会影响它原本的值,详细地说,对于 \(i\) ,它额外乘上了 \(\Pi_{j=1,j\ne i}^n(x_i-x_j)\) ,我们可以在最底层提前除以这个值。

那么现在的问题就是如何快速计算额外乘的东西。

令 $t_i=\Pi_{j=1,j\ne i}^n(x_i-x_j) $

转化可得 $t=\sum_{i=1}^n\Pi_{j=1,j\ne i}^n(x_i-x_j) $。然后发现它就是 \(g'\),所以对 \(g\) 的导数求一个多点求值,预处理出每个位置需要除的量。

时间复杂度:\(O(nlog^2n)\)

普通生成函数

对于函数 \(f_i\) ,其普通生成函数为 \(F=\sum f_ix^i\)

函数之间的运算可以通过生成函数转化成多项式的运算,比如一个普通的自转移 \(f_i=\sum f_j g_{i-j}\) ,变为多项式即为 \(F=FG\) ,就有 \(F=\frac{1}{1-G}\)

指数生成函数

EGF

对于一个数列 \(<f_n>\)
,定义其指数型生成函数(EGF) $ \hat F(x)=\sum \frac {f_ix^i}{i!}$ 。

根据定义可得:

对于三个数列 \(f,g,h\) 若有 \(f_n=\sum_{i+j=n} (^n_i) g_i h_j\) ,则有 \(\hat f=\hat g \times \hat h\) ,也就说能快速计算二项式卷积。

有标号无向连通图计数

我们令 \(f(x)\) 表示 \(x\) 个点的无向连通图的个数,\(g_k(x)\) 表示 \(x\) 个点中存在 \(k\) 个联通块的方案个数,\(g(x)\) 表示无向图个数。

有:

\[g_k(n)=\frac{n!}{k!} \sum _{\sum p_i=n} \Pi \frac{f(p_i)}{p_i!} \\ \hat g_k=\frac{\hat f^k}{k!}\\ \hat g=\sum \hat g_k=\sum \frac{\hat f^k}{k!}=exp(\hat f)\\ ln(\hat g)=\hat f \]

\((e^{f(x)}=\sum \frac{f(x)^i}{i!})\)

posted @ 2025-11-21 10:20  liduoduo2021  阅读(28)  评论(0)    收藏  举报