zoukankan      html  css  js  c++  java
  • 多项式

    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常系数线性递推

    7.拉格朗日反演

    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阶乘模大质数

  • 相关阅读:
    CCF 201712-4
    图论_最短路径
    图论_查并集
    let和const
    Promise
    实现表单label两端对齐
    始终让footer在底部
    react——使用this.setState({ })修改state状态值
    react——css样式
    react脚手架
  • 原文地址:https://www.cnblogs.com/alonefight/p/11020525.html
Copyright © 2011-2022 走看看