Normalde N haneli iki sayının çarpımı için N2 kere toplama ve N2−1 kere çarpma işlemi yapmak gerekir (yeni işlemcilerde toplama işlemleri de önemlidir), örn. 15⋅76 işlemini 15⋅76=6⋅5+6⋅10+70⋅5+70⋅10=1140 olarak hesaplıyoruz. Landau işaretiyle O(f):={g:N→R+| ∃c öyle ki ∀n∈N:g(n)≤cf(n)} gösterirsek bu algoritma kayan nokta işlemlerinin (ing. FLOP) sayısında O(N↦2N2−1)=O(N↦N2)≡O(N2) derecesindendir.
Tanım: Bir f fonksiyonu için fn:=f(xn)'lerin
Fa:CN→CN,fj↦ˆfj:=N−1∑k=0fke−2πijk/N, j=0,...,N−1 eşdönüşümüne ayrık Fourier dönüşümü denir. Tersi (Fa)−1 fj:=1NN−1∑k=0ˆfke2πijk/N'dir.
Hızlı Fourier dönüşümü, O(N2) derecesinden olan ayrık Fourier dönüşümünü adı üstünde hızlı bir biçimde -O(Nlog2N) ile- gerçekleştiren bir tekniktir, grup teorisinden sayı teorisine uzanan farklı çeşitleri vardır, ilk kez verimli bir böl-ve-yönet algoritması biçiminde Cooley, J. W., and J. W. Tukey; An Algorithm for the Machine Calculation of Complex Fourier Series. Math. Comp. 19, 297-301 (1965) doi:10.2307/2003354 'de yayınlanmıştır. Cooley-Tukey algoritmasının kanıtı (yazılacak gibi değil) ve genel olarak hızlı Fourier dönüşümüyle ilgili herşey için E.O. Brigham, The Fast Fourier Transform, Prentice Hall, Englewood Cliffs (1974) kitabını incelemenizi öneririm.
1971'de A. Schönhage ve V. Strassen Schnelle Multiplikation grosser Zahlen, Computing 7, 281-292 doi:10.1007/BF02242355 adlı makalelerinde sadece herhangi iki büyük sayının çarpımını hesaplamaya yönelik hızlı Fourier dönüşümüne dayalı O(Nlog(N)log(log(N))) derecesinden olan Schönhage-Strassen algoritmasını geliştirmişlerdir. Ancak 2007 yılından sonra Schönhage-Strassen'den daha hızlı, işlem karmaşıklığını O(Nlog(N)23log∗(N))'e kadar düşürülebilen (log∗ burada yinelemeli logaritmadır) Fürer algoritması bkz. arXiv:1407.3360 bulunabilinmiştir.
Ama ben ikinin bir kuvveti olan bir sayıyı (=2m=2N olsun) hesaplamak için Cooley-Tukey'in h.F.d. algoritmasının nasıl kullanılabileceğini göstermekle yetineceğim.
Tanım: p:C→C,x↦p(x):=N∑k=0akxk,
N derecesinden karmaşık değerli bir çokterimlidir, x değişkenine taban denir.
Herhangi bir tamsayıyı m belli bir positif taban sayısı için bir çokterimli olarak yazabiliriz, örn. T:=10,m=134→m=p(T),a0=4,a1=3,a2=1,ak=0 ∀k≥3. O zaman N haneli iki sayıyı çarpma işlemi N−1 derecesinden iki çokterimliyi çarpma işlemine r(x)=p(x)q(x) denk gelir (şimdilik tabanı sabit seçmiyoruz). p(x)q(x)'nın katsayılarını doğrudan hesaplamak yerine belli xk noktalarında r(xk)=p(xk)q(xk)'yi belirleyelim ve bunların yardımıyla c=[c0,...,c2N−1]'yi bulup r(x)=2N−1∑k=0ckxk'yi oluşturalım. İçdeğer biçim teoremine göre 2N−1 derecesinden r(x) çokterimlisini saptayabilmek için 2N tane r(xk) fonksiyon değerine ihtiyacımız var. Akla ilk gelen soru hangi xk değerlerini seçmemiz gerektiği, yanıtı ise (sonradan kullanacağımız) indirgeme ve yansıma özelliğine sahip olan ilkel birim kökleridir.
Tanım: R etkisiz elemanı 1 olan değişmeli bir halka ve 0≤n∈N olsun. Eğer ωn=1 ve 0<k<n için ωk≠1'i sağlarsa, ω∈R'ya n'inci ilkel birim kökü denir. İndirgeme özelliği : Eğer bir 2n−1 derecesinden çokterimli için 2n ilkel birim kökünü belirlemişsek, bunların yarısı n−1 derecesinden bir çokterimli için de ilkel birim kökleridir. Yansıma özelliği ise şöyle açıklanabilir: Eğer ω n'inci ilkel birim kökü ve n≥2 çift ise, ωk+n2=−ωk'dır.
Bizim için R=C'dir. O zaman ω:=e−2πin bir n'inci ilkel birim köküdür.
Bu durumda r(xk) değerlerini bulmak ayrık Fourier dönüşümü uygulamakla eşdeğerdir!
İlkönce tek çokterimlinin hızlı Fourier dönüşümüyle ilgileneceğiz. 2N çift olduğu için, 2N−1 derecesinden bir q(x):=N−1∑k=0bkxk çokterimlisini iki tane (N−1) derecesi çokterimlisine dönüştürebiliriz:
qçift(x):=b0+b2x+b4x2+...+b2N−2xN−1
qtek(x):=b1+b3x+b5x2+...+b2N−1xN−1
, çünkü q(x)=xqtek(x2)+qçift(x2).
Cooley-Tukey algoritmasını -betik olarak gösterimi CT(çokterimli,sayı)- şimdi yazabiliriz:
1. b=[b0,...,b2N−1] ve ω'yı parametre olarak ver.
2. b'yi bçift↔qçift ve btek↔qtek'e böl. Özyineli olmak üzere C.-T. prosedürünü her biri için ω2 ile çağır:yçift/tek=CT(bçift/tek,ω2) (indirgeme öz.) → qçift ve qtek'in, ω2'nin bütün N üsleri için değerleri → q'nun ω'nın bütün 2N üsleri kümesindeki elemanların yarısı için değerleri biliyoruz.
3. Diğer yarısı için aşağıdaki denklemleri, 2.'de bulunan yçift ve ytek'ler için (N kere) çöz:
q(ωk)=qçift(ω2k)+ωkqtek(ω2k)
q(ωk+N/2)=qçift(ω2k)−ωkqtek(ω2k) (yansıma öz.)
4. 2N=2m olduğu için sonunda çokterimliden geriye sadece bir katsayı kalacak (en son yinelemede), bunu işlem yapmadan y'ye eşleyip geri döndürebiliriz.
5. y=(q(ωk))k∈{0,...,2N−1} a.F.d. değerlerini yazdır.
Son olarak a,b katsayı vektörlü iki N-1 derecesinden çokterimliyi p,q çarpma işlemine geliyoruz. Bunun için y=CT(a) ve z=CT(b)'yi hesaplayalım, y ve z'yi çarpalım, h:=[y0z0,...,y2N−1z2N−1]. h'nin ters a.F.d.'ü , benzer şekilde ck=12N2N−1∑j=0hjω−ij, bize r(x)'in katsayılarını verir.