多项式、卷积和快速傅里叶变换

多项式运算

n n n次多项式加法耗费的时间是 o ( n ) o(n) o(n)。直接的 n n n次多项式相乘消耗的时间是 o ( n 2 ) o(n^2) o(n2) A ( x ) = ∑ j = 0 n − 1 a j x j A(x)=\sum_{j=0}^{n-1}a_jx^j A(x)=j=0n1ajxj, B ( x ) = ∑ j = 0 n − 1 b j x j B(x)=\sum_{j=0}^{n-1}b_jx^j B(x)=j=0n1bjxj,
C ( x ) = ∑ j = 0 2 n − 2 c j x j , c j = ∑ k = 0 j a k b j − k C(x)=\sum_{j=0}^{2n-2}c_jx^j,c_j=\sum_{k=0}^{j}a_kb_{j-k} C(x)=j=02n2cjxj,cj=k=0jakbjk
而快速傅里叶变换(FFT)可以将多项式的乘法运算降低到 O ( n l g n ) O(nlgn) O(nlgn)
F ( ω ) = ∫ − ∞ + ∞ e i ω t s ( t ) d t , S ( f ) = ∫ − ∞ + ∞ e − i 2 π f t s ( t ) d t F(\omega)=\int_{-\infty}^{+\infty}e^{i\omega t}s(t)dt,S(f)=\int_{-\infty}^{+\infty}e^{-i2\pi ft}s(t)dt F(ω)=+eiωts(t)dtS(f)=+ei2πfts(t)dt

多项式的表达

系数表示、点值表示。
系数表示
A ( x ) = ∑ j = 0 n − 1 a j x j A(x)=\sum_{j=0}^{n-1}a_jx^j A(x)=j=0n1ajxj
A ( x 0 ) = a 0 + x 0 ( a 1 + x 0 ( a 2 + ⋅ ⋅ ⋅ + x 0 ( a n − 2 + x 0 ( a n − 1 ) ) ) ) A(x_0 ) = a_0 +x_0 (a_1 +x_0 (a_2 + ··· +x_0 (a_{n-2} +x_0 (a_{n-1} )))) A(x0)=a0+x0(a1+x0(a2++x0(an2+x0(an1))))
点值表示
( x 0 , y 0 ) , ( x 1 , y 1 ) , ⋅ ⋅ ⋅ , ( x n − 1 , y n − 1 ) {(x_0 , y_0 ), (x_1 , y_1 ), ···, (x_{n-1} , y_{n-1})} (x0,y0),(x1,y1),,(xn1,yn1) n n n个点唯一地表示一个多项式。
从系数表示到点值表示只需要计算 n n n个点即可,如果选取的点合理,耗费的时间只需要 O ( n l g n ) O(nlgn) O(nlgn),点值表示到系数表示被叫做插值,可以用范德蒙矩阵求出系数。
( y 0 y 1 … y n − 1 ) = ( 1 x 0 x 0 2 … x 0 n − 1 1 x 1 x 1 2 … x 1 n − 1 … … 1 x n − 1 x n − 1 2 … x n − 1 n − 1 ) ( a 0 a 1 … a n − 1 ) = V ( x 0 , x 1 , … , x n − 1 ) ⋅ a \begin{pmatrix}y_0\\y_1\\…\\y_{n-1} \end{pmatrix}=\begin{pmatrix}1&x_0&x_0^2&…&x_0^{n-1}\\1&x_1&x_1^2&…&x_1^{n-1}\\&&……\\1&x_{n-1}&x_{n-1}^2&…&x_{n-1}^{n-1}\\\end{pmatrix}\begin{pmatrix}a_0\\a_1\\…\\a_{n-1}\end{pmatrix}=V(x_0,x_1,…,x_{n-1})·a y0y1yn1=111x0x1xn1x02x12xn12x0n1x1n1xn1n1a0a1an1=V(x0,x1,,xn1)a
拉格朗日公式插值的时间复杂度是 O ( n 2 ) O(n^2) O(n2) A ( x ) = ∑ k = 0 n − 1 y k ∏ j ≠ k x − x j ∏ j ≠ k x k − x j A(x)=\sum_{k=0}^{n-1}y_k\frac{\prod_{j≠k}x-x_j}{\prod_{j≠k}x_k-x_j } A(x)=k=0n1ykj=kxkxjj=kxxj
多项式相乘时,系数表示的 n n n次多项式相乘消耗的时间是 O ( n 2 ) O(n^2) O(n2),点值表示的 n n n次多项式相乘消耗的时间是 O ( n ) O(n) O(n)

