Algorithmique
Alexandre Duret-Lutz
26 février 2016
A. Duret-Lutz Algorithmique 1 / 52
Cinquième partie V
Trois problèmes
1Exponentiation rapide
Algorithme
Généralisation
Matrices
Polynômes
Chaînes additives
2Suite de Fibonacci
Définition
Calcul bête
Programmation dynamique
Vision matricielle
Calcul analytique
Autres façons de calculer Fn
Conclusion
3Plus courts chemins
Définition
Version en Θ(n4)
Version en Θ(n3log n)
Version en Θ(n3)
A. Duret-Lutz Algorithmique 2 / 52
Exponentiation rapide
1Exponentiation rapide
Algorithme
Généralisation
Matrices
Polynômes
Chaînes additives
2Suite de Fibonacci
Définition
Calcul bête
Programmation dynamique
Vision matricielle
Calcul analytique
Autres façons de calculer Fn
Conclusion
3Plus courts chemins
Définition
Version en Θ(n4)
Version en Θ(n3log n)
Version en Θ(n3)
A. Duret-Lutz Algorithmique 3 / 52
Exponentiation classique
ab=a×a× ··· × a
| {z }
b1 multiplications
L’algorithme de calcul de abnaïf demande une boucle de Θ(b)
multiplications.
A. Duret-Lutz Algorithmique 4 / 52
Exponentiation rapide (Intro)
Notations
On note dn1. . . d1d0la représentation d’un nombre de nbits en
base 2.
Par exemple 19 =10011.
Exponentiation
On veut calculer absachant que b=dn1. . . d0.
ab=adn1...d0=a2×dn1...d2d1×ad0= (a×a)dn1...d2d1×ad0
Par exemple 519 =510011 =251001 ×51.
On calcule récursivement : 251001 =625100 ×251.
625100 =39062510 ×6250.
39062510 =1525878906251×3906250.
Finalement 519 =152587890625 ×25 ×5
Combien ce calcul demande-t-il de multiplications ?
A. Duret-Lutz Algorithmique 5 / 52
Exponentiation rapide (Algo)
power(a,b) =
1 si b=0
power(a×a,bb/2c)si best pair
power(a×a,bb/2c)×asi best impair
FastPower(a,b)
1 if b=0
2 return 1
3 if odd(b)then
4 return a×FastPower(a×a,bb/2c)
5 else
6 return FastPower(a×a,bb/2c)
On fait deux multiplications par bit à 1 et une multiplication par bit à
0 dans la représentation binaire de b. Soit Θ(log b)multiplications.
A. Duret-Lutz Algorithmique 6 / 52
Généralisation (1/2)
Monoïde
Un monoïde (E, ?, e)est un ensemble Emunie d’une loi interne
associative ?et d’un élément neutre e. On a
associativité : x,y,z,x?(y?z) = (x?y)?z
élément neutre : x,x?e=e?x=x
Puissance
Pour nNet xEon définit la loi externe
xn=(esi n=0
xn1?xsinon
L’algorithme d’exponentiation rapide peut alors être utilisé pour
calculer xnen Θ(log n)opérations. Les propriétés du monoïde sont
importantes pour l’algorithme, car par exemple x4s’y calcule
comme ((x?e)?(x?e)) ?((x?e)?(x?e)) au lieu de
(((e?x)?x)?x)?xcomme dans la définition.
A. Duret-Lutz Algorithmique 7 / 52
Généralisation (2/2)
On peut aussi définir les puissances négatives si l’on travaille sur un
groupe.
Groupe
Un monoïde (E, ?, e)est un groupe si tout élément xEpossède
un inverse pour ?, noté x: on a x?x=x?x=e.
Puissance
Pour nNet xEon définit alors
xn=
esi n=0
xn1?xsi n>0
xnsi n<0
Lesquels de ces monoïdes sont des groupes ? (N,×,1),(N,+,0),
(Z,×,1),(Z,+,0),(Q,×,1),(Z/pZ,×,1),(U,×,1),,·, ε),
(Mn(K),×,In),(GLn(K),×,In),(K[X],×,1),(RatE),·, ε).
A. Duret-Lutz Algorithmique 8 / 52
Exponentielle de matrices
Question
Soient Aune matrice de taille n×net bun entier positif.
Combien d’opération sont nécessaires pour calculer Ab?
Réponse
Il faut Θ(log b)multiplications pour calculer la puissance.
Or une multiplication matricielle demande n3multiplications
scalaires.
Abdemande donc Θ(n3log b).
Note
On peut multiplier deux matrices avec moins de n3opérations. Par
exemple l’algorithme de Strassen le fait avec Θ(nlog2(7))opérations
(il y a encore mieux). Dans ce cas la complexité est bien sûr encore
moindre.
A. Duret-Lutz Algorithmique 9 / 52
Exponentielle de polynômes
Question
Soient A(X)un polynôme de degré net bun entier positif.
Combien d’opération sont nécessaires pour calculer Ab(X)?
Réponse
Il faut Θ(log b)multiplications pour calculer la puissance.
Multiplier « à la main » deux polynômes de degrés iet jdemande
Θ(ij)opérations. On ne connaît pas tous les degrés qui vont être
utilisés par l’algorithme d’exponentiation, mais au pire le plus haut
degré est celui du polynôme final : bn.
Calculer Ab(X)demande donc O((bn)2log b)opérations.
Note
Avec la multiplication de Karatsuba, vue précédemment, on fait
seulement O((bn)log23log b)opérations.
A. Duret-Lutz Algorithmique 10 / 52
Cette approche est-elle optimale ?
Calculons a31. On a 31 =11111.
Avec l’algo :
a2=a?a,
a4=a2?a2,
a8=a4?a4,
a16 =a8?a8,
a24 =a16 ?a8,
a28 =a24 ?a4,
a30 =a28 ?a2,
a31 =a30 ?a,
soit 8 opérations ?.
Plus vite :
a2=a?a,
a3=a2?a,
a5=a3?a2,
a10 =a5?a5,
a11 =a10 ?a,
a21 =a11 ?a10,
a31 =a21 ?a10,
soit 7 opérations ?.
Les puissances calculées forment une chaîne additive.
A. Duret-Lutz Algorithmique 11 / 52
Chaînes additives
Un chaîne additive pour best un séquence d’entiers
1=p1,p2,p3, . . . , pk=btelle que pour tout i>1 il existe jet k
dans [[1,i[[ tels que pi=pj+pk.
1,2,4,8,16,24,28,30,31 et
1,2,3,5,10,11,21,31 sont deux chaînes additives pour 31.
On montre que la taille de la chaîne additive la plus courte pour best
en Θ(log b), ce qui signifie que l’algorithme d’exponentiation rapide
est asymptotiquement optimal. L’exemple ci-dessus montre seulement
que le nombre effectif de multiplications n’est pas optimal.
A. Duret-Lutz Algorithmique 12 / 52
Chaînes additives/soustractives
Pour la puissance sur un groupe, on peut chercher une chaîne
additive/soustractive.
Par exemple si 1,2,3,5,10,11,21,31 est la chaîne additive la plus
courte pour 31, la chaîne additive/soustractive la plus courte est
1,2,4,8,16,32,31. On en déduit :
a2=a?a,
a4=a2?a2,
a8=a4?a4,
a16 =a8?a8,
a32 =a16 ?a16,
a31 =a32 ?a. Soit 6 opérations, mais un calcul de aen plus.
Sur Qoù calculer aest immédiat, cette méthode a du sens.
Pour des matrices, A32 ×A1est un peu plus coûteux...
Sur (N,×,1), où an’est pas défini, on sait pourtant écrire
a31 =a32/a. Donc le groupe est la mauvaise abstraction.
A. Duret-Lutz Algorithmique 13 / 52
Éléments simplifiables (1/2)
Un élément xd’un monoïde est dit
simplifiable à droite ssi y,z,y?x=z?x=y=z
simplifiable à gauche ssi y,z,x?y=x?z=y=z
simplifiable ssi il est simplifiable à gauche et à droite.
Dans ,·, ε)tout élément est simplifiable : on peut par exemple
noter (a·b)/b=aet a\(a·b) = bles simplifications à droite et à
gauche.
Dans (N,×,1)tout élément non nul est simplifiable. on note
(a×b)/a=bet (a×b)/b=asans distinguer droite et gauche
parce que ×est commutatif.
Dans (K[X],×,1)tout polynôme non nul est simplifiable.
Dans (Mn(K),×,In)seules les matrices inversibles sont
simplifiables. Par ex. 2 1
213 0
1 2=2 1
211 1
3 0
A. Duret-Lutz Algorithmique 14 / 52
Éléments simplifiables (2/2)
L’exponentiation à l’aide de chaînes additives/soustractives marche
pour tout élément simplifiable.
a2=a?a,
a4=a2?a2,
a8=a4?a4,
a16 =a8?a8,
a32 =a16 ?a16,
a31 =a32/a.
Encore faut-il que l’opération de simplification soit peu coûteuse.
Poussons le bouchon...
En fait la propriété de simplifiabilité est plus que ce dont on a besoin
pour pouvoir appliquer l’algorithme.
A. Duret-Lutz Algorithmique 15 / 52
L’inverse de groupe (juste pour le fun)
Posons A=
1 1 0
2 3 1
3 5 2
, et A#=1
16
14 8 6
2 0 2
18 8 10
.
Aet A#ne sont pas inversibles. Pourtant, n>0,An+1×A#=An.
A#est l’inverse de groupe (ou inverse de Drazin d’index 1) de A.
A#existe pour tout matrice telle que rg(A2) = rg(A).
On peut considérer qu’un endormorphisme fsur un espace vectoriel
Etombe dans l’un des cas suivants (le second incluant le premier) :
Im(f) = E:fest inversible (et donc simplifiable) et f#=f1
Im(f)Ker(f) = E:fn’est pas forcément inversible mais il existe
un unique pseudo-inverse f#tel que #f=f,f##=f#, et
#=f#f(tout ceci implique en particulier fff #=f)
Im(f)Ker(f)6={~
0}:f#n’existe pas (on pourrait pousser le
bouchon plus loin avec les inverses de Drazin d’index k)
A. Duret-Lutz Algorithmique 16 / 52
Suite de Fibonacci
1Exponentiation rapide
Algorithme
Généralisation
Matrices
Polynômes
Chaînes additives
2Suite de Fibonacci
Définition
Calcul bête
Programmation dynamique
Vision matricielle
Calcul analytique
Autres façons de calculer Fn
Conclusion
3Plus courts chemins
Définition
Version en Θ(n4)
Version en Θ(n3log n)
Version en Θ(n3)
A. Duret-Lutz Algorithmique 17 / 52
Introduction
En 1202, Fibonacci, un mathématicien italien, a posé la question
suivante.
« Possédant initialement un couple de lapins, combien de couples
obtient-on en douze mois si chaque couple engendre tous les mois un
nouveau couple à compter du second mois de son existence ? »
A. Duret-Lutz Algorithmique 18 / 52
Suite de Fibonacci
Définition
F0=0
F1=1
Fn=Fn1+Fn2pour n2
Premiers termes
0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597, . . .
Problème
Pour un ndonné, il faut calculer Fn.
Quel est le coût de ce calcul ?
A. Duret-Lutz Algorithmique 19 / 52
Calcul récursif
Algorithme
RecFibonacci(n)
1 if n=0 or n=1
2 return n
3 else
4 return RecFibonacci(n1)
Complexité
T(n) = (1 si n<2
T(n1) + T(n2)
Autrement dit calculer Fnavec cette méthode demande
T(n) = Θ(Fn+1)opérations...
A. Duret-Lutz Algorithmique 20 / 52
1 / 13 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !