FFT'nin elle nasıl yapıldığını gösterin


27

İki polinomunuz olduğunu söyleyin: 3+x ve 2x2+2 .

FFT'nin bu iki polinomu çarpmamıza nasıl yardımcı olduğunu anlamaya çalışıyorum. Ancak, hiç çalışılmış bir örnek bulamıyorum. Birisi bana FFT algoritmasının bu iki polinomu nasıl çarpacağını gösterebilir mi? (Not: Bu polinomlar hakkında özel bir şey yok, ancak takip etmeyi kolaylaştırmak için basit tutmak istedim.)

Sözde koddaki algoritmalara baktım, fakat hepsinin problemleri var gibi görünüyor (girişin ne olması gerektiğini, tanımlanmamış değişkenleri belirtmeyin). Ve şaşırtıcı bir şekilde, kimsenin FFT kullanarak çoğaltan bir polinom örneği (elle) üzerinden geçtiği yeri bulamıyorum.


2
Wikipedia, FFT aracılığıyla tam sayı çarpımı için bu hoş görüntüyü koruyor, ancak adım adım daha da açık bir şekilde yardımcı olabileceğini düşünüyorum.
Realz Slaw

Yanıtlar:


27

Biz karşılık ikame birlik dördüncü kökleri, kullanımı varsayalım 1,i,1,i için x . Ayrıca FFT algoritmasında zaman içinde azalma yerine, zaman içinde azalma kullanıyoruz. (Ayrıca, sorunsuz bir şekilde biraz tersine çevirme işlemi uygularız.)

İlk polinomunun dönüşümü hesaplamak için, katsayıları yazarak başlamak:

3,1,0,0.
Fourier da katsayıların dönüşümü 3,0 olduğu 3,3 , ve tek katsayıları 1,0 olduğu 1,1 . (Bu dönüşüm sadece a,ba+b,ab .) Bu nedenle, ilk polinomun dönüşümü
4,3+i,2,3i.
Bu kullanılarak elde edilenX0,2=E0±O0 ,X1,3=E1iO1 . (Twiddle faktörü hesaplamasından).

İkinci polinom için aynı şeyi yapalım. Katsayılardır

2,0,2,0.
daha katsayıları 2,2 dönüşümü 4,0 ve tek katsayıları 0,0 dönüşümü 0,0 . Bu nedenle, ikinci polinomun dönüşümü
4,0,4,0.

İki Fourier dönüşümünü nokta ile çarparak ürün polinomunun Fourier dönüşümünü elde ederiz:

16,0,8,0.
Ters Fourier dönüşümünü hesaplamak için kalır. Çift katsayılar 16,8 ters 12,4 dönüşür ve tek katsayılar 0,0 ters dönüş 0,0 . (Ters dönüşüm x,y(x+y)/2,(xy)/2 ). Bu nedenle Ürün polinom dönüşümü
6,2,6,2.
Bu kullanılarak elde edilenX0,2=(E0±O0)/2 ,X1,3=(E1iO1)/2 . İstediğiniz cevabı elde ettik
(3+x)(2+2x2)=6+2x+6x2+2x3.


6,2 6, 2'ye nasıl geldiniz?
lars

: I formüller verdi , X- 1 , 3 = ( E 1i O 1 ) / 2 , E 0 , E 1 ( O 1 , O 2 ) olduğu x , y ( x + y ) formülü ile elde edilen çift (tek) katsayıların ters dönüşümüX0,2=(E0±O2)/2X1,3=(E1iO1)/2E0,E1O1,O2 . Lütfen cevaba tekrar bakın - tüm hesaplamalar var. x,y(x+y)/2,(xy)/2
Yuval Filmus

Eşit katsayıları neden iki kere kullanıyorsunuz? 3,3 -> 3,3,3,3. -> 3 + 1, 3-i, 3 + -1,3 - i?
Aage Torleif

ve X 1 , 3 için bu formüller daha yüksek derecelere nasıl uzanır? Artı / eksi işaretleri çevrilmeye devam mı ediyor? Örneğin, X 0 , 2 , 4 için ne olurdu ? X0,2X1,3X0,2,4
Bobby Lee,

