b) 1`ere m´ethode (des poids faibles vers les poids forts)
En lisant le d´eveloppement en base deux de droite `a gauche si N=(an...a0)[2]: c’est le
plus souvent comme cela que l’algorithme est pr´esent´e, car dans ce cas, on peut aussi obtenir
les chiffres successifs du d´eveloppement en base 2`a chaque ´etape par l’algorithme des poids
faibles d´ej`a vu plus haut : pas besoin d’avoir fait le calcul du d´ev. en base 2 avant !
Pour mettre en oeuvre l’algorithme on utilise trois variables qu’on va appeler res et aux
comme r´esultat et auxiliaire et la variable Nqui au d´epart contient comme valeur l’exposant
Net qui va permettre `a chaque ´etape de calculer le chiffre du d´eveloppement en base 2 de
N.
De mani`ere pas compl`etement formelle, `a l’´etape i:
●On stocke dans aux la valeur de x2i, obtenue comme carr´e de x2i−1obtenu `a l’´etape
pr´ec´edente.
●En mˆeme temps, on divise `a chaque ´etape Npar 2 pour connaˆıtre le i-`eme chiffre aide
son ´ecriture en base 2. i.e. on it`ere N =N//2 . Le aiest le reste de la division euclidienne
de Npar 2.
●Enfin toujours `a l’´etape i,si ai=1, on multiplie res par x2ic’est-`a-dire la valeur de
aux `a l’´etape i, sinon on ne change pas res.
Exercice `a faire : impl´ementer cette id´ee d’algorithme en Python.
Rappel l’algo. de d´ev. en base deux des poids faibles vers les poids forts illustr´e
sur un exple :
24 =2×12 +0→a0=0,
12 =2×6+0→a1=0,
6=2×3+0→a2=0,
3=2×1+1→a3=1,
1=2×0+1→a4=1.
c) 2`eme m´ethode (des poids forts vers les poids faibles)
En lisant l’´ecriture en base 2de gauche `a droite : cette m´ethode ´evite l’utilisation d’une
variable auxiliaire, mais n´ecessite d’avoir calcul´e le d´eveloppement en base 2 de N: ce qui
n’est pas un gros probl`eme pratique en Python, mais jouerait sur les questions de coˆut.
L’id´ee astucieuse, qui est utile dans d’autres contextes (algorithme de H¨orner), est d’´ecrire :
xN=((...(xan)2xan−1)2...)xa1)2xa0
Par exemple avec 24 qui s’´ecrit 11000 en base 2 : x24 =(((x)2.x)2)2)2).
On lit donc l’´ecriture en base 2de Nde gauche `a droite, on part de res:= 1 et `a chaque
´etape s’il y a un 1dans le d´eveloppement de Nen base 2on remplace res par (res*res)*x,
sinon on prend juste le carr´e i.e. on remplace res par (res*res).
Exercice `a faire : impl´ementer cette id´ee d’algorithme en Python
d) Montrer que si Ns’´ecrit avec n+1 chiffres en base 2, alors cet algorithme permet de calculer
xNavec au plus 2nmultiplications.
e) Comparer la vitesse de vos fonctions avec celle de la fonction pow(x,N) de Python qui
utilise ce mˆeme algorithme d’exponentiation rapide.
2