Académique Documents
Professionnel Documents
Culture Documents
1. Introduction
1.1 Algorithme d’exponentiation rapide
onsidéronsunentier n etunélément x d’unmonoïdemultiplicatif(X
C ,∗ )(x peutdoncêtreunnombre,une
n
matrice,unpolynôme...),etintéressons-nousaucalculdex ,enchoisissantpourmesureducoûtlenombre
demultiplications effectuées. Un algorithme simplevient immédiatement à l’esprit :
let
recpuissance x =
function
|
0−
>
1
|
1−
>
x
|
n−
>
x * puissance x (n
−
1) ;;
( par souci de lisibilité, tous nos algorithmes seront de typeint−> int; pour adapter ceux-ci à un autre
type ilsuffira de modifier l’élément neutre
1etle produit
*).
À l’évidence, le nombre de multiplications effectuées est égal àn−1 ; il s’agit donc d’un algorithmede coût
linéaire.
Il est cependant très facile de faire mieux, en utilisant l’algorithme suivant, connu sous le nom d’algorithme
d’exponentiation rapide:
let
recpuissance x =
function
|
0−
>
1
|
1−
>
x
|
n when n mod 2 = 0−
> puissance (x * x) (n / 2)
|
n−
>
x * puissance (x * x) (n / 2) ;;
jn k
Il s’agit d’une fonction inductive dont la terminaison est justifiée par l’inégalité :∀n>2, 2 < netla validité
k 2 k 2k+
1
par les égalités = (x ) x
: 2 k
=x(x )
2
x
Si on notecnle nombre de multiplications effectuées,on dispose des relations :c0=c1 = 0,c2k=ck + 1 et
c2 k +1=ck + 2, soit encore :cn=cb n /2c+ 1 + (nmod 2).
p k
X bk2
, avecbp= 1.p−
1
Considérons la décomposition denen base 2
:n= [bp, bp− 1,...,b0]2 =k=0
jn
k
Nous avons 2 = [bp, bp− 1,...,b1] 2etnmod 2 =b0 ,et il est alors facile d’obtenir :cn=p+X
bk .
k=
0
p
Le coût dans le meilleur des cas intervient lorsquenest une puissance de 2 : sin= 2 , alorscn=p= logn.Le
p+1
coût dans le pire des cas intervient lorsquen= 2 −1 (l’écriture binaire denne comporte que des1) : nous
avons alorscn = 2p= 2blognc.
3
t il n’est guère difficile d’établir qu’en moyenne,cn= 2blognc.
E
Il s’agit donc d’un algorithme de coût logarithmique.
http://info-llg.fr
8.2 option informatique
nautreexempleclassiqued’utilisationdeceparadigmeestl’algorithmederecherchedichotomique:étant
U
donnéuntableautriéparordrecroissantd’entiers,commentdéterminersiunélémentappartientoupasàce
tableau ?
Le principe est bien connu : on compare l’élément recherché à l’élément médian, et le cas échéant on répète
larecherche dans la partie gauche ou droite du tableau.
x < m m x > m
i k j
let
recherche_dicho x t =
let rec
aux i j =
if
j < ithenfalse
else match
(i + j) / 2
with
| k when x = t.(k)−
>
true
| k when x < t.(k)−
>
aux i (k
−
1
)
| k−
> aux (k+1) j
in
f 0 (vect_length t−1) ;;
Notonscn le nombre de comparaisons nécessaires entrexet un élément du tableau de taillendans le pire
des cas (correspondant au cas oùxest supérieur àtous les éléments du tableau). Nous avonsc0= 0etcn= 2
+c
bn /2cpour
jn
n>1. Si on introduit de nouveau l’écriture binaireden:n= [bp ,bp−1,···,b0] 2 , nous avons 2k = [bp ,bp−1,· ··
,b1] 2 , et il est alors facile d’en déduire quecn= 2p+ 2 = 2blognc + 2.
ous allons faire une étude générale de ces relations de récurrence en commençant par traiter le cas oùn
N
estune puissance de 2 : posonsn= 2petup =c2p . La relation de récurrence devient :up = (a+b) u
p− 1+d2 p ,
soit :
p
(a
+b) =
u
p − 1
up p
+b) .
(a
+
p−1
b) +d
2 p (a
Pour poursuivre ce calcul, il est nécessaire de préciser la valeur dedn . Nous allons supposer que le coûtde
k
ladécomposition et de la recomposition est polynomial(au sens large), ce qui permet de poserdn =λn .
Nous
avons alors : p k
X j= 1 +b, 2 (u 0+
u0+ λ !
p
λp) (a+b) sia+
p j = α
2
up= (a+b) k k
+ β(a+b) siab= 2
2 a+b kp p
cn+ 1−cn=a( c d(n+1)/2 e−cd n/2e) +b(cb (n+ 1)/2c−cb n /2c) +dn+ 1−dn > 0
p
Lorsque cette conditionestsatisfaite,onpeutencadrer n pardeuxpuissancesconsécutivesde2:2 6n<
p+1 k
2 ,avec p = blognc,cequiconduità up 6cn 6up+1.Lorsque dn = λn ,lesrésultatsprécédentspermettent
’établirla règle suivante (connue sous le nom dethéorème maître) :
d
k
Théorème. —Lorsque a+b >1, la suite(d
n )n ∈ Ncroissanteet dn= Θ(n ), on a :
k
silog(a+b)< k, cn= Θ(n );
silog(a+b) =k, cn=
k
Θ(n logn) ; silog(a+b)> k,
log(a+
b)
cn= Θ(n ).
ous utiliserons désormais ce résultat pour évaluer rapidement le coût d’une méthode suivant le principe
N
diviser pour régner.
Appelé merge sort en anglais, le tri fusion adopte une approche « diviser pour régner » : on partage le
jn k ln m
tableau endeuxpartiesdetaillesrespectives 2 et 2 quel’ontrieparunappelrécursif,puisonfusionne
les deuxparties triées.
tableau trié
Ilestraisonnabledepenserquelascissionetlafusionontuncoûtlinéaire(ceseravérifiéplusloin),etque
par voie de conséquence la relation de récurrence satisfaite par le nombre cn de comparaisons est de la
forme :cn =cb n /2c+cdn /2e+ Θ(n). Le théorème maîtremontre que dans ces conditionscn= Θ(nlogn) .
http://info-llg.fr
8.4 option informatique
ependant,unedifficultéseprésentelorsqu’onchercheàimplémentercetalgorithmeavecdesvecteurs:il
C
est difficiledefusionnerdeuxdemi-tableauxsurplace,c’estàdireens’autorisantuniquementlapermutation
dedeuxéléments(cen’estpasimpossible,maisoubienlent,oubiencompliquéàmettreenœuvre).Mettre
enœuvre cet algorithme sur une liste est mieux adapté.
On choisit de scinder les éléments de la liste suivant la parité de leur indice :
let
recscission =function
|
[]−
>
[], []
|
[a]−
>
[a], []
|
a::b::q−
>
let
(l1, l2) = scission q
in
a::l1, b::l2
;;
let
rec
fusion = fun
|
[] l2−
> l2
|
l1 []−
> l1
|
(t1::q1) l2 when t1 < hd l2−
> t1::(fusion q1 l2)
|
l1 (t2::q2)−
> t2::(fusion l1 q2) ;;
let
recmerge_sort = function
|
[]−>
[]
|
[a]−>
[a]
|
l−
>
let(l1, l2) = scission l
in
fusion (merge_sort l1) (merge_sort l2) ;;
d2
d1
m
δ
Diviser pour régner 8.5
.
2
00 0 0
ous pouvons en coût linéaire déterminer les points P = (p i,..., p j) de cette bande verticale en les
N
0 0
rdonnant parordonnéecroissanteàl’aidedutableau P (ilsuffitdeparcourirunefoisP ennegardantque
o
les pointsdont les abscisses sont comprises entrem− δ etm+ δ).
Pour conclure, il reste à observer (c’est le point crucial) que dans chaque tranche de hauteurδdecette bande
nepeuvent se trouver qu’au plussept points :
δ
m
δ
n effet, s’il en existait huit, il y en aurait deux au moins appartenant tout deux àP1ou tous deux àP2 et à
E
unedistance strictement inférieure à δ.
Cette remarque permet de restreindre la recherche de la distance minimale entre deux points deP00ense
restreignant aux points distants au plus de sept cases de ce tableau, ce qui conduit à un coût linéaire.En
0
définitive, le coût de cet algorithme (sans compter le pré-traitement des tableauxPetP ) vérifie unerelation
de récurrence de la forme :cn=cbn /2c+cdn/2e+Θ(n), ce qui prouve quecn = Θ(nlogn) .
(a
kétant stocké dans la case d’indicek) , de sortede pouvoir accéder à chaque coefficient avec un coût
constant.
n k
X
k=0
akX
k n (ak+bk )X montre degrénnécessite
La formule +X k=0
que l’addition de
k n
bkX
= X
k
=
0 deux polynômes de
http://info-llg.fr
8.6 option informatique
roduit, la n
p n n ontre l’aide de
m
X i=0
n
X j=0 X i=0 X j=
0
i j
formule aiX
bjX
qu’il peut
être
Quant au i+
j
× = aib
jX
réalisé à
2 2
n additions et (n+ 1) multiplications (donc un coûtquadratique).
let
prod p q =
let
n = vect_length p− 1
in
let
r = make_vect (2 * n + 1) 0 in
for
i = 0ton do
for
j = 0
to ndo
r.(i+j) <
r.(i+j) + p.(i) * q.(j)
−
done
;
done
;
r ;;
n convient généralement qu’une addition est beaucoup rapide à effectuer qu’un produit ; nous allons donc
O
chercher à réduire le nombre de multiplications, quitte à faire plus d’additions. (Il faut cependant savoir que
ceci était surtout vrai dans les temps anciens de l’informatique ; c’est beaucoup moins vrai aujourd’hui.)Pour
ln m
appliquer le paradigme « diviser pour régner », nous allons poserm= 2 puisP=XmP
m
1+P2etQ=X Q1 +
jn k
Q2 , le degré de chacun des quatre polynômes P1, P2, Q1et Q2étant inférieur ou égal à 2 . Ainsi, PQ =
2m m
X P1Q + X (P1Q2 + P2Q1 ) + P2Q2 .
1
uisqu’on accède aux coefficients de chaque polynôme avec un coût constant, il n’y a pas de coût de
P
décomposi tion. 4 appels récursifs sont nécessaires, et la recomposition nécessite 3 additions de coût
linéaire. Le nombrede multiplications vérifie doncla relation :
2
e théorème maître nous permet dès lors d’affirmer quecn =Θ( n ), ce qui n’est pas meilleur que l’algorithme
L
naïf. Nous n’avons donc pour l’instant rien gagné à mettre en œuvre le paradigme « diviser pour régner ».
2m
m
PQ = X R1+ X (R2− R1− R3) + avec R1= P1Q
1, R2
= (P1+ P2) (Q1+ Q2) ,R3 =
R3 P2 Q
2,
et il n’est plus nécessaire que d’utiliser 3 appels récursifs. La relation de récurrence prend cette fois la forme
log 3
qui conduit àcn = Θ(n ) (avec log 3 ≈ 1,585).
Cette méthode porte le nom d’algorithme de Karatsuba ; elle a été publiée pour la première fois en 1962.
Pour faciliter la mise en œuvre, on suppose que les polynômes sont stockés dans des tableaux de taille
k k
(quitte à rajouter des 0), donc de degré inférieurs ou égauxà2 −1
2 .Lafonctionquisuitdevradoncêtre
précédéed’une fonction«normalisant»lespolynômes,etsuivied’unefonctionsimplifiantlerésultat(c’està
dire enlevant leszéros redondants).
Diviser pour régner 8.7
let rec
prod p q =
match
(vect_length p) with
| 1−
>
[| p.(0)*q.(0) ; 0 |]
| n−
>
let
m = n / 2 in
let
p1 = sub_vect p m m and
p2 = sub_vect p 0 m
in
let
q1 = sub_vect q m m and
q2 = sub_vect q 0 m
in
let
r1 = prod p1 q1 and
r2 = prod (som p1 p2) (somq1 q2)
and
r3 = prod p2 q2 in
let
s = make_vect (2*n) 0 in
for
i = 0 to n−
1
do
s.(n+i) <
−s.(n+i) + r1.(i) ;
s.(m+i) <
s.(m+i) + r2.(i)−
− r1.(i)−
r3.(i) ;
s.(i) <
s.(i) + r3.(i)
−
done
;
s ;;
r eprésenterons par des vecteurs à n composantes. La similitude qui existe avec les polynômes va nous
permettred’adapterlesalgorithmesprécédentsauxentiers,laseuledifférenceconsistantdanslagestionde
la propagationde la retenue.
n−
1 Xn − 1 de longueurn+ 1 défini
X i=0 xi2
i
Six= ety= i=0
par les
i
yi2
, alorss=x+yva être
représenté par un vecteur
L’algorithme naïf du produit correspond au
relations :
développement :xy=i= 0
–r0= 0 ; (x2 i
)y , qui se ramène ànadditions
i
– ∀i∈ ~0,n− 1,si= (ri+xi+yi) mod 2 ;
– ∀i∈ ~0,n− 1,ri+1= (ri+xi+yi)/2
;
–sn=rn.
n−
1
X
’entiers de longueur 2n, puisqu’une multiplicationpar 2 s’obtient en représentation binaire par simple
d
2
décalage. Ceci donne un coût en Θ(n ).
m m
L’algorithmedemultiplicationrapidevaconsisteràposer x = a2
+ b et y =c2
+davecm=dn
/2epuisà
2m
m
calculerleproduit xy parlaformule: xy = ac2 + (a
+ b)(c + d) −ac−bd2 +bd,cequiconduitaucalcul
log 3
detrois produits d’entiers de longueurm. Comme précédemment,le coût va être un Θn .
http://info-llg.f
r
t nécessiteapriori8produitset4additionssurdesmatrices m×m.Utilisercesformulesconduitdoncà
e
2 log8 3
une relation de la forme : cn =8c dn /2e + Θ( n ),cequiconduitàuncoûten Θ( n )= Θ( n ).Onnegagne
donc rienpar rapport à l’algorithme naïf.
L’algorithme de Strassen utilise les formules suivantes (qu’on laissera le soin au lecteur de vérifier) :
M4= (A1+ B1) D2 X = M1+ M2− M4+ M6Y
M1 = (B1− D1) (C2+ D2) M = A (B − D ) M = = M + M
5 1 2 2 6 4 5
M2 = (A1+ D1) (A2+ D2) D 1( C2− A2) M7= (C1+ Z
= M6+ M7
M3 = (A1− C1) (A2+ B2) D )A T = M2− M3+ M5− M7
1 2
n’utilisent plus que 7 produits, ce qui
X YZ T donne
et dans ce cas,MN= !
. On peut observer que ces formules
log 7
un coût en Θ(n ) (avec log 7 ≈ 2,8
07), meilleur(en théorie en tout cas) que l’algorithme
naïf.4. Exercices
✄
Exercice 1Utiliser le principe de la recherche dichotomiquepour rédiger une fonction Caml calculant la
✂ ✁
√
racine carrée entière d’un entiern∈ N, à savoirb nc , avec un coût logarithmique.
✄
Exercice 2Dans cet exercice, on considère un tableaud’entiers bi-dimensionnelbtel que chaque ligneet
✂ ✁
chaque colonne soit rangée par ordre croissant. Voici un exemple d’un tel tableau, à 4 lignes et 5 colonnes :
14 25 30 69
2
3 15 28 30 81
7 15 32 43 100
20 28 36 58 101
✄
k
Exercice 3On considère un échiquier carré de côtén= 2 , que l’on souhaite paver avec les quatre motifs
✂ ✁
ci-dessous :
achant que 4k≡1 (mod3), ce n’est bien évidemmentpas possible, mais nous allons montrer que si on
S
isoleune case de coordonnées (x,y) choisie arbitrairement,le reste de l’échiquier peut alors être recouvert :
Diviser pour régner 8.9
ontrer en raisonnant par récurrence surkqu’un telrecouvrement est toujours possible, en décrivant un
M
algorithme « diviser pour régner » résolvant ce problème.
✄
Exercice 4Étant donnée une suite finie d’entiersx= (x1 , ..., xn) , on appelleinversiondextout couple(i, j) tel
✂ ✁
quei < jetxi> xj. Par exemple, (2,3
,1
,5,4) possède3 inversions : les couples (1,3
), (2,3
), (4,5
). On
s’intéresse au calcul du nombre d’inversions dex.
2
)Rédiger en Caml l’algorithme naïf, et montrer queson coût est unΘ( n ). On représentera les suitesfinies
a
d’entiers par le typeint vect.
b)Adopter une méthode « diviser pour régner » pourfaire mieux (indication : adapter l’algorithme de tri
fusion).
✄
Exercice 5 Une matrice de Tœplitz est une matrice (ai,j) ∈ Mn( K) telle queai,j=ai−1,j−1pour 2 6i, j6n.
✂
✁
a)Trouver un moyen d’additionner deux matrices deTœplitz en Θ(n).
b)Appliquer une méthode « diviser pour régner » pourcalculer le produit d’une matrice de Tœplitzn×npar
k
n vecteur de longueurn(en supposant pour simplifierquen= 2 ).
u
Quel est la complexité de votre algorithme ?
✄
Exercice 6On pourrait imaginer remplacer, dans l’algorithmed’exponentiation rapide, la base 2 par la base
✂ ✁
3 et exploiter les relations 3 k
( x ) sin= 3k;
3 k 2 3 k
x(x ) sin= 3k+ 1 ;x (x ) sin=
n 3k+ 2.
suivantes :x =
Déterminer le coût d’un tel algorithme, et le comparer au coût de l’algorithme binaire.
http://info-llg.fr