@BobbyLee FFT ile ilgili bazı literatürleri okumanı tavsiye ediyorum.
Yuval Filmus,

7

Polinomları tanımlayın, nerede deg(A) = qve deg(B) = p. deg(C) = q + p.

Bu durumda deg(C) = 1 + 2 = 3,.

A=3+xB=2x2+2C=AB=?

Kolayca Cı bulabilirsiniz O(n2) katsayılarının kaba kuvvet çoğalması ile zaman. FFT (ve ters FFT) uygulayarak bunu O(nlog(n)) zamanında başarabiliriz . Açıkça:

  1. A ve B'nin katsayı gösterimini değer temsiline dönüştürün. Bu sürece değerlendirme denir . Bunun için Böl ve Conquer (D&C) yapmak O(nlog(n)) zaman alacaktır .
  2. Polinomları bileşen temsiliyle değer temsillerinde çarpın. Bu, C = A * B'nin değer gösterimini döndürür. Bu O(n) zaman alır.
  3. C'yi ters katsayılı gösterimde almak için ters FFT kullanarak C'yi ters çevirin. Bu işleme enterpolasyon denir ve ayrıca O(nlog(n)) zaman alır.

Devam edersek, her polinomu, değeri katsayıları olan bir vektör olarak temsil ederiz. Vektörü 0 ile en küçük iki, değerine kadar dolduruyoruzn=2k,ndeg(C) . Böylece n=4 . İki gücün seçilmesi, bize bölün ve fethetme algoritmamızı tekrar tekrar uygulamak için bir yol sağlar.

A=3+x+0x2+0x3a=[3,1,0,0]B=2+0x+2x+0x3b=[2,0,2,0]

Let A,B , sırasıyla A ve B değeri temsili olarak. FFT (Hızlı olduğuna dikkat edin Fourier Dönüşümü ) lineer transformasyonu (olup lineer harita ) ve bir matris olarak temsil edilebilir M . Böylece

A=MaB=Mb

M=Mn(ω)ωnthn = 4jthkthωnjk

M4(w)=[111...11ω1ω2...ωn11ω2ω4...............ωjk...1ωn1ω2(n1)...ω(n1)(n1)]=[11111ωω2ω31ω2ω4ω61ω3ω6ω9]

ω4=4th

{ω0,ω1,ω2,ω3,ω4,ω5,...}={1,i,1,i,1,i,...}

Bu, birim dairenin köklerini saat yönünün tersine çevirerek görüntülenebilir.

mod nω6=ω6modn=ω2=1i=ω3=ω3+n

A,B

A=Ma=[11111ωω2ω31ω2ω4ω61ω3ω6ω9][3100]=[3+13+1ω3+ω23+ω3]=[43+i23i]B=Mb=[11111ωω2ω31ω2ω4ω61ω3ω6ω9][2020]=[2+22+2ω22+2ω42+2ω6]=[4040]

Bu adım, D&C algoritmaları kullanılarak gerçekleştirilebilir (bu cevabın kapsamı dışında).

çarpmaAB

AB=[43+i23i][4040]=[16080]=C

Son olarak, son adım C 'yi katsayılara dönüştürmektir. ihbar

C=McM1C=M1Mcc=M1C

Mn1=1nMn(ω1)ωj=ωn/2+j

Mn1=14[11111ω1ω2ω31ω2ω4ω61ω3ω6ω9]=14[11111i1i11111i1i]

ωj

{ω0,ω1,ω2,ω3,ω4,ω5,...}={1,i,1,i,1,i,...}

Ayrıca, birliğin kökü göz önüne alındığında, eşitlik nin tuttuğu doğrudur . (Nedenini görüyor musun?)nthωj=ωnj

Ardından,

c=M1C=1nMn(w1)=14[11111i1i11111i1i][16080]=[(16+8)/4(168)/4(16+8)/4(168)/4]=[6262]

Böylece, polinom 1 elde edilir : Inversion Formula pg 73, Dasgupta et. ark. (C) 2006

C=AB=6+2x+6x2+2x3

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.