Algoritmi de exponențiere rapidă

Algoritmii de exponențiere rapidă ( algoritm de exponențiere dihotomică , algoritm de exponențiere binară) sunt algoritmi menționați să ridice un număr la o putere naturală în mai puține înmulțiri decât este necesar în determinarea gradului [1] . Algoritmii se bazează pe faptul că, pentru a ridica un număr la o putere , nu este necesar să înmulțiți numărul cu el însuși o dată, dar puteți înmulți puterile deja calculate. În special, dacă puterea a doi, atunci pentru ridicarea la o putere este suficient să pătrați numărul de ori, în timp ce cheltuiți înmulțiri în loc de . De exemplu, pentru a ridica un număr la puterea a opta, în loc să efectuați șapte înmulțiri , puteți pătra numărul ( ), apoi puteți pătra din nou rezultatul pentru a obține a patra putere ( ) și, în cele din urmă, puteți pătra din nou rezultatul și obțineți răspunsul ( ).

În plus, unii algoritmi pentru optimizarea ulterioară folosesc faptul că operația de pătrare este mai rapidă decât operația de înmulțire datorită faptului că cifrele din factor se repetă la pătrat [2] .

Algoritmul de exponențiere binară a fost propus pentru prima dată în secolul al XV-lea de către matematicianul persan Al-Kashi [3] .

Acești algoritmi nu sunt întotdeauna optimi. De exemplu, atunci când se folosește schema de la stânga la dreapta, exponențiarea rapidă a n = 15 va necesita trei înmulțiri și trei operații de pătrare, deși ridicarea la puterea a 15-a poate fi efectuată în 3 înmulțiri și 2 pătrat [4] . Exponentiația optimă corespunde construcției celui mai scurt lanț de aditivi .

Descriere

Algoritmul principal pentru exponențierea rapidă este schema „de la stânga la dreapta”. Își trage numele de la faptul că biții exponentului sunt priviți de la stânga la dreapta, adică de la sus la jos [5] .

Lăsa

 este o reprezentare binară a gradului n , adică

unde . Apoi

[5] .

Secvența de acțiuni la utilizarea acestei scheme poate fi descrisă după cum urmează:

  1. Reprezentați exponentul n în formă binară
  2. Dacă = 1, atunci rezultatul curent este pătrat și apoi înmulțit cu x. Dacă = 0, atunci rezultatul curent este pur și simplu pătrat [6] . Indicele i se modifică de la k -1 la 0 [7] .

Astfel, algoritmul de exponențiere rapidă se reduce la un analog multiplicativ al schemei lui Horner [6] :

Generalizări

Fie perechea ( S , *) un semigrup , atunci putem numi operația * înmulțire și definim operația de ridicare la o putere naturală:

Apoi, pentru a calcula valorile unui n în orice semigrup (în special, într- un grup abelian ), se pot folosi algoritmi de exponențiere rapidă [8] .

Exemple de rezolvare a problemelor

Aplicând algoritmul, calculăm 21 13 :

Schema de la dreapta la stânga

În această schemă, spre deosebire de schema „de la stânga la dreapta”, biții exponentului sunt priviți de la cel mai mic la cel mai mare [5] .

Secvența de acțiuni în implementarea acestui algoritm.

  1. Exprimați exponentul n în binar.
  2. Setați variabila auxiliară z egală cu numărul x.
    1. Dacă , atunci rezultatul curent este înmulțit cu z , iar numărul z însuși este pătrat. Dacă = 0, atunci trebuie doar să pătrați z [6] . În acest caz, indicele i , spre deosebire de schema de la stânga la dreapta, variază de la 0 la k -1 inclusiv [7] .

Acest circuit conține tot atâtea înmulțiri și pătrate cât circuitul „de la stânga la dreapta”. Cu toate acestea, în ciuda acestui fapt, schema de la stânga la dreapta este mai profitabilă decât schema de la dreapta la stânga, mai ales dacă exponentul conține multe unități. Ideea este că în schemă, de la stânga la dreapta, rezultatul operației = rezultat · x conține un multiplicator constant x . Și pentru x mic (ceea ce este adesea cazul în testele de primalitate), înmulțirea va fi rapidă. De exemplu, pentru x = 2 putem înlocui operația de înmulțire cu operația de adunare [7] .

Justificarea matematică a funcționării acestui algoritm poate fi reprezentată prin următoarea formulă:

