Snabba exponentieringsalgoritmer ( dikotom exponentieringsalgoritm, binär exponentieringsalgoritm) är algoritmer utformade för att höja ett tal till en naturlig potens i färre multiplikationer än vad som krävs för att bestämma graden [1] . Algoritmerna bygger på det faktum att för att höja ett tal till en potens , är det inte nödvändigt att multiplicera talet med sig själv en gång, utan du kan multiplicera redan beräknade potenser. I synnerhet, om potensen av två, då för att höja till en potens räcker det med att kvadrera antalet gånger, medan du spenderar multiplikationer istället för . Till exempel, för att höja ett tal till åttonde potensen, istället för att utföra sju multiplikationer , kan du kvadrera talet ( ), sedan kvadrera resultatet igen för att få fjärde potensen ( ), och slutligen kvadrera resultatet igen och få svaret ( ).
Dessutom använder vissa algoritmer för ytterligare optimering det faktum att kvadreringsoperationen är snabbare än multiplikationsoperationen på grund av att siffrorna i faktorn upprepas vid kvadrering [2] .
Den binära exponentieringsalgoritmen föreslogs först på 1400-talet av den persiske matematikern Al-Kashi [3] .
Dessa algoritmer är inte alltid optimala. Till exempel, när man använder vänster-till-höger-schemat, kommer en snabb exponentiering av n = 15 att kräva tre multiplikationer och tre kvadreringsoperationer, även om höjning till 15:e potens kan utföras i 3 multiplikationer och 2-kvadrering [4] . Optimal exponentiering motsvarar konstruktionen av den kortaste additivkedjan .
Huvudalgoritmen för snabb exponentiering är "vänster till höger"-schemat. Den har fått sitt namn från det faktum att exponentens bitar ses från vänster till höger, det vill säga från högt till lågt [5] .
Låta
är en binär representation av grad n , dvs.var . Sedan
[5] .Åtgärdssekvensen när du använder detta schema kan beskrivas enligt följande:
Således reduceras den snabba exponentieringsalgoritmen till en multiplikativ analog av Horners schema [6] :
Låt paret ( S , *) vara en halvgrupp , då kan vi kalla operationen * multiplikation och definiera operationen att höja till en naturlig potens:
Sedan, för att beräkna värdena för ett n i vilken semigrupp som helst ( särskilt i en Abelisk grupp ), kan man använda algoritmer för snabb exponentiering [8] .
Genom att tillämpa algoritmen beräknar vi 21 13 :
I detta schema, till skillnad från "vänster till höger"-schemat, ses exponentens bitar från det lägsta till det högsta [5] .
Sekvensen av åtgärder i implementeringen av denna algoritm.
Denna krets innehåller lika många multiplikationer och kvadrater som "vänster till höger"-kretsen. Men trots detta är vänster-till-höger-schemat mer lönsamt än höger-till-vänster-schemat, speciellt om exponenten innehåller många enheter. Poängen är att i schemat, från vänster till höger, innehåller operationsresultatet = resultat · x en konstant multiplikator x . Och för litet x (vilket ofta är fallet i primatitetstester) blir multiplikationen snabb. Till exempel, för x = 2 kan vi ersätta multiplikationsoperationen med additionsoperationen [7] .
Den matematiska motiveringen för driften av denna algoritm kan representeras av följande formel:
[9] .Exempel . Låt oss beräkna värdet 21 13 med hjälp av exponentieringsschemat från höger till vänster .
i | 0 | ett | 2 | 3 |
---|---|---|---|---|
21 | 441 | 194 481 | 37 822 859 361 | |
ett | 0 | ett | ett |
För både vänster-till-höger- och höger-till-vänster-schemat är antalet kvadreringsoperationer detsamma och lika med k, där k är längden på exponenten n i bitar, . Antalet nödvändiga multiplikationsoperationer är lika med Hamming -vikten , det vill säga antalet element som inte är noll i den binära representationen av talet n . I genomsnitt krävs multiplikationsoperationer [6] .
Till exempel, för att höja en siffra till hundrade potens, kommer denna algoritm att kräva endast 8 operationer av multiplikation och kvadrering [5] .
Som jämförelse, med standardexponentieringsmetoden, krävs en multiplikationsoperation, det vill säga antalet operationer kan uppskattas till [10] .
I allmänhet är kvadreringsoperationen snabbare än multiplikationsoperationen. Fönstermetoden låter dig minska antalet multiplikationsoperationer och därför göra exponentieringsalgoritmen mer optimal [8] .
Fönstret är faktiskt basen i talsystemet [7] . Låt w vara bredden på fönstret, det vill säga w tecken i indikatorn tas i beaktande åt gången.
Tänk på fönstermetoden.
Denna algoritm kräver k -kvadrering, men antalet multiplikationer reduceras till k/w i genomsnitt [8] .
Ännu effektivare är metoden med skjutfönster. Det ligger i det faktum att fönstrets bredd under genomförandet av processen kan ändras:
Antalet exponentieringsoperationer i denna algoritm är detsamma som i fönstermetoden, men antalet multiplikationsoperationer har reducerats till l , det vill säga till genomsnittet [8] .
Låt oss till exempel höja talet x till potensen 215 med hjälp av metoden med skjutfönster . Bredden på fönstret är w = 3.
Algoritmen för snabb exponentiering har blivit utbredd i kryptosystem med offentliga nyckel . Algoritmen används i synnerhet i RSA- protokollet , ElGamal-schemat och andra kryptografiska algoritmer [11] .