zoukankan      html  css  js  c++  java
  • [模板] 多项式全家桶

    注意:以下所有说明均以帮助理解模板为目的,不保证正确性。

     一些坑点:fft的范围,数组是否清空,模x的多少次方(同一个式子里一定要都是模同一个$x^n$意义下的多项式)

    多项式求逆

    已知$A(x)$,求满足$A(x)B(x)=1 (mod x^n)$的B(以下为了方便假设n是2的幂)

    考虑倍增,假设已经求出$A(x)B_0(x)=1 (mod x^{n/2})$

    $$A(x)(B(x)-B_0(x))=0 (mod x^{n/2})$$

    $$(B(x)-B_0(x))=0 (mod x^{n/2})$$

    $$(B(x)-B_0(x))^2=0 (mod x^n)$$

    $$B^2(x)-2B(x)B_0(x)+B_0^2(x)=0 (mod x^n)$$

    同乘个A,$$B(x)-2B_0(x)+A(x)B_0^2(x)=0 (mod x^n)$$

    $$B(x)=2B_0(x)-A(x)B_0^2(x) (mod x^n)$$

    复杂度$T(n)=T(n/2)+O(nlogn)=O(nlogn)$

    多项式除法

    已知$A(x)$,$B(x)$,求满足$A(x)=R(x)B(x)+Q(x)$的$R(x)$,$Q(x)$,其中若A为n次,B为m次,则R为n-m次,Q为m-1次

    首先考虑一种操作:把$F(x)$变成$x^nF(frac{1}{x})$,等价于把F(x)的系数翻转,记做$F_R(x)$

    于是有$$x^nA(x)=x^{n-m}R(x)x^{m}B(x)+x^{n-m+1}x^{m-1}Q(x)$$

    $$A_R(x)=R_R(x)B_R(x)+x^{n-m+1}Q_R(x)$$

    把它放到$mod x^{n-m+1}$下,可以发现$Q(x)$消失了,而且对$R(x)$没有影响

    于是有$R_R(x)=frac{A_R(x)}{B_R(x)} (mod x^{n-m+1})$

    所以$R(x)$就可以求了,然后$Q(x)=A(x)-R(x)B(x)$,也可以求了

    复杂度$O(nlogn)$

    牛顿迭代法

    已知$G(f)$,求$G(F(x))=0 (mod x^n)$的一个解$F(x)$(以下为了方便假设n是2的幂)

    假设已经求出了$G(F_0(x))=0 (mod x^{n/2})$

    我们在$F_0(x)$处对$G$进行泰勒展开,有

    $$G(F(x))=G(F_0(x))+frac{G^{(1)}(F_0(x))}{1!}(F(x)-F_0(x))+frac{G^{(2)}(F_0(x))}{2!}(F(x)-F_0(x))^2+... (mod x^n)$$

    然后我们发现,因为$F_0$和$F$前$frac{n}{2}$项相同,所以$(F(x)-F_0(x))^2=0 (mod x^n)$

    所以有$$G(F(x))=G(F_0(x))+G'(F_0(x))(F(x)-F_0(x))=0 (mod x^n)$$

    $$F(x)=F_0(x)-frac{G(F_0(x))}{G'(F_0(x))} (mod x^n)$$


    于是就可以倍增来求F(x)了

    多项式开根

    已知$G(H(x))=H^2(x)-F(x)$,求使$G(H(x))=0 (mod x^n)$的一个解

    根据上面牛顿迭代法的式子可得$H(x)=frac{H_0^2(x)+F(x)}{2H_0(x)} (mod x^n)$,倍增即可

    复杂度$T(n)=T(n/2)+O(nlogn)=O(nlogn)$

    多项式求导/积分

    就是普通的函数求导和积分

    复杂度$O(n)$(积分不预处理逆元是$O(nlogn)$)

    多项式ln

    已知$F(x)$,求$G(x)$满足$G(x)=ln(F(x)) (mod x^n)$

    两边求导,$G'(x)=frac{F'(x)}{F(x)} (mod x^n)$

    然后再对$G'(x)$积分一下就行了

    复杂度$O(nlogn)$

    多项式exp

    已知$F(x)$,求$G(x)$满足$G(x)=e^{F(x)} (mod x^n)$

    考虑牛顿迭代。首先两边取ln,$lnG(x)=F(x)$

    设$H(G(x))=lnG(x)-F(x)$,有

    $$G(x)=G_0(x)-frac{H(G_0(x))}{H'(G_0(x))} (mod x^n)$$

    $$G(x)=G_0(x)-frac{lnG_0(x)-F(x)}{frac{1}{G_0(x))}} (mod x^n)$$ (注意这里的F(x)是常数,所以求完导就没了)

    $$G(x)=G_0(x)-G_0(x)lnG_0(x)+G_0(x)F(x) (mod x^n)$$

    倍增即可,复杂度$T(n)=T(n/2)+O(nlogn)=O(nlogn)$

    多项式快速幂

    已知$F(x)$,求$G(x)$满足$G(x)=F^k(x) (mod x^n)$

    两边取ln,$ln(G(x))=klnF(x)$

    所以$G(x)=e^{klnF(x)}$

    复杂度$O(nlogn)$

    多点求值

    考虑$G(x)=F(x)\%(x-x_0)$,那么$G(x)=F(x)$(因为$F(x_0)-G(x_0)=k(x_0-x_0)=0$)

    利用这个性质,用分治来减小问题规模

    假设现在在对$A(x)$算$x_l$~$x_r$的值,那我们设

    $$A_0(x)=A(x)\%(prodlimits_{i=l}^{mid}{(x-x_i)}),A_1(x)=A(x)\%(prodlimits_{i=mid+1}^{r}{(x-x_i)})$$

    那么再对$A_0(x)$求$x_l$~$x_{mid}$,对$A_1(x)$求$x_{mid+1}$~$x_r$即可。此时多项式的项数和要求的个数都缩小了一半

    $prod{(x-x_i)}$可以分治来预处理,可以仿照线段树的写法方便存储

    要注意的是一开始需要先对$prodlimits_{i=1}^{m}{(x-x_i)}$取一下模,以便于无论什么情况算到最后都只剩下常数

    以及实现多项式除法取模的时候要特判$n<m$的情况

    复杂度$T(n)=2T(n/2)+O(nlogn)=O(nlog^2n)$

    快速插值

    考虑拉格朗日插值$sumlimits_i{y_iprodlimits_{j eq i}{frac{x-x_j}{x_i-x_j}}}$

    我们设$f(x)=prod{(x-x_i)}$,考虑求出$limlimits_{x o x_i}frac{f(x)}{x-x_i}$

    使用洛必达法则,就变成了$f'(x_i)$,所以可以用多点求值算出所有的$f'(x_i)$

    然后式子就变成了$sumlimits_i{frac{y_i}{f'(x_i)}prodlimits_{j eq i}{(x-x_j)}}$

    考虑分治来求,设$A_0(x)$是$i$和$j$在$l$~$mid$范围内枚举的值,$A_1(x)$是$mid+1$~$r$的

    那$l$~$r$范围内的其实就是$A_0(x)prodlimits_{j=mid+1}^{r}{(x-x_j)}+A_1(x)prodlimits_{j=l}^{mid}{(x-x_j)}$

    同样分治来预处理$prod{(x-x_i)}$即可(多点求值的时候就不用再算一遍了)

    复杂度$T(n)=2T(n/2)+O(nlogn)=O(nlog^2n)$

  • 相关阅读:
    thinkphp简洁、美观、靠谱的分页类
    查询文章的上下篇Sql语句
    人类阅读的优越方式打印php数组
    弹出遮罩层后,如何禁止底层页面的滚动
    解决PHP Redis扩展无法加载的问题(zend_new_interned_string in Unknown on line 0)
    PHP Warning: PHP Startup: redis: Unable to initialize module Windows版本phpredis扩展
    带你使用JS-SDK自定义微信分享效果
    lnmp环境切换php版本,并安装相应redis扩展
    最新git源码下载地址
    微信小程序之发送模板消息(通过openid推送消息给用户)
  • 原文地址:https://www.cnblogs.com/Ressed/p/11161918.html
Copyright © 2011-2022 走看看