Modulaarinen eksponentio

Tämän matematiikkaartikkelin sisältö on tarkistettava (Tammikuu 2014).

Paranna sitä tai keskustele tarkistettavista asioista . Jos olet juuri kiinnittänyt bannerin, ilmoita tarkistettavat kohdat täällä .

On matematiikka , tarkemmin sanoen modulaarinen aritmetiikka , modulaarinen potenssiin korotuksen on eräänlainen eksponentiaation ( potenssiinkorotusta ) suoritetaan modulo kokonaisluku . Sitä käytetään erityisesti tietojenkäsittelytieteessä , erityisesti salauksen alalla .

Yleensä modulaariset eksponenttiongelmat ilmaistaan ​​seuraavassa muodossa: kun otetaan huomioon perusta b , eksponentti e ja kokonaisluku m, haluamme laskea c siten, että:


Jos b , e ja m ovat positiivisia tai nolla ja b < m , On olemassa ainutlaatuinen ratkaisu c , joka . Esimerkiksi, jos b = 5, e = 3 ja m = 13, c: n laskeminen antaa 8.

Edellisen esimerkin kaltaisia ​​modulaarisia eksponentointiongelmia pidetään helposti ratkaistavissa, vaikka mukana olevat lukumäärät ovat valtavat. Päinvastoin, lasketaan diskreetin logaritmin (löytää e päässä b , c ja m ) on tunnustettu vaikeaksi. Tämä yksisuuntainen toimintakäyttäytyminen tekee modulaarisesta eksponentiosta hyvän ehdokkaan käytettäväksi salauksen algoritmeissa .

Yleinen esitys

Naiivi laskeminen modulaarinen eksponentiaalinen on seuraava: me moninkertaisesti e kertaa enemmän b itse, ja kun kokonaisluku b e on saatu, laskemme sen loppuosa modulo m kautta jakoyhtälö algoritmi . Tämä menetelmä kärsii kahdesta puutteesta:

Artikkelin loppuosassa kuvataan näitä erilaisia ​​mukautuksia ja käsitellään niiden tehokkuutta erityisesti tietojen koosta riippuen.

Suora menetelmä

Suorin tapa laskea modulaarinen eksponentti on laskea b e suoraan ja ottaa sitten tämä luku modulo m . Yritetään laskea c , jossa b = 4, e = 13 ja m = 497:

Lasketaan laskimella 4 13 laskin, jolloin saadaan arvo 67 108 864. Ota tämä moduuli 497, saatu tulos c on 445. Vaikka b: llä on vain yksi numero ja e kaksi, arvo b e saavuttaa yhden 8 numeroa.

Vahvassa kryptologiassa b: llä on usein vähintään 256 binäärilukua (77 desimaalilukua). Otetaan b = 5 × 10 76 ja e = 17, kaksi täysin kohtuullista arvoa. Tässä esimerkissä b on 77 desimaalia ja E kaksi, mutta b e on 1304 numeroa. Tällaiset laskelmat ovat mahdollisia nykyaikaisilla tietokoneilla, mutta tällaisen luvun valtavuus hidastaa huomattavasti laskentanopeutta. Kun b: n ja e: n koko kasvaa salauksen turvallisuuden parantamiseksi, b e: n arvoa ei voida hallita.

Eksponentoinnin suorittamiseen tarvittava aika riippuu käyttöympäristöstä ja prosessorista. Eksponention laskeminen kerrannaissarjalla vaatii ajan O ( e ).

Menetelmä käyttää vähemmän muistia

Toinen menetelmä modulaarisen eksponention laskemiseksi vaatii enemmän toimintoja kuin ensimmäinen menetelmä. Pienemmästä muistivaatimuksesta johtuen toiminnot vievät vähemmän aikaa kuin aikaisemmin. Tämän seurauksena tämä algoritmi voi olla nopeampi:

Tämä algoritmi käyttää sitä tosiasiaa, että kahdelle annetulle kokonaisluvulle b ja c ensimmäiset relaatiot tarkoittavat seuraavaa:

Seuraava algoritmi:

  1. Aseta c = 1, e ' = 0.
  2. Lisää e ' 1: llä.
  3. Laske .
  4. Jos e ' < e , siirry vaiheeseen 2. Muussa tapauksessa c sisältää oikean ratkaisun .

