1. 程式人生 > >FFT學習筆記

FFT學習筆記

.com frame 互轉 圖片 mathjax 分享 htm 一個 分析

感謝大佬的博客

隊友希望我學一下,現在補一補也許來得及...?(並不)

由於大佬的文章已經比較詳細了,我只是再分析一下概念和細節上的一點東西(學渣的小抄hhh)


FFT(Fast Fourier Transformation)

用於加速乘法(大概)

如果樸素的計算n次多項式A(x)和B(x)的乘積C(x)的各項系數,需要O(n2)的運算

而FFT能夠將這個復雜度壓到O(nlogn) 可以說非常神奇了

如果將A(x)和B(x)寫成多項式的形式可能並不方便運算,於是用到了點值表示:將n個點x0~xn-1帶入表達式A(x)就可以得到n個值y0~yn-1,並通過這n組數據來唯一的表示多項式

這樣,C(x)的表示就比較簡單了:

  • 將一特定的值t代入兩個多項式,得到結果分別A(t)、B(t),那麽C(t)=A(t)×B(t)
  • 只要代入2n個不同的值,就能夠得到C(x)完整的點值,從而確定C(x)的式子

但是普通的實數點值表示也不能將運算數量級降低,必須引入復數點值表示

(這一引入部分詳見大佬博客)


( y0 , y1 , y2 , ... , yn1 ) 為多項式A(x)=a0+a1x+a2x2+...+an1xn1的離散傅裏葉變換。

這裏的y0~yn-1是將n個n次單位根依次代入A(x)得到的結果,即是系數->點值

的轉化

現在我們再設一個多項式B(x)=y0+y1x+y2x2+...+yn−1xn−1,現在我們把上面的n個單位根的倒數,即ω0n , ω−1n , ω−2n , ... , ω−(n−1)n 作為x代入B(x), 得到一個新的離散傅裏葉變換(z0 , z1 , z2 , ... , zn−1 ) 。

...

ai=zi / n

將之前運算的y0~yn-1作為B(x)的系數,再分別代入n個n次單位根的倒數(相當於其共軛復數),竟然能通過蛇皮運算得到a0~an-1

,即是點值->系數的轉化

也就是說,我們可以完成系數與點值間的相互轉化


但是上面的兩次轉化復雜度仍均為O(n2),看起來並不比實數的做法高明

不過這!是!復!數! 有各種奇妙的性質我們沒有使用

ω2k2n=ωkn

復數允許我們愉快的直接除2,這就可以帶來以下的騷操作

技術分享圖片

第一眼看的時候覺得很妙,但仔細想一想,ん?如果不湊巧n是奇數咋辦?

好像沒有什麽辦法的樣子,所以我們只能將n補為2x的形式,而原系數an~a2x-1則全為0

看來還是有不少細節需要註意的

同時復數運算肯定結果是小數,有沒有辦法將原系數還原成整數呢?

(明天再補代碼 待續)

FFT學習筆記