FFT(快速傅里叶变换)算法

功能

一次FFT的功能

O ( n log ⁡ n ) O(n\log n) O(nlogn)的时间将一个多项式的系数表达式变成点值表达式(这两种表达方式后文会提到)。

一次IFFT的功能

O ( n log ⁡ n ) O(n\log n) O(nlogn)的时间将一个多项式的点值表达式变成系数表达式(这两种表达方式后文会提到)。

总体功能

O ( n log ⁡ n ) O(n\log n) O(nlogn)的时间求两个多项式的乘积。

一个 n n n项的整式多项式一定可以表示成: f ( x ) = ∑ i = 0 n − 1 ( a i x i ) f(x)=\sum\limits_{i=0}^{n-1}(a_ix^i) f(x)=i=0n1(aixi)
(有些 a i a_i ai可能为 0 0 0

所以,一个系数 a a a的(有序)集合可以唯一确定一个多项式。
例如: a = { 1 , 2 , 0 , 3 , 5 } a=\{1,2,0,3,5\} a={ 1,2,0,3,5}表示的就是多项式: f ( x ) = 1 + 2 x + 3 x 3 + 5 x 4 f(x)=1+2x+3x^3+5x^4 f(x)=1+2x+3x3+5x4
这里 a = { 1 , 2 , 0 , 3 , 5 } a=\{1,2,0,3,5\} a={ 1,2,0,3,5} f ( x ) f(x) f(x)系数表达式

所以,所谓求两个多项式的乘积,就是已知两个多项式的系数表达式,求它们乘积的多项式的系数表达式

前置技能

(既然大家都这样说,我也这样说吧)

多项式的阶

之前说的 f ( x ) = ∑ i = 0 n − 1 ( a i x i ) f(x)=\sum\limits_{i=0}^{n-1}(a_ix^i) f(x)=i=0n1(aixi)中的 n n n就是它的阶,注意 n n n阶多项式不一定是 n n n次的,因为 a n − 1 a_{n-1} an1可能为 0 0 0

多项式的系数表达式

前面已说。

多项式的点值表达式

一个 n n n次多项式就是一个函数,取它图像上的 n + 1 n+1 n+1个不同的点就可以确定这个多项式。

例如 f ( x ) f(x) f(x)是个 4 4 4次多项式,取它的图像上的任意 5 5 5个不同的点: ( x 1 , f ( x 1 ) ) (x_1,f(x_1)) (x1,f(x1)) ( x 2 , f ( x 2 ) ) (x_2,f(x_2)) (x2,f(x2)),…, ( x 5 , f ( x 5 ) ) (x_5,f(x_5)) (x5,f(x5)),可以确定这个多项式的系数,因为可以列出一个 5 5 5元一次方程组解出系数。

于是一个 n n n次多项式的点值表达式就是它的图像上 n + 1 n+1 n+1个不同的点。
换句话说, n + 1 n+1 n+1个不同的点可以唯一确定一个 n n n次多项式。
(以上两句话式FFT和逆FFT的核心)

复数

在实数范围内,老师会告诉你负数没有平方根,所以我们为了让负数有平方根,将数的范围从实数扩展到了复数。
(实数也属于复数,复数另外一部分是虚数)

复数的基本单位

引入一个符号 i i i i 2 = − 1 i^2=-1 i2=1
于是任意一个复数都可以表示成 a + b i a+bi a+bi,其中 a a a b b b都是实数。
例如: x 2 = − 7 x^2=-7 x2=7的根是: x 1 = 7 i x_1=\sqrt 7i x1=7 i x 2 = − 7 i x_2=-\sqrt 7i x2=7 i

复数的运算

加减乘都和整式的运算是一样的,例如两个复数 z 1 = a 1 + b 1 i z_1=a_1+b_1i z1=a1+b1i z 2 = a 2 + b 2 i z_2=a_2+b_2i z2=a2+b2i相乘: z 1 z 2 = ( a 1 + b 1 i ) ( a 2 + b 2 i ) = ( a 1 a 2 − b 1 b 2 ) + ( a 1 b 2 + a 2 b 1 ) i z_1z_2=(a_1+b_1i)(a_2+b_2i)=(a_1a_2-b_1b_2)+(a_1b_2+a_2b_1)i z1z2=(a1+b1i)(a2+b2i)=(a1a2b1b2)+(a1b2+a2b1)i
除法这里不会用到,但也不难,可以分母实数化:

复数的除法
来自百度百科:复数除法

复平面

数轴可以表示一切实数,平面可以表示一切复数:
复平面
(其实这个图没有什么用)
在复平面内的一个点 ( x , y ) (x,y) (x,y)表示一个复数 x + y i x+yi x+yi

复根

定义

定义: ω n k = c o s ( 2 π n k ) + s i n ( 2 π n k ) i \omega_n^k=cos\left(\frac{2\pi}{n}k\right)+sin\left(\frac{2\pi}{n}k\right)i ωnk=cos(n2πk)+sin(n2πk)i
ω n 1 \omega_n^1 ωn1 n n n次单位复根。

很难懂是不是?把 ω 8 0 \omega_8^0 ω80,…, ω 8 7 \omega_8^7 ω87对应的点在复平面上画出来你就知道了。
8次单位复根
(由于几何画板的公式编辑太弱,所以只标了 A B C ABC ABC
A A A B B B C C C…对应的复数分别是 ω 8 0 \omega_8^0 ω80 ω 8 1 \omega_8^1 ω81 ω 8 2 \omega_8^2 ω82,…

为什么?数学必修四的单位圆与三角函数会告诉你的。

几个性质
  • ω n i ω n j = ω n i + j \omega_n^i\omega_n^j=\omega_n^{i+j} ωniωnj=ωni+j

证明:
由于 e i θ = c o s θ + s i n θ ⋅ i e^{i\theta}=cos\theta+sin\theta\cdot i eiθ=cosθ+sinθi(我不会证,貌似要用泰勒展开)
所以 ω n i = e 2 π n i \omega_n^i=e^{\frac{2\pi}{n}i} ωni=en2πi
所以 ω n i ω n j = e 2 π n i e 2 π n j = e 2 π n ( i + j ) = ω n i + j \omega_n^i\omega_n^j=e^{\frac{2\pi}{n}i}e^{\frac{2\pi}{n}j}=e^{\frac{2\pi}{n}(i+j)}=\omega_n^{i+j} ωniωnj=en2πien2πj=en2π(i+j)=ωni+j

  • ω 2 n 2 k = ω n k \omega_{2n}^{2k}=\omega_n^k ω2n2k=ωnk
    理解:它们对应的点是一样的

证明:
ω 2 n 2 k = c o s ( 2 π 2 n 2 k ) + s i n ( 2 π 2 n 2 k ) i = c o s ( 2 π n k ) + s i n ( 2 π n k ) i = ω n k \omega_{2n}^{2k}=cos\left(\frac{2\pi}{2n}2k\right)+sin\left(\frac{2\pi}{2n}2k\right)i=cos\left(\frac{2\pi}{n}k\right)+sin\left(\frac{2\pi}{n}k\right)i=\omega_n^k ω2n2k=cos(2n2π2k)+sin(2n2π2k)i=cos(n2πk)+sin(n2πk)i=ωnk

  • ω n k + n 2 = − ω n k \omega_n^{k+\frac{n}{2}}=-\omega_n^k ωnk+2n=ωnk n n n是偶数)
    理解:它们对应的点关于原点对称。

证明: ω n k + n 2 = c o s ( 2 π n k + π ) + s i n s ( 2 π n k + π ) i = − c o s ( 2 π n k ) − s i n ( 2 π n k ) i = − ω n k \omega_{n}^{k+\frac{n}{2}}=cos\left(\frac{2\pi}{n}k+\pi\right)+sins\left(\frac{2\pi}{n}k+\pi\right)i=-cos\left(\frac{2\pi}{n}k\right)-sin\left(\frac{2\pi}{n}k\right)i=-\omega_n^k ωnk+2n=cos(n2πk+π)+sins(n2πk+π)i=cos(n2πk)sin(n2πk)i=ωnk

  • ω n k + n = ω n k \omega_n^{k+n}=\omega_n^k ωnk+n=ωnk
    理解:转了一圈回到原来的点。

证明:同上一个证明

  • ∑ i = 0 n − 1 ( ω n k ) i = 0 \sum\limits_{i=0}^{n-1}(\omega_n^k)^i=0 i=0n1(ωnk)i=0 k ≠ 0 k\neq 0 k=0)(求和引理)
    理解:每个点和它关于原点对称的点抵消了。