离散傅里叶变换

单位复数根及其性质

ω n = 1 , ω \omega ^n=1,\omega ωn=1ω称为 1 1 1 n n n次复根,或单位 n n n次复根
ω n = e 2 π i n ω_n =e^{\frac{2πi}{n}} ωn=en2πi,单位 n n n次复根的基元
ω n k = ( ω n ) k = e 2 π i k n , , k = 0 , 1 , … , n − 1 ω_n^k=(ω_n)^k=e^{\frac{2πik}{n}},,k=0,1,…,n-1 ωnk=(ωn)k=en2πik,,k=0,1,,n1,单位 1 1 1 n n n n n n次复根。
e i u = c o s ( u ) + i ⋅ s i n ( u ) e^{iu}=cos(u)+i·sin(u) eiu=cos(u)+isin(u)
所以 ω n k = e 2 π i k n = c o s ( 2 π k n ) + i ⋅ s i n ( 2 π k n ) , k = 0 , 1 , … , n − 1 ω_n^k=e^{\frac{2πik}{n}}=cos(\frac{2πk}{n})+i·sin(\frac{2πk}{n}),k=0,1,…,n-1 ωnk=en2πik=cos(n2πk)+isin(n2πk),k=0,1,,n1 n n n个单位 n n n次复根组成一个群,做乘法加法幂次方仍然是这 n n n个点
一些性质

  1. ω n n = ω n 0 = 1 ( ω n n = e 2 π i n n = c o s 2 π + i ⋅ s i n 2 π ) \omega_n^n=\omega_n^0=1(\omega_n^n=e^{\frac{2πin}{n}}=cos2\pi+i·sin2\pi) ωnn=ωn0=1(ωnn=en2πin=cos2π+isin2π)
  2. ω n j ω n k = ω n j + k = ω n ( j + k ) m o d    n \omega_n^j\omega_n^k=\omega_n^{j+k}=\omega_n^{(j+k)\mod n} ωnjωnk=ωnj+k=ωn(j+k)modn
  3. ω n − 1 = ω n n − 1 \omega_n^{-1}=\omega_n^{n-1} ωn1=ωnn1
  4. ω d n d k = ω n k \omega_{dn}^{dk}=\omega_n^k ωdndk=ωnk
  5. ω n n 2 = ω 2 = − 1 \omega_n^{\frac{n}{2}}=\omega_2=-1 ωn2n=ω2=1
  6. 等分引理: n n n个单位 n n n次复方根的平方是 n 2 \frac{n}{2} 2n n 2 \frac{n}{2} 2n次方根
  7. ∑ j = 0 n − 1 ( ω n k ) j = 0 \sum_{j=0}^{n-1}(\omega_n^k)^j=0 j=0n1(ωnk)j=0

DFT

我们期望取 x = ω n 0 , ω n 1 , … , ω n n − 1 x=\omega_n^0,\omega_n^1,…,\omega_n^{n-1} x=ωn0,ωn1,,ωnn1来计算 A ( x ) = ∑ j = 0 n − 1 a j x j A(x)=\sum_{j=0}^{n-1}a_jx^j A(x)=j=0n1ajxj
y k = A ( x k ) = a ( ω n k ) = ∑ j = 0 n − 1 a j ω n k j y_k=A(x_k)=a(\omega_n^k)=\sum_{j=0}^{n-1}a_j\omega_n^{kj} yk=A(xk)=a(ωnk)=j=0n1ajωnkj,
( y 0 y 1 … y n − 1 ) = ( 1 1 1 … 1 1 ω n 1 ω n 2 … ω n n − 1 … … 1 ω n ( n − 1 ) ⋅ 1 ω n ( n − 1 ) ⋅ 2 … ω n ( n − 1 ) ⋅ ( n − 1 ) ) ( a 0 a 1 … a n − 1 ) \begin{pmatrix}y_0\\y_1\\…\\y_{n-1} \end{pmatrix}=\begin{pmatrix}1&1&1&…&1\\1&ω_n^1&ω_n^2&…&ω_n^{n-1}\\&&……\\1&ω_{n}^{(n-1)·1}&ω_{n}^{(n-1)·2}&…&ω_{n}^{(n-1)·(n-1)}\\\end{pmatrix}\begin{pmatrix}a_0\\a_1\\…\\a_{n-1}\end{pmatrix} y0y1yn1=1111ωn1ωn(n1)11ωn2ωn(n1)21ωnn1ωn(n1)(n1)a0a1an1

