Read this in other languages: english.
En algèbre, une puissance d’un nombre est le résultat de la multiplication répétée de ce nombre avec lui-même.
Elle est souvent notée en assortissant le nombre d’un entier, typographié en exposant, qui indique le nombre de fois qu’apparaît le nombre comme facteur dans cette multiplication.
Comment trouver a élevé à la puissance b ?
On multiplie a avec lui-même, b nombre de fois.
Ainsi, a^b = a * a * a * ... * a (b occurrences de a).
Cette opération aura un complexité linéaire, notée O(n),
car la multiplication aura lieu exactement n fois.
Peut-on faire mieux que cette implémentation naïve?
Oui, on peut réduire le nombre de puissance à un complexité de O(log(n)).
Cet algorithme utilise l’approche « diviser pour mieux régner »
pour calculer cette puissance.
En l’état, cet algorithme fonctionne pour deux entiers positifs X et Y.
L’idée derrière cet algorithme est basée sur l’observation suivante.
Lorsque Y est pair:
X^Y = X^(Y/2) * X^(Y/2)
Lorsque Y est impair:
X^Y = X^(Y//2) * X^(Y//2) * X
où Y//2 est le résultat de la division entière de Y par 2.
Par exemple
2^4 = (2 * 2) * (2 * 2) = (2^2) * (2^2)
2^5 = (2 * 2) * (2 * 2) * 2 = (2^2) * (2^2) * (2)
Ainsi, puisqu’à chaque étape on doits calculer
deux fois la même puissance X ^ (Y / 2),
on peut optimiser en l’enregistrant dans une variable intermédiaire
pour éviter son calcul en double.
Complexité en temps
Comme à chaque itération nous réduisons la puissance de moitié,
nous appelons récursivement la fonction log(n) fois. Le complexité de temps de cet algorithme est donc réduite à:
O(log(n))