1. 程式人生 > >多項式與快速傅立葉變換

多項式與快速傅立葉變換

文章寫的有點急。有錯誤的地方望指出
我學習 FFT 是一個比較慢的過程。 期間反反覆覆。 我寫這篇博文只是一個非常淺顯的理解。同時也可以幫助初學者在學習FFT的時候。有所偏重。避免太多思維上的負擔。

直接正題吧:

首先:DFTDFT本身並不負責多項式之間的乘法。

DFTDFT只是一種變換。

FFTFFT則是DFT的快速演算法。(分治提高效率)

利用FFTFFT 。我們快速的將多項式變換為利於計算的形式

用這種方便計算的形式計算出來兩個多項式的乘積。

這時候我們雖然已經得到目標多項式。但其形式並不是我們想要的

所以 之後利用 FFTFFT的逆運算又快速的變換回去

我們記:F
FTFFT
的逆運算為 FFTFFT^-

對於一個nn次多項A的表示。最常見的形式(係數表達):

A(x)=i=0n1aixiA(x)=\sum_{i=0}^{n-1}a_ix^i

nn1這裡的n次多項式是指最高次項指數為n-1的多項式

小學生手算 係數形式 的 多項式乘法 的 複雜度是 O(n2)O(n^2)

如果我們知道了一個nn次多項式 的曲線上的nn個不同的的點。

我們是可以計算出來這個多項式的

whywhy?

把係數看做未知數。列出來n個方程組。解出來這n個係數。

也就是說,給出曲線上的n個點:

<(x0,y0),(x1,y1),(x2,y2),.....(xn1,yn1)><(x_0,y_0),(x_1,y_1),(x_2,y_2),.....(x_{n-1},y_{n-1})>

我們可以確定其係數形式;

我們稱這種表達一個多項式的方法叫:點值表達

他有很多優點。比如可以O(n)O(n)時間內計算一個多項式乘法

再給出一個多項式:

B(x)=i=0n1bixiB(x)=\sum_{i=0}^{n-1}b_ix^i

A(x)A(x)B(x)B(x)在取相同x的點值表達為:

<(x0,A0),(x1,A1),(x2,A2),.....(x2n2,A2n2)><(x_0,A_0),(x_1,A_1),(x_2,A_2),.....(x_{2n-2},A_{2n-2})>

<(x0,B0),(x1,B1),(x2,B2),.....(x2n2,B2n2)><(x_0,B_0),(x_1,B_1),(x_2,B_2),.....(x_{2n-2},B_{2n-2})>

這裡Ai=A(xi)A_i=A(x_i) ,Bi=B(xi)\ \ \ \ \ B_i=B(x_i)

A(x)B(x)A(x)*B(x)為:

<(x0,A0B0),(x1,A1B1),(x2,A2B2),.....(x2n2,A2n2B2n2)><(x_0,A_0B_0),(x_1,A_1B_1),(x_2,A_2B_2),.....(x_{2n-2},A_{2n-2}B_{2n-2})>

非常方便。順其自然;

之所以A(x)A(x)B(x)B(x)多取一些點。是因為A(x)B(x)A(x)*B(x)的次數界增加。

取點不足會導次數界達不到2n12n-1

對於一個nn次多項式。隨機求其n個不同的點的樸素方法複雜度是O(n2)O(n^2)

假設 n為偶數。那麼我們把A(x)A(x)。重組為兩個多項式:

設其係數的下標為偶陣列成的多項式為A[0](x)A^{[0]}(x)

A[0](x)=a0+a2x+a4x2+...+an2xn21A^{[0]}(x)=a_0+a_2x+a_4x^2+...+a_{n-2}x^{\frac{n}{2}-1}

設其係數的下標為奇陣列成的多項式為A[1](x)A^{[1]}(x)

A[1](x)=a1+a3x+a5x2+...+an1xn21A^{[1]}(x)=a_1+a_3x+a_5x^2+...+a_{n-1}x^{\frac{n}{2}-1}

所以有:

A(xi)=A[0](xi2)+xiA[1](xi2)A(x_i)=A^{[0]}(x_i^2)+x_iA^{[1]}(x_i^2)

好像並不會優化運算。

因為<x02,x12,....xn12><x_0^2,x_1^2,....x_{n-1}^2>