Exponentiation rapide

Un article de Wikipédia, l'encyclopédie libre.
Aller à : navigation, rechercher

L'exponentiation rapide est un algorithme utilisé pour calculer rapidement, de grandes puissances entières. En anglais, cette méthode est aussi appelée square-and-multiply (« mettre au carré et multiplier »).

Écriture mathématique[modifier | modifier le code]

La première façon de calculer une puissance n^p, est de multiplier n par lui-même p fois. Cependant, il existe des méthodes bien plus efficaces, où le nombre d'opérations nécessaires n'est plus de l'ordre de p mais de l'ordre de log(p), pour le logarithme en base 2.

Par exemple, si on écrit p=\sum_{i\leq d} a_i2^i pour a_i\in \{0,1\}, on constate que :

n^p=n^{a_0}(n^2)^{a_1}(n^{2^2})^{a_2}\dots (n^{2^d})^{a_d}

Il faut ainsi d opérations pour calculer tous les n^{2^i}, puis d opérations supplémentaires pour former le produit des (n^{2^i})^{a_i}. Le nombre d'opérations total est donc 2\cdot d, qui est bien de l'ordre du logarithme de p. Cette simple remarque algébrique conduit à l'algorithme présenté dans la section suivante.

Algorithme[modifier | modifier le code]

Soit n un entier strictement supérieur à 1, supposons que l'on sache calculer pour tout x appartenant à l'ensemble des réels, toutes les puissances xk de x, pour tout k, tel que 1 \le k < n .

  • Si n est pair alors x^n = (x^2)^{n/2}. Il suffit alors de calculer y^{n/2} \mbox{ avec } y = x^2.
  • Si n est impair et n>1, alors x^n = x\cdot(x^2)^{(n-1)/2}. Il suffit de calculer y^{(n-1)/2} \mbox{ avec } y = x^2 et de multiplier par x le résultat.

Cette remarque nous amène à l'algorithme récursif suivant qui calcule xn pour un entier strictement positif n:


\mbox{puissance}(x,\,n)=\left\{
\begin{matrix} x, & \mbox{si }n\mbox{ = 1} \\ 
\mbox{puissance}(x^2,\,n/2), & \mbox{si }n\mbox{ est pair} \\
x\times\mbox{puissance}(x^2,\,(n-1)/2), & \mbox{si }n >\mbox{2 est impair} \\
\end{matrix}\right.

En comparant à la méthode ordinaire qui consiste à multiplier x par lui-même n-1 fois, cet algorithme nécessite de l'ordre de O(lg n) multiplications et ainsi accélère le calcul de xn de façon spectaculaire pour les grands entiers.

La méthode fonctionne dans tout semi-groupe et est souvent utilisée pour calculer des puissances de matrices, et particulièrement en cryptographie, mais aussi pour calculer les puissances dans un anneau d'entiers modulo q. Elle peut être aussi utilisée pour calculer des puissances d'un élément dans un groupe, en utilisant pour les puissances négatives la règle : puissance(x, -n) = (puissance(x, n))-1. C'est cette méthode que l'on applique lorsque l'on effectue la multiplication de deux nombres chiffre par chiffre en base 2 : le groupe est (\mathbb{Z},+).

Voir aussi[modifier | modifier le code]

Liens externes[modifier | modifier le code]