Hizli Fourier Donusumu algoritmasi Ayrik Fourier Donusumunu O(n2) den hizli hesaplamak icin kullanilan tum algoritmalarin genel adiymis. Bilgisiyar biliminde acik sorulardan bir tanesi bu donusumu O(nlogn) den hizli yapabilirmiyiz imis.
Ben Cooley-Tukey algoritmasindan bahsedecegim. Ilginc bir anektod olarak bu algoritmayi Cooley ve Tukeyden 160 sene kadar once Gauss astreoidlerin yorungesini hesaplamak icin bulmus/kullanmis.
N uzunlugundaki xn dizisinin Ayrik Fourier Transformasyonu su sekilde veriliyor:
k∈[0,N−1]Xk=∑N−1n=0xne−2πiNnk
Xk yi baska bir sekilde ifade edelim.
Xk=∑N2−1m=0x2me−2πiN2mk+∑N2−1m=0x2m+1e−2πiN(2m+1)k
Xk=∑N2−1m=0x2me−2πiN/2mk+e−2πiNk∑N2−1m=0x2m+1e−2πiN/2mk
Dikkatli bakarsaniz toplamanin sagi x2k dizisinin , toplamanin sol tarafi x2k+1 dizisinin Ayrik Fourier Donusumu.
ei⋅ nin periyodikliginden yararlanip gosterebiliriz ki
Xk=∑N2−1m=0x2me−2πiN/2mk+e−2πiNk∑N2−1m=0x2m+1e−2πiN/2mk
Xk+N2=∑N2−1m=0x2me−2πiN/2mk−e−2πiNk∑N2−1m=0x2m+1e−2πiN/2mk
Bu sekilde ozyinelemeli olarak yazarsak yapacagimiz islem sayisi O(n2) den O(nlogn) duser.
Python da yazarsak
def hizli_fourier(x):
N = len(x)
if(N <=1):
return x
cift = hizli_fourier(x[0::2])
tek = hizli_fourier(x[1::2])
T= [ exp(-2j*pi*k/N)*tek[k] for k in range(N//2) ]
sol = [ cift[k] + T[k] for k in range(N//2)]
sag = [cift[k] - T[k] for k in range(N//2)]
return sol+sag
Duzenleme :
Su soruyu da inceleyebilirsiniz. Verilen cevap matematiksel olarak daha temiz.