[Algorithm] Polynomial and FFT

 

排序:nlognhtml

二分查找:logn <-- 利用單調性,查n次,每次logngit

  

Multiply the following pairs of polynomials using at most the prescribed number
of multiplications of large numbers (large numbers are those which depend on the
coefficients and thus can be arbitrarily large).github

Hint: 算法

Let's set x^2 = y. 最高次冪變爲3。再執行點乘後,P(x)*Q(x)有(3+3+1)個係數。數組

 

Consider polynomial P(x) = x^32 + 3x^18 + 5x^5 + 4 x^2 + 3x + 6. You are given a large number M. Find
the value P(M) using only 7 multiplications of large numbers.ide

Hint: spa

冪次爲:32, 18, 5, 2, 13d

不斷自相乘,獲得的冪次爲:1, 2, 4, 8, 16, 32 作了五次大數計算。orm

32, 18 = 16+2, 5 = 4+1, 2, 1 這裏的冪次的加,實際上是實際的相乘,這裏又是兩次。xml

故,共七次。

 

Sol 1: n^2 denotes 組合方式,這是等式一側;等式另外一側是查找logn。

Sol 2:

(1) 求任意兩個變量的和,構成一個n^2長的數組。--O(n^2),每一個數組下記錄了由哪兩個值相加。

(2) 對n^2長的數組排序。 -- n^2*log(n^2)

(3) 搜索某個值,也就是等式右邊的值。 -- n^2

If m + n = a + b, 等價於在n^2長的數組上作上述相似的操做。

Therefore, 只要是兩個變量的運算,就能夠匹配這個O(n^2)的部分。思惟簡單,費空間而已。

 

FFT 與 多項式計算

都是成年老酒,以下兩個是比較好的連接。

從多項式乘法到快速傅里葉變換

有關多項式的算法 (補充)

 

i+j=m, 0<m<2n 決定了以下的特色:

其實就是多項式相乘:

Let's suppose that
A(x) = q0 + q1*x + q2*x^2 + ... + qn*x^n
B(x) = q0 + 2*q1*x + 3*q2*x^2 + ... + (n+1)*qn*x^n
C(x) = A(x)*B(x)

 

Extended:

Compute all elements of the sequence F (0), F (1), F (2), . . . , F (2n) where

 

i * log(j+1) 分別爲A(x), B(x)的coefficient.

 

FFT Examples

List 理解關鍵點:

原式:

其DFT形式:

其實,就是用「複數」求方程的 「點值」。

 

而後就是FFT有關的技巧過程: Cooley-Tukey算法

( 注意,這裏只是求一次點值,總共本有八次 )

 

計算一次點值,作了七次乘法

經過並行,只有三層計算。

而原式中的7次方,就必然要作串行的六層計算

時間複雜度的減小並不是必定是計算量的減小,而是整體計算時長的減小。

 

到這裏,應該能看出來FFT的tricky在哪裏了。

(1)

就在於 roots of complex number 的次方的規律:它是轉圈圈,而不是像實數同樣像無窮大發散!

故,這裏求出x的次方0~7,其實就已經知道了y還有z。

(2)

每次平方的效果:值減半!

n/2次單位根 只有 n/2個,也就是說,咱們要帶入的值再平方之後彷佛變少了一半。

遞歸下去計算(如上圖過程),複雜度就是:

 

相關文章
相關標籤/搜索