Nopeat eksponentioalgoritmit

Nopeat eksponentioalgoritmit ( dikotominen eksponentioalgoritmi, binäärinen eksponentioalgoritmi) ovat algoritmeja , jotka on suunniteltu nostamaan luku luonnolliseen potenssiin harvemmalla kertolaskulla kuin asteen määrittämisessä vaaditaan [1] . Algoritmit perustuvat siihen, että luvun nostamiseksi potenssiin , lukua ei tarvitse kertoa itsellään kerran, vaan jo lasketut potenssit voidaan kertoa. Erityisesti, jos potenssi on kaksi, niin potenssiin nostamiseen riittää lukukertojen neliöinti, samalla kun kulutetaan kertolaskuja . Esimerkiksi, jos haluat nostaa luvun kahdeksanteen potenssiin seitsemän kertokertoimen suorittamisen sijaan , voit neliöttää luvun ( ), sitten neliöidä tuloksen uudelleen saadaksesi neljännen potenssin ( ) ja lopuksi neliöimällä tuloksen uudelleen ja saat vastauksen ( ).

Lisäksi jotkin algoritmit lisäoptimointiin käyttävät sitä tosiasiaa, että neliöintioperaatio on nopeampi kuin kertolasku, koska kertoimen numerot toistuvat neliöitäessä [2] .

Persialainen matemaatikko Al-Kashi [3] ehdotti ensimmäisen kerran binaarista eksponentiointialgoritmia 1400-luvulla .

Nämä algoritmit eivät aina ole optimaalisia. Esimerkiksi käytettäessä vasemmalta oikealle -mallia n = 15:n nopea eksponentio vaatii kolme kertolaskua ja kolme neliöintioperaatiota, vaikka korotus 15. potenssiin voidaan suorittaa kolmella kertolaskulla ja kahdella neliöinnillä [4] . Optimaalinen eksponentio vastaa lyhimmän lisäaineketjun rakennetta .

Kuvaus

Pääalgoritmi nopealle eksponentiolle on "vasemmalta oikealle" -malli. Se on saanut nimensä siitä, että eksponentin bittejä tarkastellaan vasemmalta oikealle, eli korkeasta matalaan [5] .

Päästää

 on asteen n binääriesitys , eli

missä . Sitten

[5] .

Toimintojen järjestys tätä järjestelmää käytettäessä voidaan kuvata seuraavasti:

  1. Esitä eksponentti n binäärimuodossa
  2. Jos = 1, nykyinen tulos neliöidään ja kerrotaan sitten x:llä. Jos = 0, niin nykyinen tulos yksinkertaisesti neliötetään [6] . Indeksi i muuttuu arvosta k -1 arvoon 0 [7] .

Siten nopea eksponentioalgoritmi pelkistyy Hornerin kaavion [6] multiplikatiiviseksi analogiksi :

Yleistykset

Olkoon pari ( S , *) puoliryhmä , jolloin voidaan kutsua operaatiota * kertolasku ja määritellä nostooperaatio luonnolliseen potenssiin:

Sitten n:n arvojen laskemiseksi missä tahansa puoliryhmässä ( erityisesti Abelin ryhmässä ) voidaan käyttää algoritmeja nopeaan eksponentioon [8] .

Esimerkkejä ongelmanratkaisusta

Algoritmia soveltaen laskemme 21 13 :

Oikealta vasemmalle -kaavio

Tässä mallissa, toisin kuin "vasemmalta oikealle" -mallissa, eksponentin bittejä tarkastellaan alimmasta korkeimpaan [5] .

Toimintojen järjestys tämän algoritmin toteutuksessa.

  1. Ilmaise eksponentti n binäärimuodossa.
  2. Aseta apumuuttuja z yhtä suureksi kuin luku x.
    1. Jos , niin nykyinen tulos kerrotaan z :llä ja itse luku z neliötetään. Jos = 0, sinun tarvitsee vain neliöttää z [6] . Tässä tapauksessa indeksi i , toisin kuin kaaviossa vasemmalta oikealle, vaihtelee välillä 0 - k -1 mukaan lukien [7] .

Tämä piiri sisältää yhtä monta kertolaskua ja neliöintiä kuin "vasemmalta oikealle" -piiri. Tästä huolimatta vasemmalta oikealle -kaavio on kuitenkin kannattavampi kuin oikealta vasemmalle -malli, varsinkin jos eksponentti sisältää useita yksiköitä. Asia on siinä, että kaaviossa vasemmalta oikealle operaation tulos = tulos · x sisältää vakiokertoimen x . Ja pienelle x :lle (joka usein tapahtuu primaliteettitesteissä) kertominen on nopeaa. Esimerkiksi, kun x = 2, voimme korvata kertolaskuoperaation summausoperaatiolla [7] .

Tämän algoritmin toiminnan matemaattinen perustelu voidaan esittää seuraavalla kaavalla:

[9] .

