• 【learning】多项式开根详解+模板


    概述

    多项式开跟是一个非常重要的知识点,许多多项式题目都要用到这一算法。

    用快速数论变换,多项式求逆元和倍增法可以在$O(n log n)$的时间复杂度下求出一个$n$次多项式的开根。

     

    前置技能

    快速数论变换(NTT),多项式求逆元,二次剩余。

     

    多项式的开根

    给定一个多项式$A(x)$,其次数为$deg_A$,若存在一个多项式$B(x)$,使其满足$deg_B≤deg_A$,且$ B^2(x) equiv A(x) (mod x^n)$,则$B(x)$即为$A(x)$在模$x^n$意义下的的开根。

     

    求多项式的开根

    我们不妨假设,$n=2^k,k∈N$。

    若$n=1$,则$b_0^2 equiv a_0(mod x)$。其中$a_0$,$b_0$表示多项式$A$和多项式$B$的常数项。

    若需要求出$b_0$,直接用二次剩余求出即可。(不过由于大部分题目公式特别优美,常数项通常为0)

    当$n>1$时:

    我们假设在模$x^{frac{n}{2}}$的意义下$A(x)$的开根$B'(x)$我们已经求得。

    依据定义,则有

    $B^2(x)equiv A(x) (mod x^{n})$          $(1)$

    因为多项式$B'(x)$满足

    $B'^2(x)equiv A(x) (mod x^{frac{n}{2}})$          $(2)$

    将$(1)-(2)$,得

    $B^2(x)-B'^2(x)equiv 0(mod x^{frac{n}{2}})$          $(3)$

    我们用平方差公式将$(3)$展开

    $(B(x)+B'(x))(B(x)-B'(x))equiv 0(mod x^{frac{n}{2}})$          $(4)$

    然后我们会发现多项式$B(x)$有两个解,下面考虑其中一种情况

    $B(x)-B'(x)equiv 0(mod x^{frac{n}{2}})$          $(5)$

    我们将$(5)$式同余符号两边平方,得

    $B^2(x)-2B(x)B'(x)+B'^2(x)equiv 0(mod x^n)$          $(6)$

    考虑到式$(1)$,我们将式$(1)$代入式$(6)$,得

    $A(x)-2B(x)B'(x)+B'^2(x)equiv 0(mod x^n)$          $(7)$

    最后对式 $(7)$进行移项,得到

    $B(x)equiv dfrac{A(x)+B'^2(x)}{2B'(x)} (mod x^n)$          $(8)$

    显然,我们可以用上述式子,通过倍增,求出n次项的$B(x)$。

    这一步的计算我们可以使用多项式求逆元和$NTT$,时间复杂度为$O(n log n)$。

    我们可以通过递归的方法,求解出最终的$N$次项的$B(x)$

    时间复杂度$T(n)=T(dfrac{n}{2})+O(n log n)=O(n log n)$。

     

    模板如下:(暂时还没有)

  • 相关阅读:
    LCT男人八题系列
    hadoop 伪分布启动-fs格式化
    hadoop 安装
    Scala Actor入门
    Scala 隐式转换和隐式参数
    Scala 类型参数
    Scala 类型参数
    Scala 匹配模式
    scala 函数式编程之集合操作
    Scala 函数式编程
  • 原文地址:https://www.cnblogs.com/xiefengze1/p/9373272.html
Copyright © 2020-2023  润新知