拆系数FFT
对于任意模数 m o d mod mod
设 m = m o d m=\sqrt {mod} m=mod
把多项式 A ( x ) A(x) A(x)和 B ( x ) B(x) B(x)的系数都拆成 a × m + b a\times m+b a×m+b的形式,时 a , b a, b a,b都小于 m m m
提出,那么一个多项式就可以拆成两个多项式的加法
一个是 a ∗ m a*m a∗m的,一个是 b b b的
直接乘法分配律, a a aa aa一遍, a b ab ab一遍, b a ba ba, b b bb bb一遍,四遍 F F T FFT FFT
乘出来不会超过取模范围
然后合并直接
( a × m + b ) ( c × m + d ) = a × c × m 2 + ( a × c + b × d ) m + b × d (a\times m+b)(c\times m+d)=a\times c\times m^2+(a\times c+b\times d)m+b\times d (a×m+b)(c×m+d)=a×c×m2+(a×c+b×d)m+b×d
这样子要进行 7 7 7 次 D F T DFT DFT
如果研究一下 m y y myy myy 2016 2016 2016 年的集训队论文就会发现有 2 2 2 次 或者 1.5 1.5 1.5 次 D F T DFT DFT 的 F F T FFT FFT 算法
2次的够了吧
m y y myy myy 巧妙的运用了复数的虚部,优化了算法
具体来说
设
C ( x ) = A ( x ) + i B ( x ) C(x)=A(x)+iB(x) C(x)=A(x)+iB(x)
D ( x ) = A ( x ) − i B ( x ) D(x)=A(x)-iB(x) D(x)=A(x)−iB(x)
假设
c ( w n k ) c(w_n^k) c(wnk) 表示将 C ( x ) C(x) C(x) D F T DFT DFT 后的点值
d ( w n k ) d(w_n^k) d(wnk) 表示将 D ( x ) D(x) D(x) D F T DFT DFT 后的点值
w w w 为 n n n 次单位复数根
设 c o n j ( x ) conj(x) conj(x) 表示 x x x 的共轭复数
那么
c ( w 2 n k ) = A ( w 2 n k ) + i B ( w 2 n k ) = ∑ j = 0 2 n − 1 A j w 2 n j k