多项式全家桶(长期更新)
更新日志:
24.7.25:更新了暴力多项式全家桶部分。
24.7.27:更新了单位根性质、\(\mathrm{FFT}\)以及\(\mathrm{NTT}\)部分。
24.7.29:更新了导数部分。
24.8.5:更新了积分,泰勒展开,快速多项式全家桶,常系数齐次线性递推以及Lagrange插值部分。
25.2.11:挖了更多的坑,加入了多项式全家桶的部分封装代码。
Code:
前言
若无特殊说明,默认运算在\(\pmod {x^n}\)或\(\pmod p \text{(} p \text{为质数)}\)意义下进行,大写字母为多项式(如\(F(x)\)),小写字母为系数(如\(f_i\))。
暴力多项式全家桶
FFT和NTT
快速多项式全家桶
分治FFT
多项式多点求值
多项式快速插值
多项式平移
多项式连续点值平移
常系数齐次线性递推
\(a_i=\sum\limits_{j=1}^kf_ja_{i-j}\)
已知\(\{f_i\},k,n,a_{0\dots k-1}\),求\(a_n\)。
\(n\le 10^9,k\le 32000\)
Sol:
显然矩乘加速过不了。
以斐波那契数列为例找找规律:
我们每次考虑将下标最大的一项换成下标更小的项,注意到这个形式与多项式取模类似。
更一般地,对于递推式\(a_i=\sum\limits_{j=1}^kf_ja_{i-j}\),可以构造多项式\(G(x)=\sum\limits_{i\ge 0}f_{i+1}x^i\)(\(f_{k+1}=1,f_m=0\text{ (m>k+1)}\))和\(F(x)=x^n\),\(F(x)\bmod G(x)\)的各项系数即将\(a_n\)拆分为初始项后各项的系数。
再看上面的例子,\(F(x)=x^5,G(x)=x^2-x-1\)。
所以\(F(x)\bmod G(x)=5x+3\)
即\(a_5=5a_1+3a_0\)
更严谨的证明:
定义\(F(\sum f_ix^i)=\sum f_ia_i\),那么答案就是\(F(x^n)\)。
由于\(a_i=\sum\limits_{j=1}^kf_ja_{i-j}\),所以\(F(x^n)=F(\sum\limits_{i=1}^kf_ix^{n-i})\)
所以\(F(x^n-\sum\limits_{i=1}^kf_ix^{n-i})=F(x^{n-k}(x^k-\sum\limits_{i=0}^{k-1}f_{k-i}x^i))=0\)
设\(G(x)=x^k-\sum\limits_{i=0}^{k-1}f_{k-i}x^i\)。
那么\(F(A(x)+x^mG(x))=F(A(x))+F(x^mG(x))=F(A(x))\)
所以\(A(x)\)可以通过多次加减\(x^mG(x)\)的倍数来降次。
也就是求\(F(A(x)\bmod G(x))\)。\(A(x)\bmod G(x)\)的次数小于\(k\),而\(a_{0\dots k-1}\)已经给出,就可以用多项式取模算了。
\(O(k\log k\log n)\)。

浙公网安备 33010602011771号