Покажіть, як робити FFT вручну


27

Скажімо, у вас є два многочлени: 3+х і 2х2+2 .

Я намагаюся зрозуміти, як FFT допомагає нам множити ці два многочлени. Однак я не можу знайти жодних відпрацьованих прикладів. Чи може мені хтось показати, як алгоритм FFT перемножував ці два многочлени. (Примітка. У цих поліномах немає нічого особливого, але я хотів би зробити його простим, щоб полегшити його слідування.)

Я переглянув алгоритми в псевдокоді, але всі вони, мабуть, мають проблеми (не вказуйте, яким повинен бути вхід, не визначені змінні). І дивно, що я не можу знайти, де хтось насправді пройшов (вручну) приклад множення поліномів за допомогою FFT.


2
Вікіпедія зберігає це приємне зображення для цілого множення через FFT, але я думаю, що ще більш чіткий крок за кроком може бути корисним.
Realz Slaw

Відповіді:


27

Припустимо, ми використовуємо четверте коріння єдності, яке відповідає підстановці 1,i,1,i для x . Ми також використовуємо децимацію в часі, а не децимацію за частотою в алгоритмі FFT. (Ми також безпроблемно застосовуємо операцію обернення біту.)

Для того , щоб обчислити перетворення першого полінома, ми починаємо писати коефіцієнти:

3,1,0,0.
Перетворення Фур'є парних коефіцієнтів 3,0 в 3,3 і непарних коефіцієнтів 1,0 є 1,1 . (Це перетворення просто a,ba+b,ab .) Тому перетворення першого многочлена дорівнює
4,3+i,2,3i.
Це отримують, використовуючиX0,2=E0±O0 ,X1,3=E1iO1 . (З подвійного обчислення фактора).

Зробимо те ж саме для другого многочлена. Коефіцієнти

2,0,2,0.
Парні коефіцієнти 2,2 перетворюють на 4,0 , а непарні коефіцієнти 0,0 трансформують в 0,0 . Тому перетворення другого многочлена дорівнює
4,0,4,0.

Ми отримуємо перетворення Фур'є в поліномі виробу шляхом множення двох перетворень Фур'є вгору:

16,0,8,0.
Залишається обчислити зворотне перетворення Фур'є. Непарні коефіцієнти 16,8 обернено-перетворюються на 12,4 , а непарні коефіцієнти 0,0 зворотні перетворюють на 0,0 . (Зворотне перетворення дорівнює x,y(x+y)/2,(xy)/2 ) Тому перетворення многочлена добутку дорівнює
6,2,6,2.
Це отримують, використовуючиX0,2=(E0±O0)/2 ,X1,3=(E1iO1)/2 . Ми отримали бажану відповідь
(3+x)(2+2x2)=6+2x+6x2+2x3.


як ти прийшов у 6,2 6, 2?
lars

Я дав формули: , X 1 , 3 = ( E 1i O 1 ) / 2 , де E 0 , E 1 ( O 1 , O 2 ) є обернене перетворення парних (непарних) коефіцієнтів, отримане за формулою x , y ( x + y )X0,2=(E0±O2)/2X1,3=(E1iO1)/2E0,E1O1,O2 . Подивіться, будь ласка, ще раз відповідь - всі розрахунки є. x,y(x+y)/2,(xy)/2
Yuval Filmus

Чому ви використовуєте парні коефіцієнти двічі? 3,3 -> 3,3,3,3. -> 3 + 1, 3-i, 3 + -1,3 - i?
Aage Torleif

Як ці формули для і X 1 , 3 поширюються на більш високі ступені? Чи знаки плюс / мінус просто гортають? Наприклад, що було б для X 0 , 2 , 4 ? X0,2X1,3X0,2,4
Боббі Лі

@BobbyLee Я рекомендую вам прочитати деяку літературу про FFT.
Yuval Filmus

7

Визначте многочлени, де deg(A) = qі deg(B) = p. The deg(C) = q + p.

У цьому випадку deg(C) = 1 + 2 = 3.

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

Ми можемо легко знайти C в O(n2) час множинним множенням коефіцієнтів. Застосовуючи FFT (і зворотну FFT), ми могли б досягти цього за час O(nlog(n)) . Явно:

  1. Перетворимо представлення коефіцієнта A і B у його значення. Цей процес називається оцінкою . Виконання ділення та перемоги (D&C) для цього потребує часу O(nlog(n)) .
  2. Помножимо на компоненти багаточлени в їх представленні значення. Це повертає подання значення C = A * B. Це займе O(n) час.
  3. Інвертуйте C, використовуючи зворотний FFT, щоб отримати С у його представленні коефіцієнта. Цей процес називається інтерполяцією, і він також потребує часу O(nlog(n)) .

Продовжуючи далі, ми представляємо кожен многочлен як вектор, значення якого - його коефіцієнти. Забиваємо вектор 0 до найменшої потужності двох, n=2k,ndeg(C) . При цьому n=4 . Вибір потужності двох забезпечує нам спосіб рекурсивного застосування нашого алгоритму ділення і перемоги.

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

Нехай A,B - представлення значень A і B відповідно. Зверніть увагу , що БПФ (швидке перетворення Фур'є ) являє собою лінійне перетворення ( лінійне відображення ) і може бути представлено у вигляді матриці, M . Таким чином

A=MaB=Mb

Визначимо M=Mn(ω) де ω - складні корені nth складні корені єдності. Зауважте n = 4, у цьому прикладі. Також зауважте, що запис у рядку jth та kth - ωnjk . Детальніше про матрицю DFT див. Тут

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,...}

Це можна візуалізувати як повторення через коріння одиничного кола у напрямку проти годинникової стрілки .

Також зауважте mod nприроду, тобто ω6=ω6modn=ω2=1іi=ω3=ω3+n

Для виконання кроку 1 ( оцінювання ) знаходимо A,B , виконуючи

А'=Ма=[11111ωω2ω31ω2ω4ω61ω3ω6ω9][3100]=[3+13+1ω3+ω23+ω3]=[43+i23-i]Б'=Мб=[11111ωω2ω31ω2ω4ω61ω3ω6ω9][2020]=[2+22+2ω22+2ω42+2ω6]=[4040]

Цього кроку можна досягти, використовуючи алгоритми D&C (за межами цієї відповіді).

Множення ' * B ' покомпонентно (крок 2)А'Б'

А'Б'=[43+i23-i][4040]=[16080]=С'

Нарешті, останній крок - представити C 'на коефіцієнти. Зауважте

С'=МcМ-1С'=М-1Мcc=М-1С'

Помітка Мн-1=1нМн(ω-1)1іωj=-ωн/2+j.

Мн-1=14[11111ω-1ω-2ω-31ω-2ω-4ω-61ω-3ω-6ω-9]=14[11111-i-1i1-11-11i-1-i]

ω-j можна візуалізувати як повторення через коріння одиничного кола загодинниковою стрілкою.

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

Також вірно, що з огляду на нтгод корінь єдності дотримується рівність ω-j=ωн-j . (Ви бачите чому?)

Тоді

c=М-1С'=1нМн(ш-1)=14[11111-i-1i1-11-11i-1-i][16080]=[(16+8)/4(16-8)/4(16+8)/4(16-8)/4]=[6262]

Таким чином, ми отримуємо многочлен

С=АБ=6+2х+6х2+2х3
1 : Формула інверсії pg 73, Алгоритми Дасгупта та ін. ін. (С) 2006р

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.