FFT

使用分治策略。
A ( x ) = A [ 0 ] ( x 2 ) + x A [ 1 ] ( x 2 ) A(x)=A^{[0]}(x^2)+xA^{[1]}(x^2) A(x)=A[0](x2)+xA[1](x2)
偶次项: A [ 0 ] ( x ) = a 0 + a 2 x + a 4 x 2 + ⋅ ⋅ ⋅ + a n − 2 x n / 2 − 1 A ^{[0]} (x) = a_0 +a_2 x+a_4 x^2 +···+a_{n-2} x ^{n/2-1} A[0](x)=a0+a2x+a4x2++an2xn/21
奇次项: A [ 1 ] ( x ) = a 1 + a 3 x + a 5 x 2 + ⋅ ⋅ ⋅ + a n − 1 x n / 2 − 1 A^{ [1]} (x) = a _1 +a _3 x+a_ 5 x^ 2 +···+a _{n-1} x^{ n/2-1} A[1](x)=a1+a3x+a5x2++an1xn/21
A ( x r ) = A [ 0 ] ( x r 2 ) + x A [ 1 ] ( x r 2 ) = A ( ω n r ) = A [ 0 ] ( ( ω n r ) 2 ) + ( ω n r ) A [ 1 ] ( ( ω n r ) 2 ) = A [ 0 ] ( ω n / 2 r ) + ( ω n r ) ⋅ A [ 1 ] ( ω n / 2 r ) A(x_r)=A^{[0]}(x_r^2)+xA^{[1]}(x_r^2)=A(\omega_n^r)=A^{[0]}((\omega_{n}^{r})^2)+(\omega_n^{r})A^{[1]}((\omega_{n}^r)^2)=A^{[0]}(\omega_{n/2}^r)+(\omega_n^r)·A^{[1]}(\omega_{n/2}^r) A(xr)=A[0](xr2)+xA[1](xr2)=A(ωnr)=A[0]((ωnr)2)+(ωnr)A[1]((ωnr)2)=A[0](ωn/2r)+(ωnr)A[1](ωn/2r)

A ( ω n k ) = A [ 0 ] ( ω n / 2 k ) + ( ω n k ) ⋅ A [ 1 ] ( ω n / 2 k ) A(\omega_n^k)=A^{[0]}(\omega_{n/2}^{k})+(\omega_n^k)·A^{[1]}(\omega_{n/2}^k) A(ωnk)=A[0](ωn/2k)+(ωnk)A[1](ωn/2k),

A ( ω n n / 2 + k ) = A [ 0 ] ( ( ω n / 2 n / 2 + k ) 2 ) + ( ω n n / 2 + k ) ⋅ A [ 1 ] ( ω n / 2 n / 2 + k ) = A [ 0 ] ( ω n / 2 k ) − ( ω n k ) ⋅ A [ 1 ] ( ω n / 2 k ) A(\omega_n^{n/2+k})=A^{[0]}((\omega_{n/2}^{n/2+k})^2)+(\omega_n^{n/2+k})·A^{[1]}(\omega_{n/2}^{n/2+k})=A^{[0]}(\omega_{n/2}^{k})-(\omega_n^k)·A^{[1]}(\omega_{n/2}^k) A(ωnn/2+k)=A[0]((ωn/2n/2+k)2)+(ωnn/2+k)A[1](ωn/2n/2+k)=A[0](ωn/2k)(ωnk)A[1](ωn/2k)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值