Tunjukkan cara melakukan FFT dengan tangan

27

Katakanlah Anda memiliki dua polinomial: dan .2 x 2 + 23+x2x2+2

Saya mencoba memahami bagaimana FFT membantu kami melipatgandakan polinomial ini. Namun, saya tidak dapat menemukan contoh yang berhasil. Dapatkah seseorang menunjukkan kepada saya bagaimana algoritma FFT akan melipatgandakan polinomial ini. (Catatan: tidak ada yang istimewa dari polinomial ini, tetapi saya ingin membuatnya sederhana agar lebih mudah diikuti.)

Saya telah melihat algoritma dalam pseudocode, tetapi semuanya tampaknya memiliki masalah (tidak menentukan apa input seharusnya, variabel yang tidak ditentukan). Dan yang mengejutkan, saya tidak dapat menemukan di mana ada orang yang benar-benar berjalan (dengan tangan) contoh mengalikan polinomial menggunakan FFT.

lars
sumber
2
Wikipedia menyimpan gambar yang bagus ini untuk integer-multiplikasi melalui FFT, tapi saya pikir langkah demi langkah yang bahkan lebih eksplisit bisa membantu.
Realz Slaw

Jawaban:

27

Misalkan kita menggunakan akar keempat dari persatuan, yang sesuai dengan mengganti untuk . Kami juga menggunakan decimation-in-time daripada decimation-in-frequency dalam algoritma FFT. (Kami juga menerapkan operasi pembalikan bit dengan mulus.)1,i,1,ix

Untuk menghitung transformasi polinomial pertama, kita mulai dengan menulis koefisien: Transformasi Fourier dari koefisien genap adalah , dan koefisien ganjil adalah . (Transformasi ini hanya .) Oleh karena itu transformasi polinomial pertama adalah Ini diperoleh dengan menggunakan , . (Dari perhitungan faktor dua arah).

3,1,0,0.
3,03,31,01,1a,ba+b,ab
4,3+i,2,3i.
X0,2=E0±O0X1,3=E1iO1

Mari kita lakukan hal yang sama untuk polinomial kedua. Koefisiennya adalah Koefisien genap mentransformasikan ke , dan koefisien ganjil mentransformasikan menjadi . Oleh karena itu transformasi polinomial kedua adalah

2,0,2,0.
2,24,00,00,0
4,0,4,0.

Kami memperoleh transformasi Fourier dari polinomial produk dengan mengalikan dua transformasi Fourier secara langsung: Masih harus menghitung transformasi Fourier terbalik. Koefisien genap invers-transform menjadi , dan koefisien ganjil invers-transform menjadi . (Transformasi terbalik adalah ) Oleh karena itu transformasi polinomial produk adalah Ini diperoleh dengan menggunakan , . Kami telah mendapatkan jawaban yang diinginkan

16,0,8,0.
16,812,40,00,0x,y(x+y)/2,(xy)/2
6,2,6,2.
X0,2=(E0±O0)/2X1,3=(E1iO1)/2
(3+x)(2+2x2)=6+2x+6x2+2x3.

Yuval Filmus
sumber
Bagaimana Anda mencapai 6,2 6, 2?
lars
Saya memberikan rumus: , , di mana ( ) adalah kebalikannya transformasi dari koefisien genap (ganjil), diperoleh melalui rumus . Silakan lihat jawabannya lagi - semua perhitungan ada di sana. X 1 , 3 = ( E 1i O 1 ) / 2 E 0 , E 1 O 1 , O 2 x , y ( x + y ) / 2 , ( x - y ) / 2X0,2=(E0±O2)/2X1,3=(E1iO1)/2E0,E1O1,O2x,y(x+y)/2,(xy)/2
Yuval Filmus
Mengapa Anda menggunakan koefisien genap dua kali? 3,3 -> 3,3,3,3. -> 3 + 1, 3-i, 3 + -1,3 - i?
Aage Torleif
Bagaimana rumus ini untuk dan meluas ke derajat yang lebih tinggi? Apakah tanda plus / minus terus terbalik? Misalnya apa jadinya untuk ? X 1 , 3 X 0 , 2 , 4X0,2X1,3X0,2,4
Bobby Lee
@ Bobbyee Saya mendorong Anda untuk membaca beberapa literatur tentang FFT.
Yuval Filmus
7

Tentukan polinomial, di mana deg(A) = qdan deg(B) = p. The deg(C) = q + p.

