Snabba exponentieringsalgoritmer

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 .

Beskrivning

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:

  1. Representera exponent n i binär form
  2. Om = 1, då kvadreras det aktuella resultatet och multipliceras sedan med x. Om = 0, då kvadreras det aktuella resultatet helt enkelt [6] . Index i ändras från k -1 till 0 [7] .

Således reduceras den snabba exponentieringsalgoritmen till en multiplikativ analog av Horners schema [6] :

Generaliseringar

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

Exempel på problemlösning

Genom att tillämpa algoritmen beräknar vi 21 13 :

Höger till vänster-schema

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.

  1. Uttryck exponenten n binärt.
  2. Ställ in hjälpvariabeln z lika med talet x.
    1. Om , då det aktuella resultatet multipliceras med z , och talet z i sig kvadratiseras. Om = 0 behöver du bara kvadratisera z [6] . I detta fall varierar indexet i , till skillnad från schemat från vänster till höger, från 0 till k -1 inklusive [7] .

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
  1. 21 194 481 = 4084 101
  2. 4084 101 37 822 859 361 = 154 472 377 739 119 461

Beräkningskomplexitet

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

Algoritmoptimering

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.

  1. För förberäknade x i
  2. Exponenten presenteras i följande form: , där
  3. Låt y  vara variabeln där det slutliga resultatet kommer att beräknas. Låt .
  4. För alla i = k/w  - 1, k/w  - 2, ..., 0, gör följande:
    1. [8] .

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:

  1. Exponenten representeras som , där , och e i+1  — e i ≥ w .
  2. För x beräknas i . Vidare kommer vi att beteckna x i som x i .
  3. Låt y  vara variabeln där det slutliga resultatet kommer att beräknas. Låt .
  4. För alla i = l  - 1, l  - 2, ..., 0 gör följande:
    1. För alla j från 0 till e i+1  - e i  - 1 y kvadrat
  5. För alla j från 0 till e 0  - 1 y kvadrat [8] .

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.

  1. 215 = 27 + 5 24 + 7
  2. y=1
  3. y = y x = x
  4. y kvadreras 3 gånger, eftersom i detta steg e 2  - e 1 -1 \u003d 7 - 4 - 1 \u003d 2, och nedräkningen är från noll, det vill säga y \u003d y 8 \u003d x 8
  5. y \u003d y x 5 \u003d x 13
  6. y kvadreras 4 gånger, eftersom i detta steg e 1  - e 0 -1 \u003d 4 - 0 - 1 \u003d 3, det vill säga y \u003d y 16 \u003d x 208
  7. y \u003d y x 7 \u003d x 215

Applikation

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

Se även

Anteckningar

  1. Shvets A.N. Snabb exponentiering . Datum för åtkomst: 13 november 2015. Arkiverad från originalet 17 november 2015.
  2. Pankratova, 2009 , sid. 7.
  3. Pankratova, 2009 , sid. elva.
  4. Pankratova, 2009 , sid. tio.
  5. 1 2 3 4 Ryabko, Fionov, 2004 .
  6. 1 2 3 4 Handbok, 2006 .
  7. 1 2 3 4 Crandall, Pomerance, 2011 .
  8. 1 2 3 4 5 6 Kryptografi, 2005 .
  9. Gabidulin, Kshevetsky, Kolybelnikov, 2011 .
  10. Mahovenko, 2006 .
  11. Tillämpad kryptografi, 2002 .

Litteratur