May 20, 2024

Wiki

Python

Aide

edit SideBar

Search

L'exponentiation rapide


Objectifs

Diverses opérations en cryptographie nécessitent de calculer un multiple ou une puissance : il s'agit par exemple, on le verra, de la manière de chiffrer et déchiffrer pour le RSA, et un générateur de nombres pseudo-aléatoires cryptographiquement sûr tel que le BBS se résume à itérer un calcul de puissance modulo $p$. Ces opérations doivent donc pouvoir se faire efficacement, et ce d'autant plus que les objets considérés ici (les capteurs sans fil) sont peu puissants et sur batterie.

Aussi, étant donné un exposant $e$, on souhaite ici calculer le plus efficacement possible $x^e, \forall x$, c'est-à-dire en minimisant le nombre de multiplications, pour gagner en temps d'exécution.

En effet, pour calculer $X^8$, on peut :

  • Calculer $X \times X \times ... \times X$, ce qui fait 7 multiplications. La liste des exposants calculés est : 1, 2, 3, 4, 5, 6, 7, 8.
  • Calculer :
    • $Y = X \times X$, ce qui correspond à $X^2$,
    • puis $Z = Y \times Y$, ce qui correspond à $X^4$,
    • enfin $T = Z \times Z$, ce qui donne le résultat.
On obtient donc le résultat $T = X^8$ en seulement trois multiplications. La liste des exposants est : 1, 2, 4, 8.

L'écart se creuse très rapidement, entre la méthode naïve et les méthodes plus évoluées. Ainsi, pour calculer $X^{1024}$, il faut

  • 1023 multiplications, pour la méthode naïve,
  • 10 multiplications pour la méthode dite exponentiation rapide.

Quand on sait que pour chiffrer, dans la méthode RSA, il faut élever notre message (un nombre) à la puissance "un grand nombre premier" (comprendre : un exposant de plusieurs centaines de chiffres), on comprend l'intérêt de racourcir le temps de calcul d'une puissance.

L'exponentiation rapide

Présentation

L'exponentiation rapide est une technique classique, utilisée en pratique, pour obtenir la puissance d'un nombre donné.

Cette exponentiation rapide itère, pour le calcul de $X^e$, les opérations suivantes :

  • l'élévation au carré,
  • la multiplication par $X$,

dans un ordre dépendant de l'écriture en base 2 de $e$.

Elle se comprend bien dans sa version récursive :

  • si $e$ est pair, on calcule (récursivement) $X^{e/2}$, que l'on multipliera par lui-même,
  • sinon, on calcule (récursivement) $X^{e-1}$, que l'on multipliera par $X$.

L'algorithme

La technique ci-dessus étant récursive, son implémentation dans un capteur risque d'être problématique. Mais comme les opérations à faire sont déterminées par la parité du nombre suite à une division par 2, ou a une division par 2 après une suppression de 1, on en déduit donc que l'écriture binaire du nombre contient exactement les opérations à faire.

Plus précisément...

  • On écrit $e$ en base 2,
  • On enlève le premier 1 de cette écriture,
  • On remplace alors, dans cette écriture,
    • les 0 par des $S$,
    • les 1 par des $SX$,
on obtient ainsi un mot constitué des lettres $S$ et $X$.
  • On part du nombre $X$.
    • si la première lettre est $S$, on élève au carré (square)
    • sinon, on multiplie par $X$
  • On recommence avec les lettres suivantes, jusqu'à la fin du mot.

Exemples

Premier exemple

15 s'écrit 1111 en base 2.

L'algorithme précédent aboutit au mot $SXSXSX$. Les étapes du calcul sont alors :

 res = $X$$X$
Sres = res * res$X^2$
Xres = res * $X$$X^3$
Sres = res * res$X^6$
Xres = res * $X$$X^7$
Sres = res * res$X^{14}$
Xres = res * $X$$X^{15}$

Le dernier résultat (res) contient donc la puissance recherchée, en seulement 6 opérations (contre 14, dans la méthode naïve).

La liste d'exposants est ici : 1, 2, 3, 6, 7, 14, 15.

Deuxième exemple

19 s'écrit 10011 en base 2, ce qui fournit le mot $SSSXSX$.

Après travail, la liste d'exposants est ici : 1, 2, 4, 8, 9, 18, 19.

On pourrait donc calculer $X^{19}$ en 6 multiplications.

Travaux pratiques

Réalisez une fonction qui réalise l'exponentiation rapide dans une pyboard.

La meilleure exponentiation ?

Notons pour finir que l'exponentiation rapide ne donne pas la méthode la plus rapide systématiquement. Par exemple, pour calculer $X^{15}$, on aurait pu procéder ainsi :

$a_1 = X$$X$
$a_2 = a_1*a_1$$X^2$
$a_3 = a_2*a_1$$X^3$
$a_4 = a_3*a_3$$X^6$
$a_5 = a_4*a_3$$X^9$
$a_6 = a_4*a_4$$X^{15}$

Soit 5 multiplications pour $X^{15}$, au lieu de 6 par la méthode dite exponentiation rapide. Une meilleure liste d'exposants pour $X^{15}$ est donc : 1, 2, 3, 6, 9, 15. Des techniques plus performantes existent donc, telles que les chaînes d'addition détaillées sur une autre page de ce wiki.

Page Actions

Recent Changes

Group & Page

Back Links