Toom-Cook- algoritmi , jota joskus kutsutaan nimellä Toom-3 ja joka on nimetty Andrey Leonovich Toomin mukaan, joka ehdotti uutta algoritmia, jonka monimutkaisuus on vähäistä, ja Stephen Cook , joka kuvaili algoritmia selkeämmin, on algoritmi suurten lukujen kertomiseen. .
Kun on annettu kaksi suurta lukua a ja b , Toom-Cook-algoritmin mukaan sinun on jaettava a ja b k pienempään osaan, joiden pituus on l , ja suoritettava osille operaatioita. Kun k kasvaa , on mahdollista yhdistää joitain osion osien kertomisoperaatioita, mikä vähentää algoritmin yleistä monimutkaisuutta. Osion osien tulo voidaan sitten laskea käyttämällä samaa Toom-Cook-algoritmia rekursiivisesti. Termejä "Toom-3-algoritmi" ja "Toom-Cook-algoritmi" käytetään joskus virheellisesti keskenään, vaikka Toom-3 on vain erikoistapaus Toom-Cook-algoritmista k = 3:lle.
Toom-3 vähentää monimutkaisuutta 9 kertolaskusta viiteen ja toimii ajoissa . Yleensä Toomk toimii ajassa , jossa , on osaosien kertomiseen käytetty aika ja c on aika, joka kuluu yhteen- ja kertolaskuihin pienillä vakioilla [1] . Karatsuba-algoritmi on Toom-Cook-algoritmin erikoistapaus, jossa luku on jaettu kahteen osaan. Se vähentää monimutkaisuutta 4 kertolaskusta 3:een ja toimii siksi ajassa . Normaali kertolasku sarakkeella vastaa Toom-1:tä monimutkaisuudella .
Vaikka e :n potenssi voidaan asettaa mahdollisimman lähelle 1:tä lisäämällä k , funktio c kasvaa valitettavasti hyvin nopeasti [1] [2] . Toom-Cook-sekajärjestelmien kasvuvauhti pysyi avoimena ongelmana vuoteen 2005 mennessä [3] . Donald Knuthin kuvaama toteutus on monimutkainen [4] .
Ylimääräisistä luvuista johtuen Toom-Cook-algoritmi pienille luvuille on hitaampi kuin kertominen sarakkeella, ja siksi sitä käytettiin yleensä keskikokoisille tekijöille, kunnes asymptoottisesti nopeampi Schönhage-Strassen-algoritmi (monimutkaisuus .
Toom kuvaili algoritmiaan vuonna 1963 , ja Cook julkaisi parannetun (asymptoottisesti vastaavan) algoritmin väitöskirjassaan vuonna 1966 [ 5] .
Tämä osa käsittelee Toomk- algoritmin toimintaa mille tahansa k :n arvolle ja tarjoaa yksinkertaistetun kuvauksen polynomien Toom-Cookin kertolaskusta Marco Bodraton [6] kuvaamalla tavalla . Algoritmissa on viisi päävaihetta:
Tyypillisessä suurten lukujen tulkinnassa jokainen kokonaisluku esitetään numerosarjana paikkalukujärjestelmässä , jossa lukukanta on jokin (yleensä suuri) arvo b . Esimerkissämme käytämme , jolloin jokainen numero vastaa neljän desimaalinumeron ryhmää (tietokonetoteutuksessa b on yleensä kahden potenssi). Oletetaan, että meidän täytyy kertoa kaksi numeroa
m | = | 12 | 3456 | 7890 | 1234 | 5678 | 9012 |
n | = | 9 | 8765 | 4321 | 9876 | 5432 | 1098. |
Ne ovat paljon pienempiä kuin tavallisesti Toom-Cook-algoritmin käsittelemät, mutta ne kuvaavat algoritmia tässä.
Ensimmäinen askel on valita kanta siten, että sekä m :n että n :n numeroiden määrä B -kannassa ei ylitä k :a (esimerkiksi Toom-3:ssa 3). Yleensä olen antanut
Esimerkissämme käytämme Toom-3:a, joten valitsemme . Nyt jaetaan m ja n niiden kantaluvulla B numeroiksi :
Käytämme näitä lukuja kertoimina polynomeissa p ja q asteen ( k − 1) ominaisuuksilla ja :
Näiden polynomien käyttöönoton jälkeen saamme, että jos laskemme tulon , niin vastaus ongelmaan on .
Siinä tapauksessa, että kerrotut luvut ovat erikokoisia, on hyödyllistä käyttää eri arvoja k :lle m ja n , joita merkitsemme ja . Esimerkiksi "Toom-2.5"-algoritmi viittaa Toom-Cook-algoritmiin ja . Tässä tapauksessa i in valitaan yleensä lausekkeella
Toom-Cookin lähestymistapa polynomien tulon laskemiseen on yleinen. Huomaa, että d -asteen polynomi määritellään yksiselitteisesti pisteillä (esimerkiksi suora on 1-asteinen polynomi ja sen määrittelee kaksi pistettä). Ajatuksena on laskea p (•) ja q (•) eri pisteissä. Sitten näiden pisteiden arvojen tulo suoritetaan polynomien tulon arvojen saamiseksi. Lopuksi interpoloimme saadut arvot polynomin kertoimien saamiseksi.
Koska , tarvitsemme pisteitä saadaksemme lopullisen tuloksen. Kutsutaan sitä d :ksi . Toom-3:n tapauksessa . Algoritmi toimii riippumatta siitä, mitkä pisteet valitaan (muutamalla pienellä poikkeuksella - katso vaatimus, että matriisi on käännettävä Interpolointi -osiossa ), mutta algoritmin yksinkertaistamiseksi on parempi käyttää pieniä arvoja, kuten 0, 1, -1 ja -2.
Yksi epätavallinen piste, jota usein käytetään, on äärettömyys, eli . Polynomin p "laskemiseksi" äärettömässä ottamalla raja , koska x pyrkii äärettömään. Siksi se on aina yhtä suuri kuin johtavan kertoimen arvo (edellä olevassa esimerkissä kerroin ).
Toom-3-esimerkissämme käytämme pisteitä 0, 1, −1, −2 ja . Tämä valinta yksinkertaistaa pistelaskentaa ja antaa kaavat:
Ja samoin q :lle . Esimerkissämme saamamme arvot ovat:
= | = | 56789012 | = | 56789012 | ||
= | = | = | 135813702 | |||
= | = | = | −21988766 | |||
= | = | = | −100519632 | |||
= | = | 123456 | = | 123456 | ||
= | = | 54321098 | = | 54321098 | ||
= | = | = | 97639739 | |||
= | = | = | 11199987 | |||
= | = | = | −31723594 | |||
= | = | 98765 | = | 98765. |
Kuten näet, nämä arvot voivat olla negatiivisia.
Lisäselvitystä varten on hyödyllistä ajatella tätä pistelaskentaprosessia matriisin kertomisena oikealla olevalla vektorilla, jossa jokainen matriisin rivi sisältää yhden valitun pisteen potenssit ja vektori sisältää kertoimet polynomi:
Matriisien mitat ovat yhtä suuret p :lle ja q : lle . Äärettömän rivillä on nolla arvoa paitsi viimeisessä sarakkeessa, jossa on 1.
Nopeampi arvojen laskeminenPistearvot voidaan laskea nopeammin kuin yllä olevissa kaavoissa on ilmoitettu. Alkeisoperaatioiden (lisäys/vähennys) määrää voidaan vähentää. Bodraton [6] Toom-3:lle suunnittelema operaatiosarja näytetään tässä ensimmäiselle operandille (polynomi p ):
= | 56789012 + 123456 | = | 56912468 | |||
= | = | 56789012 | = | 56789012 | ||
= | = | 56912468 + 78901234 | = | 135813702 | ||
= | = | 56912468 − 78901234 | = | −21988766 | ||
= | = | = | − 100519632 | |||
= | = | 123456 | = | 123456. |
Tämä sarja vaatii viisi yhteen-/vähennysoperaatiota, yksi vähemmän kuin suora laskutoimitus. Lisäksi meidän ei tarvitse kertoa 4:llä, kun lasketaan p (−2).
Toisin kuin polynomien p (•) ja q (•) kertolasku, laskettujen arvojen p ( a ) ja q ( a ) kertominen yksinkertaisesti pelkistyy kokonaislukujen kertolaskuksi, mikä on alkuperäisen ongelman yksinkertaisempi versio. Käytämme rekursiivisesti kertolaskumenettelyämme laskeaksemme jokaisen pistearvoparin. Käytännön toteutuksissa, kun operandit pienenevät, algoritmi pelkistyy kertolaskuksi sarakkeessa . Jos r on polynomien tulo, esimerkissämme on:
= | = | = | 3084841486175176 | |||
= | = | = | 13260814415903778 | |||
= | = | = | −246273893346042 | |||
) | = | = | = | 3188843994597408 | ||
= | = | = | 12193131840. |
Kuten näet, nämä arvot voivat olla negatiivisia. Riittävän suurille luvuille tämä on kallein askel, ainoa askel, joka ei riipu lineaarisesti koosta m ja n .
Tämä on vaikein vaihe, pistelaskennan käänteinen vaihe - kun otetaan huomioon polynomien r (•) tulon d -pisteemme , meidän on laskettava sen kertoimet. Toisin sanoen meidän on ratkaistava matriisiyhtälö, jonka oikealla puolella on vektori:
Tämä matriisi rakennetaan samalla tavalla kuin pisteiden polynomiarvojen laskentavaiheessa, paitsi että matriisin koko on d × d . Voimme ratkaista tämän yhtälön Gaussin menetelmällä (poissulkemismenetelmä), mutta se tulee olemaan erittäin kallista. Sen sijaan käytämme sitä, että arvojen laskemiseen käytetyt pisteet valitaan erityisellä tavalla, jolloin käänteismatriisin laskeminen on helppoa (katso myös Vandermonde-matriisi ), ja sitten
Nyt jää vain laskea matriisin ja vektorin tulo. Vaikka matriisi sisältää murto-osia, saadut kertoimet ovat kokonaislukuja, joten laskelmia voidaan tehdä kokonaislukuaritmeettisesti lisäämällä, vähentämällä ja kertomalla/jakamalla pienillä vakioilla. Tässä päätehtävänä on löytää tehokas operaatiosarja, jonka avulla voidaan laskea matriisin ja vektorin tulo. Yhden tällaisen sekvenssin antoi Bodrato [6] Toom-3:lle, ja meidän esimerkissämme se on seuraava:
= | 3084841486175176 | |||
= | 12193131840 | |||
= | (3188843994597408 − 13260814415903778)/3 | |||
= | −3357323473768790 | |||
= | ||||
= | 6753544154624910 | |||
= | ||||
= | −3331115379521218 | |||
= | ||||
= | 13128433387466 | |||
= | −3331115379521218 + 6753544154624910 − 12193131840 | |||
= | 3422416581971852 | |||
= | 6753544154624910 − 13128433387466 | |||
= | 6740415721237444. |
Tiedämme nyt polynomidemme tulon r :
Jos käyttäisimme muita tai valitsisimme muita pisteitä arvojen laskemiseen, matriisi ja sitten interpolointistrategia muuttuisivat, mutta tämä ei riipu syöttötiedoista, ja siksi algoritmi voidaan johdottaa mille tahansa parametrille.
Lopuksi lasketaan r(B), jotta saadaan lopputulos. Tämä tehdään suoraan, koska B on b :n potenssi, ja siksi kertominen B:n potenssilla on kokonaisluvun siirtoa kannan b numeroiden kokonaisluvulla . Esimerkissämme ja _
3084 | 8414 | 8617 | 5176 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
6740 | 4157 | 2123 | 7444 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
3422 | 4165 | 8197 | 1852 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
13 | 1284 | 3338 | 7466 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+ | 121 | 9313 | 1840 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
121 | 9326 | 3124 | 6761 | 1632 | 4937 | 6009 | 5208 | 5858 | 8617 | 5176 |
Tuloksena on 1234567890123456789012 ja 987654321987654321098 tulo.
Tässä esittelemme interpolointimatriisit useille eri pienille arvoille ja .
Toom-1 ( ) vaatii laskutoimituksen yhdessä pisteessä, tässä valitaan 0. Algoritmi muuttuu sarakkeen kertolaskuksi identiteettiinterpolaatiomatriisilla:
Toom-1.5 ( ) vaatii kaksi pistettä, tässä 0 ja valitaan . Interpolaatiomatriisi on tällöin yhtä suuri kuin identiteettimatriisi:
Algoritmi myös rappeutuu kertolaskuksi sarakkeessa - yhden tekijän molemmat kertoimet kerrotaan toisen tekijän yhdellä kertoimella.
Toom-2 ( ) vaatii kolme pistettä, 0, 1 ja ne valitaan tästä . Algoritmi on sama kuin Karatsuba-algoritmi interpolointimatriisilla
Toom-2.5 ( vaatii 4 pistettä, tässä 0, 1, −1 ja valitaan . Algoritmilla on sitten interpolointimatriisi:
Lukuteoreettiset algoritmit | |
---|---|
Yksinkertaisuustestit | |
Alkulukujen löytäminen | |
Faktorisointi | |
Diskreetti logaritmi | |
GCD:n löytäminen |
|
Modulo-aritmetiikka | |
Lukujen kerto- ja jakolasku | |
Neliöjuuren laskeminen |