本篇笔记的目的是尽量通过简洁的方式说明FFT算法的过程,各种概念能不用就不用,也不涉及其物理意义,仅仅局限于算法这一块来讨论FFT
求解多项式乘法,那么首先明确,多项式是什么,例如下面一个多项式:
这是一个n-1次多项式(最高次项是
不过无论是哪种形式,一个多项式都可以通过一组系数所确定,而这组系数所组成的向量也叫做系数向量(例如上面
上面简单介绍一下多项式,接下来回到问题:多项式乘法。例如,已知两个多项式
现在将这两个多项式相乘,得到一个最高n+m-1次多项式:
那么要求解
问题是怎么求?如果直接遍历
关于下面这一节介绍的概念,与FFT并没有直接的联系,可以顺带看一下就当是从不同的角度去理解,当然也可以直接跳过去
点值表示法
对于一个已知的多项式
我们知道,通过两个(不同的)点,可以解析一次多项式(如
通过n+1个不同的点
在详细讨论FFT的具体步骤之前,先从整体上概括一下。FFT主要使用了两种数学方法,离散傅里叶变换(DFT)以及离散傅里叶变换逆变换(IDFT),公式如下:
上面两个式子中
回到我们的问题,可以通过设置一些变量,将这两个公式代入到我们之前的问题中。首先,设
其中
将这些变量代入到DFT的公式中,得到:
通过上式将DFT与我们的目标多项式
但是,由于不知道
不过,我们知道:
通过该式计算
N次单位根
为了更好的讨论
关于该公式的证明详见结尾附录,
![28babdbaecb071cb1d39f92bed23820e.png](https://i-blog.csdnimg.cn/blog_migrate/3f3e286ed8e646dd65946bd97c48524c.jpeg)
因为
并且,无论
![07ec7182506dc4653d5f0a337450d7d0.png](https://i-blog.csdnimg.cn/blog_migrate/8a1b98dc35451bc3f14b7d5618eca54e.jpeg)
由于是单位圆,所以
![279b2300960ecbd9dd4aa30dc9962491.png](https://i-blog.csdnimg.cn/blog_migrate/b4c6ad0db875c0e9dd8aae6a7550b036.jpeg)
以上简要的介绍了欧拉公式,下面回到我们定义的变量:
从前面欧拉公式的讨论中可以知道,
![c38f43850230f96dc198d12898de352c.png](https://i-blog.csdnimg.cn/blog_migrate/59e8c83898a08f273554707cc8010e61.jpeg)
上图是一个n=18的例子,并使用大红色标注了三个值
性质一:
性质二:
性质三:
上面的性质一叫做消去引理,性质二叫做折半引理,性质三。。。还没找到名字,希望知道的大佬能告诉一声。这些性质如果光看公式感觉不够直观的话,可以对照前面的那个图例来理解
计算
首先,定义
但是如果直接把
先来看一个栗子,假设有这样一个多项式:
我们可以将它的奇数项与偶数项分开,并化简为下面的形式:
并且
这样时间复杂度就变成了:
除此之外,还可以利用前面讨论的单位根的性质来降低计算量,例如,
这样,仅仅计算
求解
计算到这一步基本已经完成一大半了,只需要使用IDFT公式来求解
上面式子中
所以,最终
上式第二步使用了单位根的性质三,并且特别的交代一下:
总结
- 取N个单位根:
- 将它们分别代入到多项式
中
- 计算
- 构造一个新的多项式
- 计算
- 计算多项式
的系数
附录
- 欧拉公式证明
首先,构造一个函数
一个函数的导数为0,说明这个函数是一个常数函数,所以随便代一个
以上是使用求导的证明方法,简单直接,还有一种方法是使用了
- DFT与IDFT的证明
首先,还是令
为了证明(1)(2)式成立,接下来把它们写成矩阵形式:
其中
结合(3)(4),可以得到:
(5)式说明只要
令
当
而当
综合(7)(8)得到:
(1)(2)式成立,证毕
参考资料:
[1] 算法设计与分析(北京大学)
[2] 从多项式乘法到快速傅里叶变换