[9] .

Exemplu . Să calculăm valoarea 21 13 folosind schema de exponențiere de la dreapta la stânga .

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

Complexitate computațională

Atât pentru schemele de la stânga la dreapta, cât și de la dreapta la stânga, numărul de operații la pătrat este același și este egal cu k, unde k  este lungimea exponentului n în biți, . Numărul de operații de înmulțire necesare este egal cu greutatea Hamming , adică numărul de elemente nenule din reprezentarea binară a numărului n . În medie, sunt necesare operații de înmulțire [6] .

De exemplu, pentru a ridica un număr la puterea a suta, acest algoritm va necesita doar 8 operații de înmulțire și pătrare [5] .

Pentru comparație, cu metoda standard de exponențiere, este necesară o operație de înmulțire, adică numărul de operații poate fi estimat ca [10] .

Optimizarea algoritmului

În general, operația de pătrare este mai rapidă decât operația de înmulțire. Metoda ferestrei vă permite să reduceți numărul de operații de înmulțire și, prin urmare, să faceți algoritmul de exponențiere mai optim [8] .

Fereastra este de fapt baza sistemului numeric [7] . Fie w  lățimea ferestrei, adică w caracterele indicatorului sunt luate în considerare la un moment dat.

Luați în considerare metoda ferestrei.

  1. Pentru x i precalculat
  2. Exponentul este prezentat sub următoarea formă: , unde
  3. Fie y  variabila în care va fi calculat rezultatul final. Lasă .
  4. Pentru toate i = k/w  - 1, k/w  - 2, ..., 0, faceți următoarele:
    1. [8] .

Acest algoritm necesită k pătrat, dar numărul de înmulțiri este redus la k/w în medie [8] .

Și mai eficientă este metoda ferestrei glisante. Constă în faptul că lățimea ferestrei în timpul execuției procesului se poate modifica:

  1. Exponentul este reprezentat ca , unde , și e i+1  — e i ≥ w .
  2. Pentru x i se calculează . Mai departe vom desemna x i ca x i .
  3. Fie y  variabila în care va fi calculat rezultatul final. Lasă .
  4. Pentru toate i = l  - 1, l  - 2, ..., 0 faceți următoarele:
    1. Pentru toate j de la 0 la e i+1  - e i  - 1 y pătrat
  5. Pentru toate j de la 0 la e 0  - 1 y pătrat [8] .

Numărul de operații de exponențiere din acest algoritm este același ca în metoda ferestrei, dar numărul de operații de înmulțire a fost redus la l , adică la media [8] .

De exemplu, să ridicăm numărul x la puterea lui 215 folosind metoda ferestrei glisante . Lățimea ferestrei este w = 3.

  1. 215 = 27 + 5 24 + 7
  2. y=1
  3. y = y x = x
  4. y este pătrat de 3 ori, deoarece la acest pas e 2  - e 1 -1 \u003d 7 - 4 - 1 \u003d 2, iar numărătoarea inversă este de la zero, adică y \u003d y 8 \u003d x 8
  5. y \u003d y x 5 \u003d x 13
  6. y este pătrat de 4 ori, deoarece la acest pas e 1  - e 0 -1 \u003d 4 - 0 - 1 \u003d 3, adică y \u003d y 16 \u003d x 208
  7. y \u003d y x 7 \u003d x 215

Aplicație

Algoritmul de exponențiere rapidă a devenit larg răspândit în criptosistemele cu cheie publică . În special, algoritmul este utilizat în protocolul RSA , schema ElGamal și alți algoritmi criptografici [11] .

Vezi și

Note

  1. Shvets A.N. Fast exponentiation . Data accesului: 13 noiembrie 2015. Arhivat din original pe 17 noiembrie 2015.
  2. Pankratova, 2009 , p. 7.
  3. Pankratova, 2009 , p. unsprezece.
  4. Pankratova, 2009 , p. zece.
  5. 1 2 3 4 Ryabko, Fionov, 2004 .
  6. 1 2 3 4 Manual, 2006 .
  7. 1 2 3 4 Crandall, Pomerance, 2011 .
  8. 1 2 3 4 5 6 Criptografie, 2005 .
  9. Gabidulin, Kshevetsky, Kolybelnikov, 2011 .
  10. Mahovenko, 2006 .
  11. Criptografie aplicată, 2002 .

Literatură