文章目录
功能
一次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=0∑n−1(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=0∑n−1(aixi)中的 n n n就是它的阶,注意 n n n阶多项式不一定是 n n n次的,因为 a n − 1 a_{n-1} an−1可能为 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=7i, x 2 = − 7 i x_2=-\sqrt 7i x2=−7i。
复数的运算
加减乘都和整式的运算是一样的,例如两个复数 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)=(a1a2−b1b2)+(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对应的点在复平面上画出来你就知道了。
(由于几何画板的公式编辑太弱,所以只标了 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=0∑n−1(ω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=0∑n−1(ωnk)i=1+ωnk+(ωnk)2+...+(ωnk)n−1=ωnk−1(ωnk)n−1=ωnk−1ωnkn−1=ωnk−11−1=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)的系数表达式。
- 统一两个多项式的阶数为 n n n,要保证 n n n是 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<