FFT
相信大家FFT已经掌握的很熟练了。
参考这一篇博客:浅谈算法——从多项式乘法到FFT
常数优化1——IDFT
若已知多项式 A ( x ) A(x) A(x)的点值表示
< ( ω n 0 , A ( ω n 0 ) ) , ( ω n 1 , A ( ω n 1 ) ) , ⋯   , ( ω n n − 1 , A ( ω n n − 1 ) ) > <(\omega_n^0,A(\omega_n^0)),(\omega_n^1,A(\omega_n^1)),\cdots,(\omega_n^{n-1},A(\omega_n^{n-1}))> <(ωn0,A(ωn0)),(ωn1,A(ωn1)),⋯,(ωnn−1,A(ωnn−1))>
则多项式 A ( x ) A(x) A(x)满足
[ x r e v ( k ) ] A ( x ) = 1 n ∑ i = 0 n − 1 ω n k i A ( ω n i ) [x^{rev(k)}]A(x)=\frac{1}{n}\sum_{i=0}^{n-1}\omega_n^{ki}A(\omega_n^i) [xrev(k)]A(x)=n1i=0∑n−1ωnkiA(ωni)
其中
r e v ( k ) = { 0 k = 0 n − k − 1 k ̸ = 0 rev(k)=\begin{cases} 0 & k=0\\ n-k-1 & k\not= 0 \end{cases} rev(k)={
0n−k−1k=0k̸=0
就是说:IDFT只需要调用DFT函数然后std::reverse(a+1,a+n+1)
,最后同时除以 n n n即可。
证明:假设
A ( x ) = ∑ i = 0 n − 1 a i x i A(x)=\sum_{i=0}^{n-1}a_ix^i A(x)=i=0∑n−1aixi
那么
[ x r e v ( k ) ] A ( x ) = 1 n ∑ i = 0 n − 1 ω n k i ∑ j = 0 n − 1 a j ω n i j [x^{rev(k)}]A(x)=\frac{1}{n}\sum_{i=0}^{n-1}\omega_n^{ki}\sum_{j=0}^{n-1}a_j\omega_n^{ij} [xrev(k)]A(x)=n1i=0∑n−1ωnkij=0∑n−1ajωnij
交换两个求和符号
[ x r e v ( k ) ] A ( x ) = 1 n ∑ i = 0 n − 1 a i ∑ j = 0 n − 1 ω n i j ω n k j [x^{rev(k)}]A(x)=\frac{1}{n}\sum_{i=0}^{n-1}a_i\sum_{j=0}^{n-1}\omega_n^{ij}\omega_n^{kj} [xrev(k)]A(x)=n1i=0∑n−1aij=0∑n−1ωnijωnkj
显然
[ x r e v ( k ) ] A ( x ) = 1 n ∑ i = 0 n − 1 a i ∑ j = 0 n − 1 ω n ( i + k ) j [x^{rev(k)}]A(x)=\frac{1}{n}\sum_{i=0}^{n-1}a_i\sum_{j=0}^{n-1}\omega_n^{(i+k)j} [xrev(k)]A(x)=n1i=0∑n−1aij=0∑n−1ωn(i+k)j
此时,若 i = r e v ( k ) i=rev(k) i=rev(k),则 i + k = 0 (   m o d   n ) i+k=0(\bmod n) i+k=0(modn),此时
ω n ( i + k ) j = 1 \omega_n^{(i+k)j}=1 ωn(i+k)j=1
即
∑ j = 0 n − 1 ω n ( i + k ) j = n \sum_{j=0}^{n-1}\omega_n^{(i+k)j}=n j=0∑n−1ωn(i+k)j=n
否则由等比数列求和公式
∑ j = 0 n − 1 ω n ( i + k ) j = 1 − ω n ( i + k ) n 1 − ω n i + k = 0 \sum_{j=0}^{n-1}\omega_n^{(i+k)j}=\frac{1-\omega_n^{(i+k)n}}{1-\omega_n^{i+k}}=0 j=0∑n−1ωn(i+k)j=1−ωni+k1−ωn(i+k)n=0
因此
[ x r e v ( k ) ] A ( x ) = 1 n a r e v ( k ) n = a r e v ( k ) [x^{rev(k)}]A(x)=\frac{1}{n}a_{rev(k)}n=a_{rev(k)} [xrev(k)]A(x)=