FFT(快速傅里叶变换)算法学习笔记

FFT(快速傅里叶变换)算法学习笔记

基本概念

FFT(FastFourierTransformation) 即快速傅里叶变换,是 DFT 的加速算法,利用单位复数根的特殊性质,可以在 Θ(nlogn) 的时间内算出 DFT ,利用相似性可以在同样的复杂度完成逆运算
DFT(DiscreteFourierTransformation) 即离散傅里叶变换,将系数向量转换成单位复数根处点值表示的过程。

在中学数学中,多项式相加的时间复杂度是 O(n) ,相乘复杂度是 O(n2) (即两个表达式各项相乘),FFT算法用来加速多项式乘法,使得多项式乘法可以在 O(nlogn) 的时间复杂度内完成,ACM-ICPC中还有一些构造多项式计数的问题也可以用FFT加速。

数学基础

多项式

一个以 x 为变量的多项式定义在一个代数域 F 上,将行数 A(x) 表示为形式和:

j=0n1ajxj

我们称 aj 为多项式系数, ajF ,典型的 F 就是复数集合 C 。如果一个多项式的最高非零系数是 ak ,,那么成这个多项式的 次数 k ,记做 degree(A)=k ,任何一个严格大于一个多项式次数的整数都是该多项式的 次数界

多项式的表示

系数表达

即常见的表达方式,对于 n1j=0ajxj 而言,其系数表达是一个由系数组成的向量 a=(a0,a1,a2,,an1,an)便 A(x) x_0$处求值,使用秦九韶算法,我们可以在 Θ(n) 的时间复杂度内完成。

A(x0)=a0+x0(a1+x0(a2++x0(an2+x0(an1))))

但考虑多项式乘法时,采用中学时的办法,复杂度达到了 Θ(n2)

点值表达

一个次数界为 n 的多项式 A(n) 点值表达就是一个由 n 个点值对组成的集合

{(x0,y0),(x1,y1),...,(xn1,yn1)}

使得对任意的整数 k=0,1,..n1 各不相同, 且 yk=A(xk)
一个多项式可以有很多不同的点值表达,因为可以采用 n 个不同的点构成的集合作为这种表达的基。

两种表达方式的互相转换

求值(系数表达 点值表达)

一个显然的办法就是,选取 n 个不同的点,依次运用秦九韶算法求出值,时间复杂度为 Θ(n2)
稍后可以得到,如果巧妙选点(即利用单位复数根的特殊性质),可以将复杂度降至 Θ(nlogn)

插值(点值表达 系数表达)

根据算法导论定理30.1(插值的唯一性)证明,当插值多项式的次数界等于已知的点值对的数目,插值才是明确的。

复数相关

单位复数根

n 次单位复数根指的是满足 ωn=1 的所有复数 ω n 次单位复数根刚好有 n 个,他们是 e2kπni , 其中 i 是复数单位, k=0,1,2...n1 ,在复平面上这 n 个根均匀的分布在半径为 1 的圆上,关于复数指数的定义如下:

eui=cos(u)+sin(u)i

其中 ωn=e2iπn 倍称为主 n 次单位根。

消去引理

折半引理

求和引理

FFT、DFT、逆DFT

参考资料

FFT算法学习笔记
算法导论(第二版)

你可能感兴趣的:(ACM,数学)