多项式相关

引用

从多项式乘法到快速傅里叶变换
【快速傅里叶变换】【FFT】

准备知识

多项式表达

对于一个多项式我们可以写成系数表达和点值表达
对于多项式 f(x)=i=ni=0aixi
n+1,n

  1. 系数表达
    写成 n+1 维向量形式 a⃗ =(a0,a1,,an)
  2. 点值表达
    我们要选取任意 n+1 个点值 x0,,xn 求出它的 f(xi) ,得到 {(xi,f(xi)):0<=i<=n,iZ}
    n+1 个点值可以任意选取, FFT 的高效性也是因为这 n+1 个点的特殊选取
  3. 卷积运算
    • 点值表达有什么优越性?
    • 对于两个多项式,我们分别得到了他们的点值表达,我们就能将两个点值表达式相乘(不足的位也要算出来) O(N) 时间得到两个多项式乘积的多项式的点值表达式
      这个乘积运算就是卷积
      我们举个例子来看
      A(x)=x2+2x1     {(0,1),(1,2),(2,7),(3,14),(4,23)}
      B(x)=x2x+2       {(0,2),(1,2),(2,4),(3,8),(4,14)}
      C(x)=x4+x3x2+5x2    {(0,2),(1,4),(2,28),(3,112),(4,322)}
  4. 复数
    • n 次单位复根:满足 ωn=1 的复根,记为 ωin
    • 复数可以直观理解为旋转,即将平面上以原点为圆心的圆分成 n 份, n 次单位复根分布在单位半径的圆周上
    • n 次单位复根为 {ω0n,ω1n,,ωn1n}
    • 其实我们只要知道单位复根的性质即可
    • ωin=ωi1nω1n
    • ω0n=ωnn=1ωinωjn=ωj+kn=ω(j+k)mod  nnω1n=ωn1n   ωjn=ωn+jn
    • :ωdidn=ωin   ωn2n=ω12=1   (ωin)2=ωin2:nn>0,(ωi+n2n)2=(ωin)2                :(ωi+n2n)2=ω2i+nn=ω2inωnn=ω2in=(ωin)2
    • :n>=1ni,n1j=0(ωin)j=0:n1j=0(ωin)j=(ωin)n1ωin1=0ni,0

多项式乘法

对于多项式 f(x)=i=ni=0aixi
n+1,n

朴素暴力

用系数表达法 O(N2) 的时间复杂度来计算

利用点值表达优化

利用得到的点值表达 O(N) 计算
虽然我们求出两个多项式的点值时间复杂度为 O(N2) 与暴力并没有很大差异,但这给我们一些启发
根据以上我们得到求多项式乘法的方向
多项式相关_第1张图片

FFT

我们用 FFT 来优化求出多项式点值表达的过程
我们现在有多项式 A(x)=i=n1i=0aixi
n=2t(ai=0),tZ
我们按照指数的奇偶将多项式分类
我们用 A(ωmn) 中偶数下标的系数和奇数下标的系数定义两个次数界为 n21 的多项式 A0(ωmn)A1(ωmn)

A0(ωmn)=a0+a2ωmn++an2(ωmn)n21A1(ωmn)=a1+a3ωmn++an1(ωmn)n21

我们用这两个多项式来表达原多项式 A(ωmn)
A(ωmn)==A0((ωmn)2)+ωmnA1((ωmn)2)A0(ωmn2)+ωmnA1(ωmn2)

根据折半引理我们有下式
A(ωm+n2n)===A0((ωm+n2n)2)+ωm+n2nA1((ωm+n2n)2)A0((ωmn)2)+ωm+n2nA1((ωmn)2)A0(ωmn2)ωmnA1(ωmn2)

A(ωmn)A(ωm+n2n) 其实是由同样的两个多项式的点值表达得到的,问题的规模每次除以2,根据主定理它的时间复杂度从 O(N2) 降到了 O(NlogN)

你可能感兴趣的:(多项式相关)