7. előadás Gyors szorzás, gyors Fourier-transzformáció Dr. Kallós Gábor 206 207
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 B + a 2 B 2 + + a n B n + 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 B + a 2 B 2 + + a n B n b = b 0 + b B + b 2 B 2 + + b m B m Egyszerű műveletek (+ és ) megvalósítása: elemenként, balról kezdve (mint a 0-es számrendszerben) Csak az átvitelek (0 vagy -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 0-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 () = b 0, b (2) = b 0 + b B, azaz minden k m-re legyen b (k) = b 0 + b B + + b k B k (azaz b-t folyamatosan dolgozzuk fel), a b (k) = c 0 (k) + c (k) B + + c n+k (k) B n+k. (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+) = a (b (k) + b k+ B k+ ) = a b (k) + a b k+ B k+, és így a c 0 (k), c (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 = 234 567 és b = 2 345 678 számokkal, B = 000 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 x + a 2 x 2 + + a n x n b(x) = b 0 + b 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 + b )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 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 + 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 (962) 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() =, 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 ) + c 2 m = 4 (4 T(2 m 2 ) + c 2 m ) + c 2 m = = 4 2 T(2 m 2 ) + c 2 m ( + 2) = = 4 m T() + c 2 m ( + 2 + + 2 m ) = = 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, b > ) 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. 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 =,59, c n-re igaz, hogy O(n,59 ε )-os, így az. eset áll fent Tehát T(n) = c n log 2 3 c n,59 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 c c2 a a2 = b b c2 c22 a2 a22 b2 b 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 = a b + a 2 b 2 ; c 2 = a b 2 + a 2 b 22 ; c 2 = a 2 b + a 22 b 2 ; c 22 = a 2 b + a 22 b 2 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 + a 22 ) (b + b 22 ), u = (a 2 + a 22 ) b, u 2 = a (b 2 b 22 ), u 3 = a 22 ( b + b 2 ), u 4 = (a + a 2 ) b 22, u 5 = ( a + a 2 ) (b + b 2 ), u 6 = (a 2 a 22 ) (b 2 + b 22 ) Ekkor c = u 0 + u 3 u 4 + u 6, c 2 = u 2 + u 4, c 2 = u + 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 8-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,8, c n 2 -re igaz, hogy O(n 2,8 ε )-os, így log 7 2,8 T(n) = c n 2 c n 2 22 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,, m n páronként relatív prím egészek, és legyen m = m 0 m 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,, 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,, y n ) Ha x + y < m, akkor az összeg egyértelműen reprezentálható x + y = (t 0, t,, 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,, 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 = (, 4), x y = (2, 3). Így x y a normál reprezentációban: A szorzat 2 (mod 3), azaz lehet 2, 5, 8,, 4 A szorzat 3 (mod 5), azaz lehet 3, 8, 3; 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 0
Hatékony odakonverzió Célkitűzés: Adott egy x = (x 0, x,, x n- ) alappont-lista és a = (a 0, a,, a n- ) 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,,, 0,, 0 x K x a a K a = n a a Ka n n 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ó ( )( ) ( )
Hatékony odakonverzió A fentiekből adódik, hogy minden i-re n aˆ i = a0 + axi + L + an xi n Az a( x) = a0 + ax + L + a n x helyettesítéssel látjuk, hogy a probléma lényegében egy max. (n )-edfokú polinom kiértékelése az (x 0, x,, x n- ) 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 + x (a 2 + x (a 3 + ))) = (( (a n- x + a n-2 )x + + a 2 )x + a )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) 2
Horner-kiértékelés 3
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 É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 + ax + L + a n x ) alakba (i), ahol n / 2 n / 2 b( y) = a és 0 + a2 y + L+ a n 2 y c( y) = a + a3 y + L+ a n y Itt b(y) és c(y) foka legfeljebb fele a(x) fokának Segédállítás (lemma).: Legyenek {x 0, x,, x n } olyan alappontok, amelyek kielégítik a szimmetria feltételt, azaz amelyekre x (n/2)+i = x i, i {0,,, n/2 }-re. (ii) Legyen T(n) az eredeti max. (n )-edfokú polinom kiértékelésének költsége az alappontokon. Ekkor T() = 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 ) 2 = (x (n/2) + ) 2,, (x (n/2) ) 2 = (x (n ) ) 2, azaz csak n/2 négyzetre emelést kell elvégezni. Az eredeti a(x) polinom az {x 0, x,, x n } alappontok felett kiértékelhető úgy, hogy b(y)-t és c(y)-t értékeljük ki az {(x 0 ) 2, (x ) 2,, (x (n/2) ) 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. 4
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 ) 2,, (x (n/2) ) 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 =, de ω k, minden k < n-re. Ha ω primitív n. egységgyök, akkor az {, ω, ω 2,, ω n } 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. 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 ) (Megj.: F q is értelmezhető, ha q prímhatvány, és ott is hasonló eredmény érvényes) 5
Diszkrét Fourier-transzformáció Példa. 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 = alapján a 2π/n-es forgatáshoz e 2π i/n tartozik) Rajzoljuk le ezt! Így pl. az e π i/4 = ( + i)/ 2 primitív 8. egységgyök, ugyanakkor e π i/2 = i-re szintén teljesül, hogy ω 8 =, de itt ω 4 = is igaz, ezért i nem primitív 8. egységgyök Példa 2. A Z 7 véges testben a 4 negyedik egységgyök, mert 4 4 = 256 = (mod 7). Egyúttal primitív is, mert 4 2 = 6 és 4 3 = 3 (mod 7). A Fourier-pontok megfelelő halmaza: {, 4, 4 2, 4 3 } = {, 4, 6, 3} Az ehhez tartozó T (, 4, 6, 3) transzformáció (DFT) a (Z 7 ) 4 vektorteret önmagára képezi le, mátrixa pedig 4 6 3 3 6 4 Ellenőrizzük, hogy ezekre a pontokra teljesül a szimmetria tulajdonság! 6 6 6
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 = 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 {, ω 2, ω 4,, ω n } n/2 db négyzetszám kielégíti a szimmetria feltételt. Bizonyítás: Mivel (ω 2 ) n/2 = ω n =, 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 =. Így viszont ω 2k =, ú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ő 7
Diszkrét Fourier-transzformáció Példa A Z 4 véges testben a 4 primitív 8. egységgyök A megfelelő Fourier-pontok: {, 4, 9, 3,, 4, 9, 3} (Pl. 4 2 = 32 és 4 3 = 38 (mod 4)) A szimmetria feltétel teljesül A 4 2 = 9 egy primitív 4. egységgyök, az {, 9,, 9} Fourier-pontokkal A szimmetria feltétel itt is teljesül Végül, 9 2 = egy primitív 2. egységgyök, az {, } 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() = 0, T(2 k ) = 2 T(2 k ) + c 2 k, k -re. Ekkor T(n) = T(2 m ) = 2 T(2 m ) + c 2 m = 2 2 T(2 m 2 ) + c 2 m 2 = = 2 3 T(2 m 3 ) + c 2 m 3 = = 2 m T() + c 2 m m = c 2 m 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 8
Diszkrét Fourier-transzformáció Példa Legyen a(x) = 5x 6 + x 5 + 3x 3 + x 2 4x +, Z 4 [x]-beli polinom. Az a(x) polinomot ki akarjuk értékelni az {, 4, 9, 3,, 4, 9, 3} Fourier-pontok felett. Eml.: a Z 4 véges testben a 4 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 + és c(y) = y 2 + 3y 4 kiértékelése az {, 9,, 9} Fourier-pontok felett A b(y) = d(z) + y e(z); z = y 2 átírással d(z) =, e(z) = 5z +, é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 {, } Fourier-pontok felett. Hasonló érvelés alkalmazható c(y) kiértékelésére is. Az eredmény felépítése: d() =, e() = 6, ebből b() = d() + e() = 7, b( ) = d() + ( ) e() = 5 d( ) =, e( ) = 4, ebből b( 9) = d( ) + ( 9) e( ) = + 36 = 37 = 4 (mod 4), b(9) = d( ) + 9 e( ) = 36 = 35 = 6 (mod 4) Hasonló módon (részletezés nélkül) c() = 0, c( ) = 2, c( 9) = 9, c(9) = 9 Feljebb lépve, a(x) Fourier-transzformáltjának elemei is számolhatók, pl. a(3) = b(9) + 3 c(9) = 0, a( 3) = b(9) 3 c(9) = 9 Végül A := FFT(8, 4, a(x)) = (7,, 8, 9, 7, 7, 8, 0) 9
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 i= 0 N / 2 i= 0 Az eredmény felépítése: A 0 := B 0 + C 0 ; A N/2+0 := B 0 C 0 ; A := B + ω C ; A N/2+ := B ω C ; 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ó inverzét kell felhasználnunk, azaz T -et. ( x0, x, K, x n ) 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 n V(, ω, ω, K, ω ) = n M L 2 ( n ) 2 n ) ω ω ( n ) ω ω 2( n ) Így V inverze rendkívül gyorsan felírható M M L M L ω ω M ( n )( n ) = n 2 ( V(, ω, ω, K, ω ) 2
Inverz Fourier-transzformáció Példa 2. (folyt.) Eml.: a Z 7 véges testben a 4 primitív negyedik egységgyök Ekkor az inverz transzformáció egy lineáris trafó a (Z 7 ) 4 vektortérből önmagába, amelynek mátrixa 4 4 6 3 3 3 = 3 6 3 4 3 3 4 6 Definíció: Az inverz diszkrét Fourier-transzformáció (IDFT) az {, ω, ω 2,, ω n } Fourier-pontok felett q0, q,,,, K, qn n ω K ω j k ahol = q j = n q k ( ω ) k 0 Eml.: az ismert T n a, a, K, a aˆ, aˆ, K, aˆ Tétel: a DFT és az IDFT transzformációk egymás inverzei 6 6 trafóra A bizonyítást nem közöljük, csak szemléltetés: a bekonverzióra a visszakonverzióra pedig n T ( n ) ( ) q = p, ω, K, ω 3 6 4 3 4 3 ( ) ( ) ( ),,, 0 = K ω n 0 n 4 S n K ( ) ( ) ( ) = q0, q,, qn ω i a j j= 0 aˆ = n i ( ω ) T n ( ) p = q, ω, 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 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 + és a b(x) = x 3 + 2x 2 + 5x 3 polinomot a Z 4 véges testben! Felhasználjuk a 4-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, 4, a(x)) = (, 9, 9, 8, 3, 6, 9, 3) B := FFT(8, 4, b(x)) = (5, 5, 0, 4, 7, 6, 0, 6) Összeszorzással (moduláris repr.) C := (5, 4, 0, 6, 20, 4, 5, 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 FFT(8, 3, 7x 7 + 5x 6 4x 5 + 20x 4 6x 3 + 4x + 5) Ennek eredménye c := ( 3, 7, 20,, 3, 7, 3, 0) Így végül c(x) = 3x 6 + 7x 5 + 3x 4 x 3 + 20x 2 + 7x 3 24
FFT alkalmazás Fourier-analízis Alkalmazása: tipikusan periodikus jelekből vett minta (idősor) elemzésére Lépések Példa 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 Az időfüggvényből 2 hatvány (pl. n = 52) elemszámú mintát veszünk egyenlő lépésközzel, τ időközönként (ez /τ mintavételi frekvenciát jelent) A frekvenciaspektrum F = /τ 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/52 = 46,874 és τ = /24000 = 0,000042 és T = 0,02333 Mintánkban egy 200 Hz-es szinuszos időfüggvényre két magasabb frekvenciájú zavart ültetünk Egy 0, amplitúdójú 200 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 =) 000 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, 998 (több kiadás) Geddes, Czapor, Labahn: Algorithms for Computer Algebra (6th pr./ed.), Kluwer Acad. Press, Boston, 999 Gács Péter, Lovász László: Algoritmusok, Tankönyvkiadó, Budapest, 978 (több kiadás) Joachim Gathen, Jürgen Gerhard: Modern Computer Algebra (3rd ed.), Cambridge Univ. Press, 203 Donald E. Knuth: A számítógép-programozás művészete 2. (2. kiadás), Műszaki Könyvkiadó, Budapest, 994 29