文章目录
前言
最近学会了FFT,一个极其美妙的算法!
众所周知FFT英文全称是 Fast Fast TLE Fast Fourier Transform
FFT是什么?
FFT(快速傅里叶变换)是DFT(离散傅里叶变换)的优化,用于加速多项式乘法。
即:
设 F ( x ) = ∑ i = 0 n f i x i F(x)=\sum_{i=0}^nf_ix^i F(x)=∑i=0nfixi , G ( x ) = ∑ i = 0 n g i x i G(x)=\sum_{i=0}^ng_ix^i G(x)=∑i=0ngixi
求 F ( x ) G ( x ) F(x)G(x) F(x)G(x)
多项式表示法
系数表示法
系数表示法是大家最常见的一种表示多项式的方法。
比如 F ( x ) = ∑ i = 0 n f i x i F(x)=\sum_{i=0}^nf_ix^i F(x)=∑i=0nfixi
那么这个多项式我们就可以用 { f 0 , f 1 , . . . , f n } \{f_0,f_1,...,f_n\} {
f0,f1,...,fn} 这些系数表示。
普通的暴力多项式乘法也是基于这种系数表示法上的。
点值表示法
先抛出个定理: n + 1 n+1 n+1 个不同的点能够确定一个次数为 n n n的多项式
我也不会证
我们把多项式放到平面直角坐标系中就是个函数了。
那这个多项式 F ( x ) F(x) F(x) 就可以表示为 { ( x 0 , f ( x 0 ) ) , ( x 1 , f ( x 1 ) ) , . . . , ( x n , f ( x n ) ) } \{(x_0,f(x_0)),(x_1,f(x_1)),...,(x_n,f(x_n))\} {
(x0,f(x0)),(x1,f(x1)),...,(xn,f(xn))}
对于两个函数 F ( x ) = { ( x 0 , f ( x 0 ) ) , ( x 1 , f ( x 1 ) ) , . . . , ( x n , f ( x n ) ) } F(x)=\{(x_0,f(x_0)),(x_1,f(x_1)),...,(x_n,f(x_n))\} F(x)={ (x0,f(x0)),(x1,f(x1)),...,(xn,f(xn))} 和 G ( x ) = { ( x 0 , g ( x 0 ) ) , ( x 1 , g ( x 1 ) ) , . . . , ( x n , g ( x n ) ) } G(x)=\{(x_0,g(x_0)),(x_1,g(x_1)),...,(x_n,g(x_n))\} G(x)={ (x0,g(x0)),(x1,g(x1)),...,(xn,g(xn))} 的乘积等于 { ( x 0 , f ( x 0 ) g ( x 0 ) ) , ( x 1 , f ( x 1 ) g ( x 1 ) ) , . . . , ( x n , f ( x n ) g ( x n ) ) } \{(x_0,f(x_0)g(x_0)),(x_1,f(x_1)g(x_1)),...,(x_n,f(x_n)g(x_n))\} { (x