7. előadás Gyors szorzás, gyors Fourier-transzformáció Dr. Kallós Gábor 2016 2017 1 Tartalom Műveletek nagypontosságú egészekkel Hagyományos szorzó algoritmus Változat: polinomok szorzása Hagyományos rekurzív szorzó algoritmus A mester-tétel Karacuba módszere Strassen mátrixszorzó eljárása Szorzás moduláris reprezentációban Hatékony odakonverzió Horner-elrendezés Diszkrét Fourier-transzformáció Gyors Fourier-transzformáció Inverz Fourier-transzformáció Gyors polinomszorzás FFT-vel FFT alkalmazások Irodalom 2
Műveletek nagypontosságú egészekkel Eml.: nagypontosságú egész reprezentációja a = a 0 + a 1 B + a 2 B 2 + + a n 1 B n 1 + a n B n, ahol minden a i < B. Itt B a nagypontosságú számrendszer alapja, úgy, hogy biztosan tárolható legyen hagyományos egészként Legyen a és b két nagypontosságú egész, n és m jeggyel: a = a 0 + a 1 B + a 2 B 2 + + a n 1 B n 1 b = b 0 + b 1 B + b 2 B 2 + + b m 1 B m 1 Egyszerű műveletek (+ és ) megvalósítása: elemenként, balról kezdve (mint a 10-es számrendszerben) Csak az átvitelek (0 vagy 1-es jegy) kezelése jelent gondot Műveletigény: O(max(m, n)) Szorzás művelet: az eredmény egy legf. m + n jegyű nagypontosságú egész Hagyományos ( iskolás ) szorzó eljárás: Mint a 10-es szr-beli egészeknél, minden i-re a-t megszorozzuk b i -vel, kezeljük az átvitelt (ha kell), és összeadjuk a részösszegeket Komoly hátrány (ha a számok nagyok): a számítás végéig tárolni kell az összes részösszeget Javítsunk ezen! 3 Hagyományos szorzó algoritmus Módosítás: helyben végrehajtott számítások (minden részszorzás után egy összeadás) Legyen b (0) = 0, b (1) = b 0, b (2) = b 0 + b 1 B, azaz minden 1 k m-re legyen b (k) = b 0 + b 1 B + + b k 1 B k 1 (azaz b-t folyamatosan dolgozzuk fel), a b (k) = c 0 (k) + c 1 (k) B + + c n+k 1 (k) B n+k 1. (Itt n és k jegyű egészekkel végzünk műveletet.) Ekkor c = a b (m) (amikor már a teljes b-t feldolgoztuk). Minden k-ra teljesül, hogy a b (k+1) = a (b (k) + b k+1 B k+1 ) = a b (k) + a b k+1 B k+1, és így a c 0 (k), c 1 (k),, c k (k) jegyek változatlanok maradnak (!) Műveletigény: O(m n) Feladat: Nézzük meg az algoritmus működését az a = 1 234 567 és b = 2 345 678 számokkal, B = 1000 választásával! 4
Polinomok szorzása Az R[x] polinomgyűrűben (ahol R gyűrű és x ismeretlen) a klasszikus aritmetikai műveletek az ismert módon hajtódnak végre Legyen a(x) és b(x) két polinom, n és m fokkal: a(x) = a 0 + a 1 x + a 2 x 2 + + a n x n b(x) = b 0 + b 1 x + b 2 x 2 + + b m x m Lényegében minden ugyanúgy, mint a nagypontosságú egészeknél Az összeg elemenként számolandó: a(x) + b(x) = a 0 + b 0 + (a 1 + b 1 )x + (a 2 + b 2 )x 2 + + (a k + b k )x k, ahol k = max(m, n) Műveletigény: O(max(m, n)) A szorzásra: a(x) b(x) = h 0 + h 1 x + h 2 x 2 + + h m+n x m+n, ahol h i = a i b 0 + + a 0 b i Műveletigény: O(m n) Próbáljuk ki ezt két max. negyedfokú polinomra! Ha az osztás is elvégezhető, akkor q és r meghatározása a = b q + r, (0 r < b, ill. 0 deg(r) < deg(b)) esetén: Az osztó algoritmus m n + 1 lépést tesz, mindegyik lépés O(m n) művelet Műveletigény végül: O((m n) n) 5 Hagyományos rekurzív szorzó algoritmus Gyors rekurzív szorzó eljárás polinomokra (Karacuba) Ez volt az első ismert O(n 2 )-nél gyorsabb eljárás (1962) Mi nagypontosságú egészekre mutatjuk be (lényegében uaz) A hagyományos rekurzív szorzó eljárás Legyen x és y n jegyű nagypontosságú egész (B alappal), és vágjuk szét őket két n/2 hosszú (felső és alsó) részre azaz x = a b, y = c d, x = a B n/2 + b, y = c B n/2 + d. A szorzat klasszikus alakja: x y = a c B n + (a d + b c) B n/2 + b d Rekurzívan számoljuk ki a költséget: Legyen T(n) a két n hosszú egész összeszorzásának költsége, ez kiváltható négy db n/2 hosszú egészekkel végrehajtható szorzással és egy db ilyen összeadással T(1) = 1, T(n) = 4 T(n/2) + c n, valamilyen c konstansra Ebből n = 2 m -re: T(n) = T(2 m ) = 4 T(2 m 1 ) + c 2 m = 4 (4 T(2 m 2 ) + c 2 m 1 ) + c 2 m = = 4 2 T(2 m 2 ) + c 2 m (1 + 2) = = 4 m T(1) + c 2 m (1 + 2 + + 2 m 1 ) = = C (2 m ) 2 = C n 2 A költség kiszámításához használhatjuk a mester-tételt 6
Hagyományos rekurzív szorzó algoritmus A mester-tétel Rekurzív algoritmusok átlagos idejű lépésszámának meghatározására szolgál, T(n) kiszámítása a cél Az algoritmus futásidő összefüggése megadható a következő rekurzív képlettel: T(n) = a T(n/b) + f(n), ahol f(n): a rekurzív eljárás minden hívásakor végrehajtott műveletek száma (n függvényében) a: részfeladatok száma, b: a részfeladatok mérete hányadrésze az egésznek (a 1, b > 1) T(n/b): egy részfeladat költsége Ekkor Az alkalmazáshoz a konkrét feladat leírása alapján meg kell határoznunk az a, b és f(n) értékét (log b a-t), majd el kell döntenünk, hogy melyik esetbe tartozik a feladatunk Nálunk most: T(n) = 4 T(n/2) + c n, azaz a = 4, b = 2, log 2 4 = 2, c n-re igaz, hogy O(n 2 ε )-os, így az 1. eset áll fent Tehát T(n) = c n 2 7 Karacuba módszere Karacuba észrevette, hogy az x y szorzat a hagyományos képlet helyett számolható x y = a c B n + (a c + b d + (a b)(d c)) B n/2 + b d módon is. Noha ez bonyolultabbnak tűnik, mint a klasszikus képlet, mégis ez csak 3 szorzást és 4 összeadást igényel! Így a költség: T(n) = 3 T(n/2) + c n, azaz a = 3, b = 2, log 2 3 = 1,59, c n-re igaz, hogy O(n 1,59 ε )-os, így az 1. eset áll fent Tehát T(n) = log 3 1,59 c n 2 c n Megj.: c nagyobb, mint az előbb (a több + miatt) a módszert csak nagyobb számokra érdemes alkalmazni 8
Strassen mátrixszorzó eljárása Legyen c11 c12 a11 a12 b11 b12 = c21 c22 a21 a22 b21 b22 A hagyományos rekurzív szorzó eljárás Az n n-es mátrixokra mind a hagyományos sima (már tudjuk), mind a hagyományos rekurzív szorzó eljárás költsége c n 3 Itt ugyanis összesen 8 db feleakkora méretű szorzást végzünk el (+ 4 db összeadást): c 11 = a 11 b 11 + a 12 b 21 ; c 12 = a 11 b 12 + a 12 b 22 ; c 21 = a 21 b 11 + a 22 b 21 ; c 22 = a 21 b 11 + a 22 b 21 Ennek költsége pedig (mester-tétel): T(n) = 8 T(n/2) + c n 2, és log 2 8 = 3, c n 2 -re igaz, hogy O(n 3 ε )-os, így T(n) = c n 3 Karacuba módszerének hatására Strassen észrevette, hogy a c ij részmátrixok kiszámíthatók 8 helyett 7 db (!) kisebb méretű szorzással is: Legyen ugyanis u 0 = (a 11 + a 22 ) (b 11 + b 22 ), u 1 = (a 21 + a 22 ) b 11, u 2 = a 11 (b 12 b 22 ), u 3 = a 22 ( b 11 + b 21 ), u 4 = (a 11 + a 12 ) b 22, u 5 = ( a 11 + a 21 ) (b 11 + b 12 ), u 6 = (a 12 a 22 ) (b 21 + b 22 ) Ekkor c 11 = u 0 + u 3 u 4 + u 6, c 12 = u 2 + u 4, c 21 = u 1 + u 3, c 22 = u 0 + u 3 u 4 + u 6 Ez ellenőrizhető akár Maple-ben vagy Matlabban is Az összeadások száma ugyan 4-ről 18-ra nő, de nagyobb mátrixokra még így is jól járunk Ennek költsége: T(n) = 7 T(n/2) + c n 2, és log 2 7 = 2,81, c n 2 -re igaz, hogy O(n 2,81 ε )-os, így log 7 2,81 T(n) = c n 2 c n 9 Moduláris szorzás Cél: szeretnénk a nagypontosságú egészek (polinomok) szorzásának költségét még jobban megjavítani Létezik olyan környezet, ahol a szorzás költsége is csak annyi, mint az összeadásé és a kivonásé! A nagypontosságú egészet úgy tekintjük, mint modulárisan reprezentált számok egy vektorát Legyenek m 0, m 1,, m n páronként relatív prím egészek, és legyen m = m 0 m 1 m n. A kínai maradéktétel szerint minden x < m nagypontosságú egész egyértelműen reprezentálható egy x = (x 0, x 1,, x n ) listával, ahol x i = x mod m i. Legyen most y egy másik nagypontosságú egész, amelyre y = (y 0, y 1,, y n ) Ha x + y < m, akkor az összeg egyértelműen reprezentálható x + y = (t 0, t 1,, t n ) alakban, ahol t i = x i + y i mod m i. Hasonlóan, ha x y < m, akkor a szorzat egyértelműen reprezentálható x y = (t 0, t 1,, t n ) alakban, ahol t i = x i y i mod m i. Példa Legyen m = 3 5, x = 2, y = 4. A reprezentációk: x = (2, 2), y = (1, 4), x y = (2, 3). Így x y a normál reprezentációban: A szorzat 2 (mod 3), azaz lehet 2, 5, 8, 11, 14 A szorzat 3 (mod 5), azaz lehet 3, 8, 13; tehát 8 az eredmény. Gond: a moduláris reprezentációba történő oda- és visszakonverzió költsége általános esetben nagy (akár c n 2 -nél is nagyobb), így a módszert nem éri meg használni 10
Hatékony odakonverzió Célkitűzés: Adott egy x = (x 0, x 1,, x n-1 ) alappont-lista és a = (a 0, a 1,, a n-1 ) nagypontosságú egész (vagy polinom, együtthatókkal). Szeretnénk előállítani hatékonyan a T a = â transzformációs szorzatot, ahol Azaz Vagy T ˆ ˆ ˆ x,,, 0, 1,, 1 0, 1, 0 x1 K x a a K a 1 = n a a Ka n n 1 A T transzformációs mátrix az ún. Vandermonde-mátrix Végül az â vektor már moduláris reprezentációban van, és így egy másik bekódolt vektorral gyorsan összeszorozható ( )( ) ( ) 11 Hatékony odakonverzió A fentiekből adódik, hogy minden i-re n 1 aˆ i = a0 + a1xi + L + an 1xi n 1 Az a( x) = a0 + a1x + L + a n 1x helyettesítéssel látjuk, hogy a probléma lényegében egy max. (n 1)-edfokú polinom kiértékelése az (x 0, x 1,, x n-1 ) helyeken Hogyan tudunk hatékonyan polinomot kiértékelni? A hagyományos direkt módszer kevésbé hatékony ( pazarló ) Ígéretes ötlet: Horner-elrendezés (egymásba ágyazós kiértékelés) a(x) = a 0 + x (a 1 + x (a 2 + x (a 3 + ))) = (( (a n-1 x + a n-2 )x + + a 2 )x + a 1 )x + a 0 Az f(x) függvényérték kiszámításakor az összeadásokon kívül csak az x tényezővel való szorzás lép fel (Az eljárás a deriváltfv. értékének kiszámítására is használható, lásd Excel példa) A Horner-séma műveletigénye egy pontra O(n), azaz végeredményben összesen O(n 2 ) De: nekünk még ennél is jobb (kevesebb költségű) eljárás kellene Illusztráció: Horner-kiértékelés Excellel A Solver segítségével zérushelyek megkeresésére használjuk a Horner-sémát (f(x)-re és f'(x)-re is) 12
Horner-kiértékelés 13 Hatékony odakonverzió A Horner-sémánál kisebb költségű eljárás ötlete az, hogy speciális alappontokat választunk, és ezekre a pontokra ügyes, rekurzív kiértékelést alkalmazunk n 1 Észrevétel: ha a( x) = a -ben n páros, akkor a(x) átírható a(x) = b(x 2 ) + x c(x 2 0 + a1x + L + a n 1x ) alakba (i), ahol n / 2 1 n / 2 1 b( y) = a és 0 + a2 y + L+ a n 2 y c( y) = a1 + a3 y + L+ a n 1 y Itt b(y) és c(y) foka legfeljebb fele a(x) fokának Segédállítás (lemma) 1.: Legyenek {x 0, x 1,, x n 1 } olyan alappontok, amelyek kielégítik a szimmetria feltételt, azaz amelyekre x (n/2)+i = x i, i {0, 1,, n/2 1}-re. (ii) Legyen T(n) az eredeti max. (n 1)-edfokú polinom kiértékelésének költsége az alappontokon. Ekkor T(1) = 0 és T(n) = 2 T(n/2) + c (n/2). Biz.: (ii)-ből adódik, hogy (x 0 ) 2 = (x (n/2) ) 2, (x 1 ) 2 = (x (n/2) +1 ) 2,, (x (n/2) 1 ) 2 = (x (n 1) ) 2, azaz csak n/2 négyzetre emelést kell elvégezni. Az eredeti a(x) polinom az {x 0, x 1,, x n 1 } alappontok felett kiértékelhető úgy, hogy b(y)-t és c(y)-t értékeljük ki az {(x 0 ) 2, (x 1 ) 2,, (x (n/2) 1 ) 2 } alappontok felett (n/2 db), és végül felhasználjuk (i)-t. Ez eddig 2 T(n/2), ezen felül további költség az n/2 db szorzás a négyzetre emeléseknél, plusz még n/2 db szorzás (+összeadás, kivonás) a kisebb egyenlőségek összeépítésénél. 14
Diszkrét Fourier-transzformáció A gyors Fourier-transzformáció (FFT) az előző lemmát rekurzív módon használja fel Ehhez szükségünk van arra, hogy a szimmetria tulajdonság az {(x 0 ) 2, (x 1 ) 2,, (x (n/2) 1 ) 2 } alappontok felett (n/2 db) is érvényes maradjon, sőt, a továbbiakban is (n/4 db stb.) Hogyan lehet ilyen (nagyon speciális) alappontokat találni? Megoldás: olyan testek felett dolgozunk, ahol vannak primitív n. egységgyökök Definíciók: Az F test egy ω elemét primitív n. egységgyöknek nevezzük, ha ω n = 1, de ω k 1, minden k < n-re. Ha ω primitív n. egységgyök, akkor az {1, ω, ω 2,, ω n 1 } pontokat (n db) Fourier-pontoknak nevezzük. A Fourier-pontok felett végrehajtott T transzformációt (eml.: T a = â; tdk. a polinom kiértékelése) diszkrét Fourier-transzformációnak (DFT) nevezzük. A 11. oldal alapján írjuk fel a DFT trafó mátrixát! (ω felhasználásával) A primitív egységgyökök létezéséről Állítás: Ha p prím(hatvány), akkor a Z p véges test pontosan akkor tartalmaz primitív n. egységgyököt, ha n (p 1) (Megj.: F q is értelmezhető, ha q prímhatvány, és ott is hasonló eredmény érvényes) 15 Diszkrét Fourier-transzformáció Példa 1. A komplex számok teste felett az n. egységgyököket az alapvektor 2π/n-es szögű forgatásaival kapjuk meg (e 2π i = 1 alapján a 2π/n-es forgatáshoz e 2π i/n tartozik) Rajzoljuk le ezt! Így pl. az e π i/4 = (1 + i)/ 2 primitív 8. egységgyök, ugyanakkor e π i/2 = i-re szintén teljesül, hogy ω 8 = 1, de itt ω 4 = 1 is igaz, ezért i nem primitív 8. egységgyök Példa 2. A Z 17 véges testben a 4 negyedik egységgyök, mert 4 4 = 256 = 1 (mod 17). Egyúttal primitív is, mert 4 2 = 16 és 4 3 = 13 (mod 17). A Fourier-pontok megfelelő halmaza: {1, 4, 4 2, 4 3 } = {1, 4, 16, 13} Az ehhez tartozó T (1, 4, 16, 13) transzformáció (DFT) a (Z 17 ) 4 vektorteret önmagára képezi le, mátrixa pedig 1 1 1 4 1 16 1 13 1 13 16 4 Ellenőrizzük, hogy ezekre a pontokra teljesül a szimmetria tulajdonság! 1 16 1 16 16
Diszkrét Fourier-transzformáció Segédállítás 2.: Ha ω primitív n. egységgyök, akkor az n db Fourier-pont kielégíti a (ii) szimmetria feltételt (azaz: x (n/2)+i = x i ) Bizonyítás: Mivel ω primitív n. egységgyök, ezért (ω n/2+i ) 2 = ω n (ω i ) 2 = (ω i ) 2. Ebből (ω n/2+i ω i ) (ω n/2+i + ω i ) = ((ω n/2+i ) 2 (ω i ) 2 ) = 0. Ha ω n/2+i ω i = 0 lenne, akkor kiemelés után ω n/2 = 1 adódna, ami ellentmond az alapfeltételnek (prim. egységgy.). Ezért ω n/2+i + ω i = 0, és ez a Fourier-pontokra megfelel (ii)-nek. Segédállítás 3.: Legyen ω primitív n. egységgyök, és n legyen páros. Ekkor a) ω 2 primitív n/2. egységgyök; b) az {1, ω 2, ω 4,, ω n } n/2 db négyzetszám kielégíti a szimmetria feltételt. Bizonyítás: Mivel (ω 2 ) n/2 = ω n = 1, ezért ω 2 egy n/2. egységgyök. Tegyük fel, hogy nem primitív. Ekkor található k < n/2 úgy, hogy (ω 2 ) k = 1. Így viszont ω 2k = 1, úgy, hogy 2k < n, azaz ekkor ω nem lenne primitív n. egységgyök. A b) állítás az előző lemmából adódik (n helyére írjunk n/2-őt). A lemmából következik, hogy ha ω primitív n. egységgyök, akkor az ω által előállított Fourier-pontok halmazán az a(x) = b(x 2 ) + x c(x 2 ) egyenlőség rekurzívan kiértékelhető 17 Diszkrét Fourier-transzformáció Példa A Z 41 véges testben a 14 primitív 8. egységgyök A megfelelő Fourier-pontok: {1, 14, 9, 3, 1, 14, 9, 3} (Pl. 14 2 = 32 és 14 3 = 38 (mod 41)) A szimmetria feltétel teljesül A 14 2 = 9 egy primitív 4. egységgyök, az {1, 9, 1, 9} Fourier-pontokkal A szimmetria feltétel itt is teljesül Végül, 9 2 = 1 egy primitív 2. egységgyök, az {1, 1} Fourier-pontokkal A szimmetria feltétel itt is teljesül Tétel: Legyen ω primitív n. egységgyök. Ekkor az n db Fourier-pont által meghatározott diszkrét Fourier-transzformáció (DFT; eml.: T a = â) összesen O(n log n) idő alatt végrehajtható. Bizonyítás: Az igazolást az n = 2 m esetre végezzük el. A 3. segédállításból következik, hogy a T(n) költségfüggvényre T(1) = 0, T(2 k ) = 2 T(2 k 1 ) + c 2 k 1, k 1-re. Ekkor T(n) = T(2 m ) = 2 T(2 m 1 ) + c 2 m 1 = 2 2 T(2 m 2 ) + c 2 m 1 2 = = 2 3 T(2 m 3 ) + c 2 m 1 3 = = 2 m T(1) + c 2 m 1 m = c 2 m 1 m = c n/2 log n. Azt a módszert, amelyet a DFT rekurzív alkalmazásával kapunk az a(x) Fouriertranszformáltjának meghatározására, gyors Fourier-transzformációnak (FFT) nevezzük 18
Diszkrét Fourier-transzformáció Példa Legyen a(x) = 5x 6 + x 5 + 3x 3 + x 2 4x + 1, Z 41 [x]-beli polinom. Az a(x) polinomot ki akarjuk értékelni az {1, 14, 9, 3, 1, 14, 9, 3} Fourier-pontok felett. Eml.: a Z 41 véges testben a 14 primitív 8. egységgyök Ez a feladat lényegében ugyanaz, mint a(x) = b(y) + x c(y); y = x 2 felhasználásával b(y) = 5y 3 + y + 1 és c(y) = y 2 + 3y 4 kiértékelése az {1, 9, 1, 9} Fourier-pontok felett A b(y) = d(z) + y e(z); z = y 2 átírással d(z) = 1, e(z) = 5z + 1, és így b(y) kiértékelése a fenti 4 pont felett ugyanaz, mint d(z) és e(z) kiértékelése az {1, 1} Fourier-pontok felett. Hasonló érvelés alkalmazható c(y) kiértékelésére is. Az eredmény felépítése: d(1) = 1, e(1) = 6, ebből b(1) = d(1) + 1 e(1) = 7, b( 1) = d(1) + ( 1) e(1) = 5 d( 1) = 1, e( 1) = 4, ebből b( 9) = d( 1) + ( 9) e( 1) = 1 + 36 = 37 = 4 (mod 41), b(9) = d( 1) + 9 e( 1) = 1 36 = 35 = 6 (mod 41) Hasonló módon (részletezés nélkül) c(1) = 0, c( 1) = 2, c( 9) = 9, c(9) = 19 Feljebb lépve, a(x) Fourier-transzformáltjának elemei is számolhatók, pl. a(3) = b(9) + 3 c(9) = 10, a( 3) = b(9) 3 c(9) = 19 Végül A := FFT(8, 14, a(x)) = (7, 1, 8, 19, 7, 7, 18, 10) 19 Gyors Fourier-transzformáció Algoritmus a gyors Fourier-transzformáció végrehajtására Feltétel: léteznek n-edik egységgyökök, azaz az alaptartomány támogatja a műveletsort N / 2 1 i= 0 N / 2 1 i= 0 Az eredmény felépítése: A 0 := B 0 + C 0 ; A N/2+0 := B 0 C 0 ; A 1 := B 1 + ω C 1 ; A N/2+1 := B 1 ω C 1 ; A 2 := B 2 + ω 2 C 2 ; A N/2+2 := B 2 ω 2 C 2 ; A 3 := B 3 + ω 3 C 3 ; Pl. (előző slide): a(3) = b(9) + 3 c(9), ami tdk. A 8 = B 4 ω 4 C 4, ahol n = 8 20
Inverz Fourier-transzformáció Miután elvégeztük a vektorok szorzását a moduláris reprezentációban, szeretnénk visszakonvertálni az eredményt az eredeti tartományba. Ehhez a T transzformáció 1 inverzét kell felhasználnunk, azaz T( x -et. 0, x1, K, x n 1 ) Probléma: Egy mátrix inverzének meghatározása általános esetben (pl. Gausseliminációval) O(n 3 ) időigényű/bonyolultságú feladat Szerencsére a Vandermonde-mátrix erősen speciális mátrix, így most léteznek ennél hatékonyabb módszerek is (Pl. Newton-, ill. Lagrange interpolációval O(n 2 )-re vihetjük le a költséget, igaz, még ez sem elég ) Kulcsészrevétel (részletes igazolás nélkül): a megfelelő Fourier-pontok felett képzett V mátrix inverze (az inverz diszkrét Fourier-transzformációhoz) előáll úgy, hogy V-ben minden ω i helyére ω i -t írunk, és minden koordinátát osztunk n-nel, azaz 1 2 ( n 1) 2 1 1 n 1) n 1 V(1, ω, ω, K, ω ) 1 1 1 L 1 1 1 ω ω L ω = n M M M M M ( n 1) 2( n 1) 1 ω ω L ω Így V inverze rendkívül gyorsan felírható ( n 1)( n 1) = n 1 2 ( V(1, ω, ω, K, ω ) 21 Inverz Fourier-transzformáció Példa 2. (folyt.) Eml.: a Z 17 véges testben a 4 primitív negyedik egységgyök Ekkor az inverz transzformáció egy lineáris trafó a (Z 17 ) 4 vektortérből önmagába, amelynek mátrixa 1 1 1 1 13 13 13 13 1 4 16 13 = 13 16 4 1 4 1 1 16 1 16 13 4 13 4 1 13 16 4 13 1 4 16 Definíció: Az inverz diszkrét Fourier-transzformáció (IDFT) az {1, ω, ω 2,, ω n 1 } Fourier-pontok felett S n 1 q0, q1, K, q 1,,, n 1 = q0, q1, K, qn n ω K ω ahol 1 1 j k q j = n q k ( ω ) n 1 k= 0 i Eml.: az ismert T n a, a, K, a aˆ, aˆ, K, aˆ trafóra aˆ = ( ω ) ( ) ( ) ( ) 1 1,,, 0 1 1 = Kω n 0 1 n 1 ( ) ( ) ( ) 1 ω i a j j= 0 Tétel: a DFT és az IDFT transzformációk egymás inverzei A bizonyítást nem közöljük, csak szemléltetés: a bekonverzióra T n 1 ( ) p = q 1, ω, K, ω 1 a visszakonverzióra pedig n T 1 ( n 1) ( ) q = p 1, ω, Kω, j 22
Gyors polinomszorzás FFT-vel Ha az n-edfokú a(x) és az m-edfokú b(x) polinomokat össze akarjuk szorozni, és az F együtthatótestünk tartalmaz N-edik primitív egységgyököt (ahol N > n + m, és N 2 hatvány), akkor a gyors szorzó eljárás használható N 1 i= 0 Az eljárás végrehajtásának műveletigénye a klasszikus O(m n) helyett a fentiek szerint O((m + n) log (m + n)), bár az ordóban levő konstans nagyobb A módszert akkor éri meg használni, ha m + n 600 (Geddes) 23 Gyors polinomszorzás FFT-vel Példa Szorozzuk össze az a(x) = 3x 3 + x 2 4x + 1 és a b(x) = x 3 + 2x 2 + 5x 3 polinomot a Z 41 véges testben! Felhasználjuk a 14-et, amely itt primitív 8. egységgyök Erre teljesül a fokkorlát Külön részletezés nélkül a fentihez hasonló módon kapjuk, hogy A := FFT(8, 14, a(x)) = (1, 9, 19, 18, 3, 16, 19, 3) B := FFT(8, 14, b(x)) = (5, 5, 0, 14, 7, 6, 10, 16) Összeszorzással (moduláris repr.) C := (5, 4, 0, 6, 20, 14, 15, 7), amely a c(x) = a(x) b(x) transzformáltja (FFT-vel) C-ből c(x) előállításához használjuk az inverz transzformációt c := 8 1 FFT(8, 3, 7x 7 + 15x 6 14x 5 + 20x 4 6x 3 + 4x + 5) Ennek eredménye c := ( 3, 17, 20, 11, 13, 7, 3, 0) Így végül c(x) = 3x 6 + 7x 5 + 13x 4 11x 3 + 20x 2 + 17x 3 24
FFT alkalmazás Fourier-analízis Alkalmazása: tipikusan periodikus jelekből vett minta (idősor) elemzésére Lépések Adatok transzformációja FFT módszerrel a komplex frekvenciatartományba Nem kívánt frekvenciájú komponensek kizárása, pl. sávszűréssel Inverz transzformációval a transzformált és szűrt adatokból visszakapjuk az eredeti jel megszűrt összetevőjét Példa Az időfüggvényből 2 hatvány (pl. n = 512) elemszámú mintát veszünk egyenlő lépésközzel, τ időközönként (ez 1/τ mintavételi frekvenciát jelent) A frekvenciaspektrum F = 1/τ frekvenciánként ismétlődik n elemű minta esetén ez f = F/n frekvencia-felbontású spektrumot jelent (egy periódusra) Az időablak T = nτ (tfh. a jel eszerint periodikus), és most F = 24000 Ekkor f = 24000/512 = 46,874 és τ = 1/24000 = 0,000042 és T = 0,021333 Mintánkban egy 200 Hz-es szinuszos időfüggvényre két magasabb frekvenciájú zavart ültetünk Egy 0,1 amplitúdójú 1200 Hz-es szinuszos jelet, és Egy 0,2 amplitúdójú 3000 Hz-es koszinuszos jelet adunk hozzá 25 FFT alkalmazás Fourier-analízis (folyt.) Szemléltetés Excelben Alapadatok táblázata és grafikonok F konstans külön felvéve 26
FFT alkalmazás Fourier-analízis (folyt.) Előállítjuk a zajos jel Fourier transzformáltját Ehhez az Adatelemzés menü Fourieranalízis menüpontját választjuk, a forrástartomány a (feliratos) zajos jel Elkészítjük a frekvenciatartományban a jel spektrumát Ehhez kiszámítjuk a transzformált értékek abszolút értékét és ábrázoljuk 27 FFT alkalmazás Fourier-analízis (folyt.) Az (f0 =) 1000 Hz feletti részt levágjuk a frekvenciatartományban (A szimmetria miatt f0 és F f0 közötti részt kell 0-vá tenni; az N darab spektrumvonalból csak N/2 független!) Visszatranszformálunk az időtartományba Itt is a Fourier-analízis elemző eszközt használjuk, csak be kell jelölni az inverz-transzformáció jelölőnégyzetét A szűrt jelet és összehasonlítjuk az alapjellel (grafikon) Külön köszönet: dr. Szörényi Miklós kollégámnak 28
Ajánlott irodalom Cormen, Leiserson, Rivest: Algoritmusok, Műszaki Kiadó, Budapest, 1998 (több kiadás) Geddes, Czapor, Labahn: Algorithms for Computer Algebra (6th pr./ed.), Kluwer Acad. Press, Boston, 1999 Gács Péter, Lovász László: Algoritmusok, Tankönyvkiadó, Budapest, 1978 (több kiadás) Joachim Gathen, Jürgen Gerhard: Modern Computer Algebra (3rd ed.), Cambridge Univ. Press, 2013 Donald E. Knuth: A számítógép-programozás művészete 2. (2. kiadás), Műszaki Könyvkiadó, Budapest, 1994 29