Nopea kertolasku, Karatsuban algoritmi Mikko Männikkö 16.8.2004 Lähde: ((Gathen and Gerhard 1999) luku II.8)
Esityksen kulku Algoritmien analysointia (1), (2), (3), (4) Klassinen kertolasku Parempi tapa (1), (2), (3) Karatsuban algoritmi polynomien kertolaskulle Karatsuban aikavaativuus Aikavaativuuden todistus (1), (2), (3) Linkkejä
Algoritmien analysointia (1) Algoritmien tehokkuuden kuvaamiseen käytetään niin sanottuja kasvunopeusluokkia. (puhutaan yleisesti isosta O:sta) Kasvunopeusluokka O(f(n)) tarkoittaa karkeasti seuraavaa: Algoritmi A saa syötteen, jonka pituus on n. Algoritmi A suoritetaan ajassa f(n). Algoritmi A kuuluu kasvunopeusluokkaan O(f(n)). Koska algoritmien suoritusaika voi riippua syötteen pituuden lisäksi myös esim. syötteen yksinkertaisuudesta, lasketaan algoritmien aikavaativuus pahimman mahdollisen tapauksen (worst case scenario) mukaan. (Esim. 10 ja 99 ovat molemmat yhtä pitkiä syötteitä, mutta jälkimmäisellä laskeminen ei ole kivaa.) Kasvunopeusluokka määräytyy vallitsevan termin mukaan. esim. n 2 O(n 2 ), 99n 2 O(n 2 ), n 2 + n 1.9 O(n 2 ), jne.
Algoritmien analysointia (2) 1 1 1 1 1 1 1 1 * 1 1 1 1 + 1 1 1 1 1 1 1 1 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 2 3 4 3 2 1 Peruskoulun yhteenlasku kuuluu kasvunopeusluokkaan O(n) ja on siis lineaarinen. Peruskoulun kertolasku kuuluu kasvunopeusluokkaan O(n 2 ) ja on siis neliöinen.
Algoritmien analysointia (3) Tässä esityksessä syötteellä n tarkoitetaan enintään astetta n - 1 olevien polynomien termien maksimi määrää. Esim. f = ax 3 + bx 2 + cx + d, f:ssä on neljä termiä ja deg f < 4. Koko esityksen ajan käsitellään aikavaativuudeltaan pahinta mahdollista tapausta. Eli kun käsitellään funktiota f, jolle deg f < 4 niin käsitellään aina tapausta deg f = 3. Algoritmin aikavaativuudella f(n) tarkoitetaan algoritmin suorittamien yhteenlaskujen ja kertolaskujen määrää.
Algoritmien analysointia (4) Karatsuban algoritmin avulla polynomien kertolasku suoritetaan siten, että se kuuluu kasvunopeusluokkaan O(n log 2 3 ) O(n 1.59 ). Vastaavasti klassinen polynomien kertolasku kuuluu kasvunopeusluokkaan O(n 2 ). Äärettömän suurilla luvuilla Karatsuban algoritmi on äärettömän paljon nopeampi kuin klassinen tapa.
Klassinen kertolasku (ax + b) + (cx + d) = (a + c)x + (b + d) Kahden ensimmäisen asteen polynomin yhteenlasku vaatii kaksi yhteenlaskua (a + c) ja (b + d) Yleisesti: Kahden polynomin, joiden aste on pienempi kuin n, yhteenlasku vaatii enintään n yhteenlaskutoimitusta. (ax + b) (cx + d) = acx 2 + (ad + bc)x + bd Kahden ensimmäisen asteen polynomin kertolasku vaatii neljä kertolaskua ac, ad, bc, bd ja yhden yhteenlaskun ad + bc. Yleisesti: Kahden polynomin, joiden aste on pienempi kuin n, kertolasku vaatii enintään n 2 kertolaskutoimitusta ja (n - 1) 2 yhteenlaskutoimitusta.
Parempi tapa (1) (ax + b) (cx + d) = acx 2 + (ad + bc)x + bd Tiedetään, että (a + b) (c + d) = ac + ad + bc + bd eli ad + bc = (a + b) (c + d) - ac - bd Nyt saadaan acx 2 + (ad + bc)x + bd = acx 2 + ((a + b) (c + d) - ac - bd)x + bd Kahden ensimmäisen asteen polynomin kertolasku vaatii nyt kolme kertolaskua ac, (a + b) (c + d), bd ja neljä yhteenlaskua a + b, c + d, - ac, - bd. (Tässä on koko asia ydin.) Kertolaskujen määrää voidaan siis vähentää yhteenlaskujen kustannuksella.
Parempi tapa (2) Kahden polynomin f ja g kertolaskun parempi tapa yleisesti: Oletetaan n = 2 k jollain k N, ja asetetaan m = n/2. deg f < n ja deg g < n. (eli polynomeissa f ja g on termejä enintään 1 tai 2 tai 4 tai 8 ) Jos deg f < n 1, niin asetetaan tarvittavien ylempien termien kertoimet nolliksi. (esim. f = ax 2 + bx + c = 0x 3 + ax 2 + bx + c) Kirjoitetaan f ja g uudelleen muodossa f = F 1 x m + F 0 jossa F 1 ja F 0 ovat asteeltaan pienempiä kuin m. Samoin g = G 1 x m + G 0. (esim. f = ax 3 + bx 2 + cx + d = (ax + b)x 2 + (cx +dc) = F 1 x 2 + F 0 jossa deg f < 4 ja deg F 1 = deg F 2 < 2) Nyt kirjoitetaan polynomien f ja g kertolasku seuraavasti fg = (F 1 x m + F 0 ) (G 1 x m + G 0 ) = F 1 G 1 x n + (F 0 G 1 + F 1 G 0 )x m + F 0 G 0
Parempi tapa (3) Järjestetään fg uudelleen kuten edellä tapauksessa n = 2 fg = F 1 G 1 x n + (F 0 G 1 + F 1 G 0 )x m + F 0 G 0 = F 1 G 1 x n + ((F 0 + F 1 ) (G 0 + G 1 ) - F 0 G 0 - F 1 G 1 )x m + F 0 G 0 Eli kertolasku fg vaatii vain kolme alle m:n (m = n/2) asteen polynomien kertolaskua ja joitain yhteenlaskuja. Samaa metodia voidaan käyttää rekursiivisesti pienempiin kertolaskuihin. (Kertolasku fg on kahden n - 1 asteisen polynomin kertolasku. Kertolaskut F 1 G 1, (F 0 + F 1 ) (G 0 + G 1 ) ja F 0 G 0 ovat kahden n/2-1 asteisen polynomin kertolaskuja.)
Karatsuban algoritmi polynomien kertolaskulle input: f,g R[x], deg f < n, deg g < n missä n on kahden potenssi ja R on rengas. output: fg R[x] 1. if n = 1 then return fg // jos jäljellä vain vakiotermi 2. määritellään f = F 1 x n/2 + F 0 ja g = G 1 x n/2 + G 0, missä F 0, F 1, G 0 ja G 1 ovat asteeltaan pienempiä kuin n/2 3. lasketaan F 0 G 0, F 1 G 1 ja (F 0 + F 1 ) (G 0 + G 1 ) rekursiivisesti 4. return F 1 G 1 x n + ((F 0 + F 1 ) (G 0 + G 1 ) - F 0 G 0 - F 1 G 1 )x m + F 0 G 0
Karatsuban aikavaativuus Väite: Karatsuban algoritmin avulla voidaan kertolasku suorittaa siten, että se kuuluu kasvunopeusluokkaan O(n 1.59 ). Todistetaan, että Karatsuban algoritmin aikavaativuus on 9n log 2 3-8n eli se kuuluu kasvunopeusluokkaan O(n 1.59 ). Huom. log 2 3 1.584962501 1.59 3 log 2 n = n log 2 3
Aikavaativuuden todistus (1) F 1 G 1 x n + ((F 0 + F 1 ) (G 0 + G 1 ) - F 0 G 0 - F 1 G 1 )x m + F 0 G 0 Kertolaskujen määrä: Algoritmin kohdassa 3, kahden polynomin välinen kertolasku fg, jossa f:n ja g:n aste on n - 1, voidaan kirjoittaa uudelleen kolmena kertolaskuna, joiden tekijöiden aste on n/2-1. Rekursiivisesti saadaan, että kertolaskujen määrä on 3 log 2 n = n log 2 3. esim. n = 1 n log 2 3 = 1, n = 2 n log 2 3 = 3, n = 4 n log 2 3 = 9, n = 8 n log 2 3 = 27
Aikavaativuuden todistus (2) F 1 G 1 x n + ((F 0 + F 1 ) (G 0 + G 1 ) - F 0 G 0 - F 1 G 1 )x m + F 0 G 0 Yhteenlaskujen määrä: Algoritmin kohdassa 3 tarvitaan n laskua laskettaessa yhteen F 0 + F 1 ja G 0 + G 1. Algoritmin kohdassa 4 tarvitaan 2n! laskua laskettaessa yhteen ((F 0 + F 1 ) (G 0 + G 1 ) - F 0 G 0 - F 1 G 1 )x m, ja lisäksi n!! laskua laskettaessa yhteen saatu tulos ja F 1 G 1 x n + F 0 G 0. Ensimmäisellä rekursio kierroksella lasketaan 4n yhteenlaskua, toisella 3*4n/2, kolmannella 9*4n/4 jne. Yhteenlaskujen määrä muodostaa geometrisen summan 0 i<log2 n 4n*(3/2) i = 4n 0 i<log2 n (3/2) i = 4n((3/2) log 2 n 1)/(3/2 1) = 4n((3 log 2 n /n) 1)2 = 8(3 log 2 n n) = 8(n log 2 3 n)! tämän pitäisi olla 2n -2 ja!! tämän n - 2, mutta kun kirjassa väittävät muuta niin olkoon.
Aikavaativuuden todistus (3) Suoritettavien kertolaskujen määrä algoritmissa on n log 2 3. Yhteenlaskujen määrä on 8(n log 2 3 n). Karatsuban aikavaativuus = kertolaskujen määrä + yhteenlaskujen määrä = 9n log 2 3 8n O(n log 2 3 ) O(n 1.59 ) Huom. Klassisen kertolaskun aikavaativuus = n 2 + (n - 1) 2 n = 32 9n log 2 3 8n = 1931, n 2 + (n - 1) 2 = 1985 Karatsuban algoritmissa on suhteessa enemmän yhteenlaskuja kuin Klassisessa kertolaskussa. Yhteenlasku on kuulemma nopeampaa suorittaa, mikä myös pienentää Karatsuban algoritmin aikavaativuutta suhteessa klassiseen kertolaskuun. mm. Maple käyttää hyödykseen Karatsuban algoritmia.
Linkkejä http://www-2.cs.cmu.edu/~cburch/251/karat/ http://www.cs.pitt.edu/~kirk/cs1501/animations/karatsuba.html