证明:
∑ i = 0 n − 1 ( ω n k ) i = 1 + ω n k + ( ω n k ) 2 + . . . + ( ω n k ) n − 1 = ( ω n k ) n − 1 ω n k − 1 = ω n k n − 1 ω n k − 1 = 1 − 1 ω n k − 1 = 0 \sum\limits_{i=0}^{n-1}(\omega_n^k)^i=1+\omega_n^k+(\omega_n^k)^2+...+(\omega_n^k)^{n-1}=\frac{(\omega_n^k)^n-1}{\omega_n^k-1}=\frac{\omega_n^{kn}-1}{\omega_n^k-1}=\frac{1-1}{\omega_n^k-1}=0 i=0n1(ωnk)i=1+ωnk+(ωnk)2+...+(ωnk)n1=ωnk1(ωnk)n1=ωnk1ωnkn1=ωnk111=0

求多项式乘积的基本步骤

已知 k 1 k_1 k1阶多项式 f ( x ) f(x) f(x) k 2 k_2 k2阶多项式 g ( x ) g(x) g(x)的系数表达式。
我们要求的是 k 1 + k 2 k_1+k_2 k1+k2阶多项式 h ( x ) = f ( x ) ⋅ g ( x ) h(x)=f(x)\cdot g(x) h(x)=f(x)g(x)的系数表达式。

  1. 统一两个多项式的阶数为 n n n,要保证 n n n 2 2 2的幂。(系数补零即可,为什么一会说)
  2. n n n个不同的值 x x x,代入 f ( x ) f(x) f(x) g ( x ) g(x) g(x)中,得到 f ( x ) f(x) f(x) g ( x ) g(x) g(x)的点值表达式: S f ( x ) = { ( x 1 , f ( x 1 ) ) , ( x 2 , f ( x 2 ) ) , . . . , ( x n , f ( x n ) ) } S_{f(x)}=\{(x_1,f(x_1)),(x_2,f(x_2)),...,(x_n,f(x_n))\} Sf(x)={ (x1,f(x1)),(x2,f(x2)),...,(xn,f(xn))} S g ( x ) = { ( x 1 , g ( x 1 ) ) , ( x 2 , g ( x 2 ) ) , . . . , ( x n , g ( x n ) ) } S_{g(x)}=\{(x_1,g(x_1)),(x_2,g(x_2)),...,(x_n,g(x_n))\} Sg(x)={ (x1,g(x1)),(x2,g(x2)),...,(x<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值