Dalam hal ini deg(C) = 1 + 2 = 3,.

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

Kita dapat dengan mudah menemukan C dalam waktu dengan perkalian koefisien-koefisien kasar. Dengan menerapkan FFT (dan FFT terbalik), kita dapat mencapai ini dalam waktu . Secara eksplisit:O(n2)O(nlog(n))

  1. Ubah representasi koefisien A dan B menjadi representasi nilainya. Proses ini disebut evaluasi . Melakukan Divide-and-Conquer (D&C) untuk ini akan membutuhkan waktu .O(nlog(n))
  2. Lipat gandakan komponen-polinomial dalam representasi nilainya Ini mengembalikan representasi nilai C = A * B. Ini membutuhkan waktu .O(n)
  3. Balikkan C menggunakan FFT terbalik untuk mendapatkan C dalam representasi koefisiennya. Proses ini disebut interpolasi dan juga membutuhkan waktu .O(nlog(n))

Melanjutkan bersama, kami mewakili setiap polinomial sebagai vektor yang nilainya adalah koefisiennya. Kami mengisi vektor dengan 0 hingga kekuatan terkecil dari dua, . Jadi . Memilih kekuatan dua memberi kita cara untuk menerapkan algoritme divide-and-menaklukkan kami secara rekursif.n=2k,ndeg(C)n=4

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

Biarkan menjadi representasi nilai dari A dan B, masing-masing. Perhatikan bahwa FFT (Fast Fourier Transform ) adalah transformasi linear ( peta linear ) dan dapat direpresentasikan sebagai matriks, . DemikianA,B MM

SEBUAH=M.SebuahB=M.b

Kami mendefinisikan mana adalah akar kompleks akar kompleks persatuan. Perhatikan , dalam contoh ini. Perhatikan juga bahwa entri pada baris dan kolom adalah . Lihat lebih lanjut tentang matriks DFT di siniM.=M.n(ω)ωnth j t h k t h ω j k nn = 4jthkthωnjk

M.4(w)=[111...11ω1ω2...ωn-11ω2ω4...............ωjk...1ωn-1ω2(n-1)...ω(n-1)(n-1)]=[11111ωω2ω31ω2ω4ω61ω3ω6ω9]

Karena akar persatuan , kami memiliki persamaan kesetaraan yang diurutkan:ω4=4th

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

Ini dapat divisualisasikan sebagai pengulangan melalui akar dari lingkaran unit dalam arah berlawanan arah jarum jam .

Perhatikan juga mod nsifatnya, yaitu danω6=ω6modn=ω2=-1-saya=ω3=ω3+n

Untuk menyelesaikan langkah 1 ( evaluasi ) kami menemukan dengan melakukanSEBUAH,B

SEBUAH=M.Sebuah=[11111ωω2ω31ω2ω4ω61ω3ω6ω9][3100]=[3+13+1ω3+ω23+ω3]=[43+saya23-saya]B=M.b=[11111ωω2ω31ω2ω4ω61ω3ω6ω9][2020]=[2+22+2ω22+2ω42+2ω6]=[4040]

Langkah ini dapat dicapai dengan menggunakan algoritma D&C (di luar cakupan jawaban ini).

Multiply komponen (langkah 2)SEBUAHB

SEBUAHB=[43+saya23-saya][4040]=[16080]=C

Akhirnya, langkah terakhir adalah merepresentasikan C 'menjadi koefisien. Melihat

C=M.cM.-1C=M.-1M.cc=M.-1C

Perhatikan 1 dan .M.n-1=1nM.n(ω-1)ωj=-ωn/2+jωj=-ωn/2+j

M.n-1=14[11111ω-1ω-2ω-31ω-2ω-4ω-61ω-3ω-6ω-9]=14[11111-saya-1saya1-11-11saya-1-saya]

ω-j dapat divisualisasikan sebagai iterasi dari akar lingkaran unit ke arah searah jarum jam .

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

Juga, benar bahwa, mengingat akar persatuan , persamaan berlaku. (Apakah kamu mengerti mengapa?)nthω-j=ωn-j

Kemudian,

c=M.-1C=1nM.n(w-1)=14[11111-saya-1saya1-11-11saya-1-saya][16080]=[(16+8)/4(16-8)/4(16+8)/4(16-8)/4]=[6262]

Jadi, kita mendapatkan polinomial 1 : Formula Pembalikan pg 73, Algoritma oleh Dasgupta et. Al. (C) 2006

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

j__gt
sumber