1.多项式
1.1定义
对于代数式$F(x)$,可以表示成$F(x)=sum_{i=0}^{+infty}f_i*x^i$则称为多项式。
1.2多项式加/减法
$(A+B)(x)=sum_{i=0}a_i*x^i+sum_{i=0}b_i*x^i=sum_{i=0}(a_i+b_i)*x^i$
$(A-B)(x)=sum_{i=0}a_i*x^i-sum_{i=0}b_i*x^i=sum_{i=0}(a_i-b_i)*x^i$
复杂度$O(n)$。
1.3多项式的表示方法
1.3.1系数表示方法
形如$sum_{i=0}^{n} ai x^{i}$的代数式
1.3.2点值表示方法
对于$k$次多项式,给出在$k+1$个地方的取值,可以唯一确定多项式
证明:考虑这$k+1$个点值相同的一个$k$阶多项式,两个$k$阶多项式相减,得到$k+1$个零点的一个多项式,利用代数基本定理,该多项式为$0$,$k+1$个点值相同的$k$阶多项式是唯一的.
1.3.3点值表示下多项式的运算
多项式加减$O(n)$对应位置点值加减即可
多项式乘法$O(n)$对应位置点值相乘即可
2.多项式乘法
2.1定义
定义$A*B$表示多项式$A$与多项式$B$的乘积,满足$(A*B)(x)=sum_{i=0}x^isum_{j=0}^{i}a_j*b_{i-j}$。
2.2多项式系数点值转化
2.2.1复数
记$i^2=-1$,复数形如$a+bi$
2.2.2复数运算
加法:$(a+bi)+(c+di)=(a+c)+(bi+di)$
减法:$(a+bi)-(c+di)=(a-c)+(bi-di)$
乘法:$(a+bi)(c+di)=(ac-bd)+(ad+bc)i$
2.2.3单位根
复平面中,记$w_n$是幅角最小的$n$次单位根
显然$w_n^{k}$也是$n$次单位根
代数基本定理$x^{n}=1$的解一共有$n$个,所以得到了所有的$n$次单位根
这$n$个$n$次单位根,以原点为圆心,$1$为半径作圆,所得单位圆的$n$个等分点
易知 $w_{n}^{k}=cos(frac{k*2pi}{n})+i sin(frac{k*2pi}{n})$
性质1:$w_{2n}^{2k}=w_{n}^{k}$
性质2:$w_{n}^{k+frac{n}{2}}=-w_{n}^{k}$
2.3快速傅里叶变换(fft)
2.3.1快速傅里叶变换fft
考虑多项式A(x)的点值表示,我们尝试求$A(w_n^0),A(w_n^1),A(w_n^2),...,A(w_n^{n-1})$
设$A(x)=sum_{i=0}^{n-1}aix^i$
下标奇偶分类,写成
$A(x)=sum_{i=0}^{2k}a_ix^i+xsum_{i=0}^{2k}a_{i+1}x^i$
$A1(x)=sum_{i=0}^{k}a_{2i}x^i$ $A2(x)=sum_{i=0}^{k}a_{2i+1}x^i$
则$A(x)=A1(x^2)+xA2(x^2)$
设$k<frac{n}{2}$ 现在要求$A(w_n^k)$
$A(w_n^k)=A1(w_n^{2k})+w_n^{k}$,$A2(w_n^{2k})=A1(w_{frac{n}{2}}^{k})+w_n^{k} A2(w_{frac{n}{2}}^{k})$
$A(w_n^{k+frac{n}{2}})=A1(w_n^{2k+n})+w_n^{k+frac{n}{2}} A2(w_n^{2k+n})=A1(w_{frac{n}{2}}^{k})-w_n^{k} A2(w_{frac{n}{2}}^{k})$
只要知道$A1(x)$,$A2(x)$在$w_{frac{n}{2}}^0$ $w_{frac{n}{2}}^1 ... w_{frac{n}{2}}^{frac{n}{2}-1}$处点值,可$O(n)$推出$A(x)$在$w_n^0...w_n^{n-1}$处点值。
不难发现$A1(x)$,$A2(x)$是递归子问题,递归计算即可。
$T(n)=2T(n/2)+O(n)$,$T(n)=O(n log n)$
2.3.2傅里叶逆变换idft
我们要把点值表示转化成系数表示
设$A(x)=sum_{i=0}^{n-1}aix^i$ 且$yi=A(w_n^i)$ 现在已知$y0,...,y_{n-1}$,想反推$a0,...,a_{n-1}$
设$c_k=sum_{i=0}^{n-1}yi(w_n^{-k})^i$ 即多项式$B(x)=sum_{i=0}^{n-1}y_ix^i$在$w_n^0,w_n^{-1},...,w_n^{-k}$处的点值表示
展开上式可知
$c_k=sum_{i=0}^{n-1}yi(w_n^{-k})^i\=sum_{i=0}^{n-1}(sum_{j=0}^{n-1}aj(w_n^i)^j)(w_n^{-k})^i\=sum_{i=0}^{n-1}(sum_{j=0}^{n-1}aj(w_n^j)^i)(w_n^{-k})^i\=sum_{i=0}^{n-1} sum_{j=0}^{n-1}aj(w_n^{j-k})^i\=sum_{j=0}^{n-1}aj(sum_{i=0}^{n-1}(w_n^{j-k})^i)$
记$S(w_n^k)=sum_{i=0}^{n-1}(w_n^k)^i$
当$k eq0$两边同乘$w_n^k$,$w_n^k S(w_n^k)=sum_{i=1}^{n}(w_n^k)^i$
所以$S(w_n^k)=frac{(w_n^k)^n-1}{w_n^k-1}=0$ 即当$k eq0$,$S(w_n^k)=0$,否则$S(w_n^k)=n$
再看上式$c_k=sum_{j=0}^{n-1}S(w_n^{j-k})=n*a_k$
故用单位根的倒数替代单位根做dft,再把每个数$/n$,即为逆变换结果.
2.3.3本质
向量左乘傅里叶矩阵和傅里叶逆矩阵,傅里叶矩阵和傅里叶逆矩阵有特殊性质.
复杂度$O(n log n)$。
2.3快速数论变换(ntt)
注意到在fft中用到复数域上单位根的性质
如果在取模意义下,可以使用模意义下单位根(设$G$是原根,则$w_n$为$G^{frac{p-1}{n}}$)
复杂度$O(n log n)$。
2.4拆系数fft(mtt)
复杂度$O(n log n)$。
2.5循环卷积
定义$(A*B)_m$为$(A*B)_m(x)=sum_{i=0}x^{imod m}sum_{j=0}^{i}a_j*b_{i-j}$。
2.6Bluestein's Algorithm
考虑如何解决快速计算$m eq 2^k$的多项式$(A*B)_m$。
FFT的本质是通过分治快速计算点值,Bluestein类似。
考虑快速计算$f(w_m^k)$,即dft的过程。
发现$f(w_m^k)=sum_{i=0}^{n}f_i*w_m^{ik}=sum_{i=0}^{n}f_i*w_m^{(_2^{i+k})-(_2^i)-(_2^k)}=w_m^{-(_2^k)}sum_{i=0}^{n}f_i*w_m^{-(_2^i)}*w_m^{(_2^{i+k})}$
利用技巧翻转一下,可以直接ntt处理了。
反之,idft有类似的式子,可以ntt解决。
复杂度$O(n log n)$。
3.其他的多项式基本运算
3.1多项式求导
$(x^i)prime=ix^{i-1}$,$Fprime(x)=sum_{i=0}^{n-1}(i+1)f_{i+1}x^i$
复杂度$O(n)$。
3.2多项式积分
$int(x^i)=frac{x^{i+1}}{i+1}$,$int F(x)=sum_{i=1}^{n+1}frac{f_{i-1}x^{i}}{i}$
复杂度$O(n)$。
3.3多项式求逆
考虑如果已知$mod x^n$的解如何推出$mod x^{2n}$的解:
假设$mod x^n$的解为$G'$,$mod x^{2n}$的解为$G$
显然$G'-G=0(mod x^n)$,
$(G'-G)^2=0(mod x^{2n})$,
$G'^2+G^2-2G'G=0(mod x^{2n})$,
$AG'^2+AG^2-2AG'G=0(mod x^{2n})$,
$ecause AG=1$,
$ herefore AG'^2+G-2G'=0(mod x^{2n})$,
$ herefore G=2G'-AG'^2(mod x^{2n})$.
复杂度$O(n log n)$。
3.4多项式开方
考虑如果已知$mod x^n$的解如何推出$mod x^{2n}$的解:
假设$mod x^n$的解为$G'$,$mod x^{2n}$的解为$G$
$ecause G'-G=0(mod x^n)$,
$ herefore (G'-G)^2=0pmod x^{2n}$,
$ herefore G'^2+G^2-2G'G=0(mod x^{2n})$,
$ecause G^2=A$,
$ herefore G'^2+A-2G'G=0(mod x^{2n})$,
$ herefore G=frac{A+G'^2}{2G'}pmod x^{2n}$.
复杂度$O(n log n)$。
3.5多项式除法/取模
已知函数$F$和$G$,求$Q$和$R$,使得$F=QG+R$
考虑多项式取反:$F_R(x)=x^{Deg(F)}F(frac{1}{x})$。
为了简便,设$n=Deg(F),m=Deg(G)$,那么可知$Deg(Q)=n-m,Deg(R)=m-1$。
$ecause F(x)=G(x)Q(x)+R(x)$
$ herefore F(frac{1}{x})=G(frac{1}{x})Q(frac{1}{x})+R(frac{1}{x})$
$ herefore x^nF(frac{1}{x})=x^nG(frac{1}{x})Q(frac{1}{x})+x^nR(frac{1}{x})$
$ herefore x^nF(frac{1}{x})=x^mG(frac{1}{x})x^{n-m}Q(frac{1}{x})+x^{n-m+1}*x^{m-1}R(frac{1}{x})$
$ herefore F_R(x)=G_R(x)Q_R(x)+x^{n-m+1}*R_R(x)$
$ herefore F_R(x)=G_R(x)Q_R(x)pmod{x^{n-m+1}}$
$ herefore Q_R(x)=F_R(x)G_R^{-1}(x)pmod{x^{n-m+1}}$
多项式求逆即可。至于R,直接$R=F-QG$就可以求出。
复杂度$O(nlog n)$。
4.多项式牛顿迭代
以上的方法有一定的局限性,$A$与$G$的关系要求一定与$(G-G')^2$的展开式的某个组成部分相关从而化简,考虑当没有这种优美性质时的解决方案。
4.1Taylor展开
泰勒展开,$F(x)=F(x_0)+F'(x_0)(x-x_0)+F''(x_0)(x-x_0)^2+cdots$
4.2多项式牛顿迭代
已知$G$,求多项式$F$满足$G(F(x))=0$。
设已知$F_0$满足$G(F_0(x))equiv 0pmod{x^n}$,要求$G(F(x))equiv 0pmod{x^{2n}}$。
函数 $G$ 对 $F$ 进行泰勒展开,得:
$G(F)=G(F_0)+G'(F_0)(F-F_0)+G''(F_0)(F-F_0)^2+cdots$
因为$F-F_0equiv 0pmod{x^n}$,因此$(F-F_0)^kequiv 0pmod{x^{2n}},kgeq 2$。
因此后面几项在$mod x^{2n}$意义下全部为$0$。
所以$G(F)=G(F_0)+Gprime(F_0)(F-F_0)$
所以$F(x)equiv F_0(x)-frac{G(F_0(x))}{Gprime(F_0(x))} pmod {x^{2n}}$
复杂度$O(n log n)$。
4.3多项式ln
定义:$ln(1-x)=-sum_{i=1}^{+infty}frac{x^i}{i}$
$lnprime(F(x))=frac{F'(x)}{F(x)}$
$ln(F(x))=int frac{F'(x)}{F(x)}$
复杂度$O(n log n)$。
4.4多项式exp
定义:$e^x=sum_{i=0}^{+infty}frac{x^i}{i!}$
已知多项式$F$,求$G=exp F$,$F$常数项为$0$
考虑多项式牛顿迭代,有$ln G-F=0$
$G=G_0(1-ln G_0+F)$
复杂度$O(n log n)$。
4.5多项式幂
$F^k=exp(ln(F))^k=exp(kln(F))$
4.6多项式三角函数
Euler公式$e^{i heta} = cos heta + isin heta$
同理:$e^{i(- heta)} = cos(- heta)+isin(- heta) = cos heta -isin heta$
将上面两个式子相加,有$e^{i heta} + e^{-i heta}=2cos heta$
故有$cos heta =frac{e^{i heta} + e^{-i heta}}{2}$
同理$sin heta = frac{e^{i heta} - e^{-i heta}}{2i}$
需要计算$frac{exp left(iF(x) ight) - exp left(-iF(x) ight)}{2i}$,$frac{exp left(iF(x) ight) + exp left(-iF(x) ight)}{2}$
考虑$i^2=-1$,$998244352$是模$998244353$意义下的二次剩余,
因此显然存在i,解得$iequiv 86583718 pmod {998244353}$。
4.7多项式反三角函数
$arcsin x = int frac{1}{sqrt{1-x^2}}$
$arctan x = int frac{1}{1+x^2}$
同理可得:
$arcsin F = int frac{Fprime}{sqrt{1-F^2}}$
$arctan F = int frac{Fprime}{1+F^2}$
5.多项式与分治思想的结合
5.1分治fft
复杂度$O(n log^2 n)$。
5.2cdq分治+fft
复杂度$O(n log^2 n)$。
5.3多项式多点求值
复杂度$O(n log^2 n)$。
5.4拉格朗日插值
复杂度$O(n^2)$。
5.5多项式多点插值
复杂度$O(n log^2 n)$。
6.关于线性递推
6.1BM算法
6.2常系数线性递推
8.集合幂级数的卷积
8.1fwt
8.2fmt
9.斯特林数的快速求解
9.1第一类斯特林数行
复杂度$O(n log n)$。
9.2第一类斯特林数列
复杂度$O(n log n)$。
9.3第二类斯特林数行
复杂度$O(n log n)$。
9.4第二类斯特林数列
复杂度$O(n log n)$。
10.下降幂多项式
10.1普通多项式转下降幂多项式
10.2下降幂多项式转普通多项式
10.3下降幂多项式乘法
11.Amazing Land!
11.1快速阶乘计算
11.2组合数前缀和
11.3阶乘模大质数