Esimerkki . Lasketaan arvo 21 13 käyttäen eksponentiokaaviota oikealta vasemmalle .

i 0 yksi 2 3
21 441 194 481 37 822 859 361
yksi 0 yksi yksi
  1. 21 194 481 = 4084 101
  2. 4084 101 37 822 859 361 = 154 472 377 739 119 461

Laskennallinen monimutkaisuus

Sekä vasemmalta oikealle että oikealta vasemmalle -mallissa neliöintioperaatioiden lukumäärä on sama ja yhtä suuri kuin k, missä k  on eksponentin n pituus bitteinä, . Vaadittujen kertolaskuoperaatioiden määrä on yhtä suuri kuin Hamming -paino , eli nollasta poikkeavien alkioiden lukumäärä luvun n binääriesityksessä . Keskimäärin kertolaskuja tarvitaan [6] .

Esimerkiksi luvun nostamiseksi sadasosaan tämä algoritmi vaatii vain 8 kerto- ja neliöintioperaatiota [5] .

Vertailun vuoksi standardin eksponentiomenetelmän kanssa tarvitaan kertolasku, eli operaatioiden lukumäärä voidaan arvioida [10] .

Algoritmin optimointi

Yleensä neliöintioperaatio on nopeampi kuin kertolasku. Ikkunamenetelmän avulla voit vähentää kertolaskujen määrää ja tehdä siten eksponentioalgoritmista optimaalisemmaksi [8] .

Ikkuna on itse asiassa numerojärjestelmän perusta [7] . Olkoon w  ikkunan leveys, eli indikaattorin w merkkiä otetaan huomioon kerrallaan.

Harkitse ikkunamenetelmää.

  1. Ennalta lasketulle x i : lle
  2. Eksponentti esitetään seuraavassa muodossa: , missä
  3. Olkoon y  muuttuja, josta lopullinen tulos lasketaan. Anna .
  4. Kaikille i = k/w  - 1, k/w  - 2, ..., 0, toimi seuraavasti:
    1. [8] .

Tämä algoritmi vaatii k -neliöinnin, mutta kertolaskujen lukumäärä pienenee keskimäärin k/w :iin [8] .

Vielä tehokkaampi on liukuikkunamenetelmä. Se johtuu siitä, että ikkunan leveys voi muuttua prosessin aikana:

  1. Eksponentti esitetään muodossa , missä ja e i+1  — e i ≥ w .
  2. Arvolle x i lasketaan . Lisäksi nimeämme x i :ksi x i .
  3. Olkoon y  muuttuja, josta lopullinen tulos lasketaan. Anna .
  4. Kaikille i = l  - 1, l  - 2, ..., 0 toimi seuraavasti:
    1. Kaikille j:lle 0 - e i+1  - e i  - 1 y neliö
  5. Kaikille j :lle 0 - e 0  - 1 y -neliö [8] .

Eksponenttioperaatioiden määrä tässä algoritmissa on sama kuin ikkunamenetelmässä, mutta kertolaskuoperaatioiden määrä on vähennetty l :ään eli keskiarvoon [8] .

Nostetaan esimerkiksi luku x potenssiin 215 liukuvalla ikkunamenetelmällä . Ikkunan leveys on w = 3.

  1. 215 = 27 + 5 24 + 7
  2. y = 1
  3. y = y x = x
  4. y on neliöity 3 kertaa, koska tässä vaiheessa e 2  - e 1 -1 \u003d 7 - 4 - 1 \u003d 2, ja lähtölaskenta on nollasta, eli y \u003d y 8 \u003d x 8
  5. y \u003d y x 5 \u003d x 13
  6. y on neliöity 4 kertaa, koska tässä vaiheessa e 1  - e 0 -1 \u003d 4 - 0 - 1 \u003d 3, eli y \u003d y 16 \u003d x 208
  7. y \u003d y x 7 \u003d x 215

Sovellus

Nopea eksponentioalgoritmi on yleistynyt julkisen avaimen salausjärjestelmissä . Algoritmia käytetään erityisesti RSA -protokollassa , ElGamal-skeemassa ja muissa salausalgoritmeissa [11] .

Katso myös

Muistiinpanot

  1. Shvets A.N. Nopea eksponentio . Käyttöpäivä: 13. marraskuuta 2015. Arkistoitu alkuperäisestä 17. marraskuuta 2015.
  2. Pankratova, 2009 , s. 7.
  3. Pankratova, 2009 , s. yksitoista.
  4. Pankratova, 2009 , s. kymmenen.
  5. 1 2 3 4 Ryabko, Fionov, 2004 .
  6. 1 2 3 4 Käsikirja, 2006 .
  7. 1 2 3 4 Crandall, Pomerance, 2011 .
  8. 1 2 3 4 5 6 Kryptografia, 2005 .
  9. Gabidulin, Kshevetsky, Kolybelnikov, 2011 .
  10. Mahovenko, 2006 .
  11. Applied Cryptography, 2002 .

Kirjallisuus