FFT学习笔记

多项式的系数表示法: A ( x ) = ∑ i = 0 n − 1 a i x i A(x)=\sum_{i=0}^{n-1}a_ix^i A(x)=i=0n1aixi

多项式的点值表示法:将n个不同的数代入多项式 A ( x ) A(x) A(x),可以得到 n n n个值,这 n n n个值对应确定一个 n − 1 n-1 n1次的多项式。


两个用系数表示的多项式 A ( x ) A(x) A(x) B ( x ) B(x) B(x),要把它们相乘得到 C ( x ) C(x) C(x)

如果直接把系数乘起来得到 C ( x ) C(x) C(x)的系数的话,时间复杂度为 O ( n 2 ) O(n^2) O(n2)

但是对于点值表示法, C ( x i ) = A ( x i ) B ( x i ) C(x_i)=A(x_i)B(x_i) C(xi)=A(xi)B(xi),可以 O ( n ) O(n) O(n)的求出。

所以考虑取 n n n个不同的数分别代入 A , B A,B A,B中,得到 A , B A,B A,B的点值表示,然后求出 C C C的点值表示,再转化成 C C C的系数表示。

所以我们需要一种方法支持快速的转化点值表示法和系数表示法。


对于一个 n − 1 n-1 n1次的多项式 A ( x ) A(x) A(x),分别把 ω n 0 , ω n 1 . . . ω n n − 1 \omega_n^0,\omega_n^1...\omega_n^{n-1} ωn0,ωn1...ωnn1作为 x x x代入,得到 A ( x ) A(x) A(x)的点值表示 ( y 0 , y 1 . . . y n − 1 ) (y_0,y_1...y_{n-1}) (y0,y1...yn1),称为 A ( x ) A(x) A(x)的离散傅里叶变换。


系数–>点值

把n个值代入多项式求答案,暴力复杂度是 O ( n 2 ) O(n^2) O(n2)的。

用分治FFT求离散傅里叶变换只要 O ( n l o g n ) O(n logn) O(nlogn)


点值–>系数

把A(x)的离散傅里叶变换,即 ( y 0 , y 1 . . . y n − 1 ) (y_0,y_1...y_{n-1}) (y0,y1...yn1)作为系数得到多项式 B ( x ) = y 0 + y 1 x . . . + y n − 1 x n − 1 B(x)=y_0+y_1x...+y_{n-1}x^{n-1} B(x)=y0+y1x...+yn1xn1

再把上面的n个单位根的倒数,即 ω n 0 , ω n − 1 . . . ω n − ( n − 1 ) \omega_n^{0},\omega_n^{-1}...\omega_n^{-(n-1)} ωn0,ωn1...ωn(n1)作为x代入,得到 B ( x ) B(x) B(x)的点值表示 ( z 0 , z 1 . . . z n − 1 ) (z_0,z_1...z_{n-1}) (z0,z1...zn1),可以证明, z k = n a k z_k=na_k zk=nak;

这有什么用呢?

当我们知道 A ( x ) A(x) A(x)的离散傅里叶变换,但不知 A ( x ) A(x) A(x)的系数时,我们可以通过这种方法的到 A ( x ) A(x) A(x)的系数表示法。实现了点值–>系数的转换.

并且这里求的都是某一个多项式的离散傅里叶变换,所以可以用分治FFT提高效率。

你可能感兴趣的:(FFT学习笔记)