Toom-Cook-algoritmi

Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 21. helmikuuta 2022 tarkistetusta versiosta . tarkastukset vaativat 7 muokkausta .

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] .

Tiedot

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:

  1. jakaminen
  2. Pisteiden laskeminen
  3. Pisteinen kertolasku
  4. Interpolointi
  5. Uudelleenkokoonpano

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ä.

Erittely

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

Laskenta pisteissä

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 laskeminen

Pistearvot 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).

Pistekerto

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 .

Interpolointi

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.

Uudelleenkokoonpano

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.

Interpolaatiomatriisit eri k :n arvoille

Tässä esittelemme interpolointimatriisit useille eri pienille arvoille ja .

Toom −1

Toom-1 ( ) vaatii laskutoimituksen yhdessä pisteessä, tässä valitaan 0. Algoritmi muuttuu sarakkeen kertolaskuksi identiteettiinterpolaatiomatriisilla:

Toom-1.5

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

Toom-2 ( ) vaatii kolme pistettä, 0, 1 ja ne valitaan tästä . Algoritmi on sama kuin Karatsuba-algoritmi interpolointimatriisilla

Toom-2.5

Toom-2.5 ( vaatii 4 pistettä, tässä 0, 1, −1 ja valitaan . Algoritmilla on sitten interpolointimatriisi:

Muistiinpanot

  1. 1 2 Knuth, 1997 , s. 296.
  2. Crandall, Pomerance, 2005 , s. 474.
  3. Crandall, Pomerance, 2005 , s. 536.
  4. Knuth, 1997 , s. 302.
  5. Positiiviset tulokset arkistoitu 6. tammikuuta 2013 Wayback Machinessa , Stephen A. Cook: On the Minimum Computation Time of Functions , luku III .
  6. 1 2 3 Bodrato, 2007 , s. 116-133.

Kirjallisuus

  • D. Knuth. Osa 4.3.3.A: Digitaaliset menetelmät // Tietokoneohjelmoinnin taito . – Kolmas painos. - Addison-Wesley, 1997. - T. 2. - S. 294.
  • Knut D.E. Ohjelmoinnin taito. Tuloksena olevat algoritmit. - 2019. - Osa 2. - ISBN 978-5-907144-15-6 .
  • R. Crandall, C. Pomerance. Osa 9.5.1: Karatsuba ja Toom–Cook -menetelmät // Alkuluvut – Laskennallinen näkökulma . - Toinen painos. - Springer, 2005. - S.  473 .
    • Richard Crandall, Carl Pomerance. Yksinkertaiset numerot. Kryptografiset ja laskennalliset näkökohdat. - Moskova: Librocom, 2011. - ISBN 978-5-397-02060-2 .
  • M. Bodrato. Kohti optimaalista Toom–Cookin kertolaskua yksimuuttuja- ja monimuuttujapolynomeille ominaisuudessa 2 ja 0 // Äärillisten kenttien aritmetiikka . - Springer, 2007. - T. 4547. - (LNCS).

Linkit