多项式全家桶(长期更新)

更新日志:

24.7.25:更新了暴力多项式全家桶部分。
24.7.27:更新了单位根性质、\(\mathrm{FFT}\)以及\(\mathrm{NTT}\)部分。
24.7.29:更新了导数部分。
24.8.5:更新了积分,泰勒展开,快速多项式全家桶,常系数齐次线性递推以及Lagrange插值部分。
25.2.11:挖了更多的坑,加入了多项式全家桶的部分封装代码。

Code:

Polynomial

前言

若无特殊说明,默认运算在\(\pmod {x^n}\)\(\pmod p \text{(} p \text{为质数)}\)意义下进行,大写字母为多项式(如\(F(x)\)),小写字母为系数(如\(f_i\))。

暴力多项式全家桶

暴力多项式全家桶

FFT和NTT

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:

显然矩乘加速过不了。

以斐波那契数列为例找找规律:

\[\begin{aligned} a_5&=a_4+a_3\\ &=2a_3+a_2\\ &=3a_2+2a_1\\ &=5a_1+3a_0\\ \end{aligned} \]

我们每次考虑将下标最大的一项换成下标更小的项,注意到这个形式与多项式取模类似。

更一般地,对于递推式\(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)\)

FWT与子集卷积

FWT和子集卷积

posted @ 2024-07-25 17:27  RandomShuffle  阅读(244)  评论(4)    收藏  举报