多项式
FFT
快速傅里叶变换,对于两个多项式的乘法能够做到 \(O(nlogn)\) 的时间复杂度。
引入:单位根
对于所有满足 \(x^n=1\) 的复数解,我们称之为 \(n\) 次单位根。
其几何意义就是在复平面上均匀分布在单位圆(模为1的圆)上,构成正 \(n\) 边形的顶点,其中一个顶点固定为实数1。
欧拉公式:
那么有:
所以这样就可以得到所有单位根的初始项:
这样便可以推出单位圆上上半弧上的单位根,把 \(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\) 的所有幂,也能构成一个群。
我们可以同理的得到它的所有初始项:
思路
与 \(FFT\) 相似
多项式求逆
考虑倍增,有:
只需 $$NTT$$ 即可,时间复杂度 \(O(nlogn)\)。
多项式开根
同样考虑倍增,有:
需要用到求逆,时间复杂度 \(O(nlogn)\) ,常数很大。
多项式除法
\(F\) 除 \(G\) 。
其中 \(F\) 最高次为 \(n\),\(G\) 最高次为 \(m\), \(Q\) 最高次为 \(n-m\),\(F\) 最高次小于 \(m\) 。
对于一个多项式 \(A(x)\) ,我们令 \(A'(x)=x^nA(\frac {1}{x})\)。
有:
通过一个多项式求逆便可以算出 \(Q\) ,然后便可以减出 \(R\)。
常系数齐次线性递推
思路
有特征多项式 \(p\) :
答案初始状态为:
那么 \(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
两边分别求导:
只需要对 \(A\) 求导和求逆,最后将 \(B'\) 积分即可。
时间复杂度:\(O(nlogn)\)。
多项式 exp
考虑牛顿迭代:
时间复杂度:\(O(nlogn)\)。
倍增。
多项式快速幂
由于 \(NTT\) 是循环卷积,所以直接 \(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}\) 。
指数生成函数
对于一个数列 \(<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)\) 表示无向图个数。
有:
\((e^{f(x)}=\sum \frac{f(x)^i}{i!})\)

浙公网安备 33010602011771号