FFT學習筆記

2021-07-30 07:50:38 字數 2618 閱讀 2676

fft可用於解決一些卷積問題。

一般問題形式如下: c=

a∗b

c[i]

=∑ij

=0a[

i]∗b

[i−j

] 若把a,b看成兩個次數為n多項式 a(

x)=∑

ni=0

a[i]

∗xi,

b(x)

=∑ni

=0b[

i]∗x

i 原問題等於兩個多項式相乘,c的次數等於2n-1

乙個次數界為n的多項式a的點值表達為n個點值對所組成的集合。形如

其中yi=a(xi),x各不相同。

插值運算為點值運算的逆運算,如果給定乙個n個點值對的點值表達,我們可以確定唯一乙個次數界為n的多項式。

對於多項式乘法,

我們可以求出a的點值表達和b的點值表達

則c的點值表達為

再通過插值運算,則可求出c的每一項的係數。

直接暴力,複雜度是o(n^2)的,fft的關鍵就在於x的選取。

形如a+bi(i=

−1−−

−√)

如果建立平面直角座標系,a作為x座標,b作為y座標,我們可以用乙個點對(a,b)來表示乙個複數,也相當於乙個平面向量。

用三角函式簡單推導,可以發現,複數乘法得到的新向量的模長等於原向量的模長之積,與x軸的夾角等於原向量的夾角之和。

n次單位複數根是滿足wn

=1的複數w 且w

1 ~wn

把平面均勻的分成n份 記w

為主n次單位複數根,則w=(cos(2π

/n),sin(2π

/n)) wi

=wi−

1∗w=

(cos

(2iπ

/n),sin(2i

π/n)

) 為了區分其他次單位複數根,我們添乙個下標來表示(wi

n )wd

kdn=

wkn

wdkd

n=(c

os(2

dkπ/

(dn)

),si

n(2d

kπ/(

dn))

)=(c

os(2

kπ/n

),si

n(2k

π/n)

)=wk

n 2n次單位複數根的平方的集合,等於n次單位複數根的集合。

易知對於任意乙個<=n的k,存在唯一乙個<=n的k』滿足wk

n=−w

k′n

(wk2

n)2=

(wk′

2n)2

=wkn

k!=0,n>0時∑n

−1i=

0wki

n=0

相當於等比數列求和,∑n

−1i=

0wki

n=(w

knn−

w0n)

/(wk

−1)=

0 為了方便,我們只考慮次數n=2^k的多項式乘法

如何求出單個數x的函式值a(x)?我們定義兩個多項式 a0

(x)=

a0+a

2x+a

4x2⋅

⋅⋅an

−2xn

/2 a

1(x)

=a1+

a3x+

a5x2

⋅⋅⋅a

n−1x

n/2

a(x)

=a0(

x2)+

x∗a1

(x2)

原問題:求a(x)在n次單位複數根上的函式值。

轉化成:求a0(x)和a1(x)在n/2次單位複數根上的值。

於是可以遞迴地對n/2的多項式a0(x)與a1(x)在n/2個n/2次單位複數根進行求值。

插值運算

如果把點值運算寫成矩陣方程的形式,可以得到表示式y=

vn∗a

。 那麼插值運算相當於求a,a=

v−1n

∗y

結論,v−1

n[j,

k]=w

−jkn

/n.

證明:[vn

∗v−1

n][j

,j']

=∑n−

1i=0

w(j'

−j)i

n/n ,如果j』=j,那後面為1,否則根據求和引理,為0。

如何把空間複雜度降為o(n)呢?

不好講,詳見**吧…

struct z

}c[maxn],d[maxn],g[maxn],a[maxn],b[maxn],an[maxn];

z operator *(z a,z b)

z operator +(z a,z b)

z operator -(z a,z b)

void dft(ar *a,int sig)

}}fo(i,0,l-1)a[i]=g[i];

if (sig<0) fo(i,0,l-1) a[i].x/=l;

}void fft()

void chu()

}

FFT學習筆記

今天doggu講了,開始覺得這玩意好強啊 後來自己看的時候發現蠻zz wys表示 贊同 所以很多自己覺得遙不可及,一輩子都不可能學會的東西只要慢慢理解,理解好了再把他化為自己的語言,歸到自己的世界裡 就覺得不是很難了,甚至很簡單.當然開始並不是,從 好難啊 到 這麼簡單困大爺我這麼久,之前腦子抽了z...

FFT 學習筆記

f x sum limits a i x i x 0,f x 0 x 1,f x 1 x f x 首先我們要了解複數 即 i sqrt 乙個數有實部和虛部 即 a x y i x,y 原來的實數運算相當於在乙個一維數軸上進行移動,複數則是在二維平面上運動 一句話來說就是摸長相乘,幅角相加 c 中提供...

FFT學習筆記

fft學習筆記 fft,快速傅利葉變換,是一種在 o n log n 的時間內計算兩個多項式乘積的演算法。沒學過的請自行翻閱高中數學選修2 2。給出乙個多項式 f x a 0 a 1x a 2x 2 a nx n 係數表示法 就是用乙個係數序列來表達多項式,顯然係數序列和多項式是一一對應的。f x ...