Huomaa, että aina kun käydään läpi vaihe 3, yhtälöstä tulee totta. Kun vaihe 3 on suoritettu nnen kerran, sitten c sisältää vastauksen, joka on haettu.

Palatkaamme takaisin esimerkkiin b = 4, e = 13 ja m = 497. Algoritmi käy läpi vaiheen 3 13 kertaa:


Lopullinen vastaus C on siis 445, kuten ensimmäisessä menetelmässä.

Ensimmäisen menetelmän tavoin tämä vaatii laskennan ajan O ( e ): ssä. Koska näissä laskelmissa käytetyt luvut ovat pienempiä kuin ensimmäisen algoritmin laskelmissa käytetyt numerot, tämän menetelmän vakiotekijä on yleensä pienempi.

Tehokkain menetelmä

Kolmas menetelmä vähentää dramaattisesti sekä operaatioiden määrää että muistitilaa, joka tarvitaan modulaarisen eksponention suorittamiseen. Se on yhdistelmä edellisestä menetelmästä ja yleisemmästä periaatteesta, jota kutsutaan nopeaksi (tunnetaan myös nimellä neliösuuntainen eksponentointi).

Ensinnäkin meidän täytyy muuntaa eksponentin e osaksi binary merkintätapa , eli kirjoitetaan:

Tässä merkintätavassa pituus on e on n bittiä. a i voi ottaa arvon 0 tai 1 mille tahansa i: lle siten, että 0 ≤ i < n - 1. Määritelmän mukaan a n - 1 = 1.

Arvo b e voidaan sitten kirjoittaa:

Ratkaisu v on siis:

Tällainen algoritmi voidaan helposti toteuttaa ohjelmointikielellä, jolla on käyttäjän ylikuormituksia ja roskien keräilijöitä . Seuraava esimerkki on C #: ssä . Bignum- luokka edustaa mielivaltaista suurta positiivista lukua. Tulomuuttujat ovat perusta varten pohjan ( b ), exp eksponentti ( e ), ja m moduulin.

Bignum modpow(Bignum base, Bignum exp, Bignum m) { Bignum result = 1; while (exp > 0) { if ((exp & 1) > 0) result = (result * base)b% m; exp >>= 1; base = (base * base)*% m; } return result; }

Tämä koodi, joka perustuu yhteen sivulla 244 Applied Cryptography mukaan Bruce Schneier , 2 th ed. ( ISBN  0471117099 ) , käyttää while-silmukkaa tekemään kaikki modulaarisen eksponention laskemiseen tarvittavat työt.

Huomaa, että ensimmäisen kerran annat silmukkaselaimeen, pohja muuttuja sisältää b . Sitten toistuva neliöinti koodin kolmannella rivillä varmistaa, että jokaisen silmukan lopussa muuttujapohja on sama , missä i on silmukan iteraatioiden määrä. (Mikä tekee i: stä seuraavan bitin, joka käsitellään binäärisessä eksponentissa exp , vähiten merkitsevä bitti, joka on exp 0 ).

Ensimmäinen koodirivi suorittaa yksinkertaisesti kertomisen . Jos a i on nolla, koodia ei suoriteta, mikä vastaa kokonaismäärän kertomista yhdellä. Jos toisaalta i on yhtä suuri kuin yksi, tulos on yksinkertaisesti kerrotaan emäs muuttuja (sisältää arvon alkuperäisen emäs).

Testataan lopuksi esimerkillä b = 4, e = 13 ja m = 497. Huomaa, että e on binaarisesti yhtä suuri kuin 1101. Koska e on neljä binäärilukua pitkä, silmukka toimii vain neljä kertaa:

Silmukka päättyy sitten, koska exp on nolla, ja tulos 445 palautetaan. Tämä on sopusoinnussa kahden edellisen algoritmin kanssa.

Tämän algoritmin suoritusaika on O (log e ). Kun työskentelet suurten e- arvojen kanssa , se on paljon nopeampi kuin edelliset kaksi algoritmia.

Huomautuksia ja viitteitä

(fr) Tämä artikkeli on osittain tai kokonaan otettu englanninkielisestä Wikipedia- artikkelista Modulaarinen eksponentio  " ( katso luettelo kirjoittajista ) . <img src="https://fr.wikipedia.org/wiki/Special:CentralAutoLogin/start?type=1x1" alt="" title="" width="1" height="1" style="border: none; position: absolute;">