FFT算法解析

来源:互联网 发布:mysql定义级联删除 编辑:程序博客网 时间:2024/06/06 17:04

问题描述

两个n次多项式相乘,其时间复杂度为O(n2),通过FFT来减小其问题的复杂度。

分析过程

  1. FFT的基本思路是:我知道一个多项式表达式可以根据其表达式算出结果,同理我们也可以根据其结果算出表达式。
  2. 对于A,B两个n次多项式,一共所有又2n+1个参数需要求解,我们至少需要2n+1个表达式。
    FFT基本步骤:
  3. 选择:选择至少2n+1个点。
  4. 计算:分别计算出A(x0),A(x1),......,A(x2n+1)B(x0),B(x1),......,B(x2n+1),再通过C(xk)=A(xk)B(xk)算出对应的C值。
  5. 通过这些多项式等式求解C相应的系数。
    通过对上面的分析:可以发现第4步的时间复杂度为O(n2),所以得想办法减少其时间复杂度。所以我们对第4步的计算采取分而治之的策略。如下图所示:
    这里写图片描述
    原本需要两个O(n)的时间复杂度,现在一个就可以了。我们要如何构造x值,使得计算复杂度变为nlogn

数学准备

  1. 一个复数可以表示成z=a+bi(这是笛卡尔的坐标表示),变形可以得到z=r(cosθ+isinθ)=reiθ(欧拉公式),所以一个复数可以表示成(r,θ)
  2. 复数相乘(r1,θ1)(r2,θ2)=(r1r2,θ1+θ2)
  3. 任何一个多项式表达式F(x)=F1(x2)+xF2(x2)
  4. 复数的倒数等于复数的负数。

第4步FFT分析

我们选取r=1,分布如下的点进行计算。
这里写图片描述
左边16点的计算;每一条直线的两个点互为相反数,同时他们的平方一样,(1,θ)(1,θ)=(1,θ+π)(1,θ+π)=(1,2θ)。又因为数学准备中第3条性质,所以两个值的计算,可以转化成一个值的计算。从左图变为右图的计算,我们可以发现右图也可以按照上述方法进行化简求解。如此递归下去,直到只要一个点计算(1,0),深度为logn,而每层的计算复杂度不超过O(n),所以总时间复杂度为O(nlogn),通过这样的方法我们就可以求出A,B的所有值,然后就可以计算出C。

第5步FFT分析。

C0C1CjCn=11111wwjw(n1)1w2w2jw2(n1)1wnwj(n1)w(n1)(n1)a0a1ajan

现在已经知道了CM(w),那么a=M(w)1C; 求M(w)1的常规方法也要O(n2),但是M(w)1=1nM(w1),所以可以得到a=1nM(w1)C;由于数学准备中的第4条性质,所以w的取值整体不变,这个不就又可以看出a=C(x),x的取值是w的范围。所以这里再使用一次FFT,不就可以得出a了。所以总的复杂度就变成了nlogn

伪代码

C++代码

原创粉丝点击