MI2E - 2EANNÉE
ALGORITHMIQUE GÉNÉRALE
V. Mousseau
ALGORITHMIQUE GÉNÉRALE
Partiel - 23/11/2005 - 2 heures
aucun document autorisé
carte étudiant : ................................
Exercice 1 : La décomposition en facteurs premiers d’un nombre entier strictement positif consiste à
représenter cet entier de la manière suivante : n=ab1
1ab2
2...abk
koù les aisont des nombres premiers tels
que ai< ajpour i < j et les bjsont des entiers strictement positifs. Par exemple, 84 = 22×31×71.
La décomposition en facteurs premiers d’un entier est unique.
a) Un entier npeut donc être représenté par tableau à double entrée Tstockant les aiet les bi:
T[i, 1] contenant aiet T[i, 2] contenant bi. Par exemple 84 est représenté par ,
237
211
Donnez la représentation des entiers 72 et 270.
72 = 2 3
3 2 et 270 = 235
131
Soient T1et T2les tableaux représentant deux entiers n1et n2. On note T aille1et T aille2les tailles
des tableaux T1et T2. Soit la fonction PGCD suivante :
fonction PGCD(T1,T2: tableau) entier
pgcd,p1,p2: entier
[1] pgcd 1
[2] p11
[3] p21
[4] tant que (p1T aille1) et (p2T aille2) faire
[5] si T1[p1,1] = T2[p2,1]
[6] alors mmin(T1[p1,2], T2[p2,2])
[7] pgcd pgcd ×T1[p1,1]m
[8] p1p1+ 1
[9] p2p2+ 1
[10] sinon
[11] si T1[p1,1] < T2[p2,1]
[12] alors p1p1+ 1
[13] sinon p2p2+ 1
[14] fin si
[15] fin si
[16] fin tant que
[17] retourner(pgcd)
b) Faire tourner à la main la fonction PGCD pour les entiers 72 et 84. On prendra soin de noter
les valeurs successives des variables pgcd,p1,p2ainsi que la valeur du test de la boucle tant que.
72 = 2 3
3 2 avec T aille1= 3 et 84 = 2 3 7
2 1 1 avec T aille2= 3
Instruction p1p2p1T aille1p2T aille2test bouble tant que m pgcd
1,2,3 1 1 vrai vrai vrai 1
4 1 1 vrai vrai vrai 1
6 1 1 vrai vrai vrai 2 1
7 1 1 vrai vrai vrai 2 4
8,9 2 2 vrai vrai vrai 2 4
4 2 2 vrai vrai vrai 2 4
6 2 2 vrai vrai vrai 1 4
7 2 2 vrai vrai vrai 1 12
8,9 3 3 f aux f aux vrai 1 12
4 3 3 f aux f aux vrai 1 12
17 3 3 f aux f aux vrai 112
c) Prouver que la fonction PGCD se termine en un temps fini.
L’algorithme se termine dès lors que la boucle tant que s’exécute en un temps fini. Or, le test de
cette boucle (p1T aille1) et (p2T aille2) devient faux dès lors que (p1> T aille1) ou que
(p2> T aille2). De plus, lors de chaque itération, au moins une des deux variables p1ou p2
est incrémentée d’une unité. Comme ces deux variables sont initialisées à 1, et que T aille1et
T aille2ont une valeur finie, l’algorithme s’exécutera en un nombre fini d’itérations. Le bloc
d’instruction contenu dans la boucle s’exécutant en un temps fini, l’algorithme se terminera
en un temps fini.
d) Déterminer la complexité de la fonction PGCD
.
Supposons que l’on dispose d’un algorithme Puissance(n1, n2: entiers)nn2
1qui
s’exécute en O(1). Alors la structure conditionnelle <si T1[p1,1] = T2[p2,1]>s’effectue en
O(1) (puisque le test booléen et les 2 blocs d’instructions apparaissant dans la structure condi-
tionnelle sont en O(1)). Donc le corps de la boucle tant que s’exécute en O(1).
Le calcul de la complexité revient à déterminer le nombre d’itérations de la boucle tant que. or
dans le pire cas, lors de chaque itération, seule une des deux variables p1ou p2est incrémentée
d’une unité et on exécute alors T aille1+T aille2itérations. L’algorithme PGCD est alors en
O(T aille1+T aille2)
Exercice 2 : On considère deux matrices carrées (d’entiers) d’ordre n,Aet B. Le produit de Apar
Best une matrice carrée Cd’ordre nfinie par ci,j =Pn
k=1 ai,kbk,j .
Donner un algorithme PROD(A,B) calculant le produit de deux matrices représentées sous forme
d’un tableau à deux dimensions. Calculer la complexité de cet algorithme. Doit-on préciser dans quels
cas (pire cas, meilleur des cas, cas moyen) cette complexité est obtenue?
2
PROD(A,B)
pour i= 1 ànfaire
pour j= 1 ànf aire
C[i,j] 0;
pour k= 1 ànfaire
C[i,j] C[i,j] + A[i,k]*B[k,j]
fin pour
fin pour
fin pour
retourner(C)
Chacune des affectations de l’algorithme est en O(1), la complexité correspond donc au nombre
de fois que l’instruction <C[i,j] C[i,j] + A[i,k]*B[k,j]>est exécutée. Elle est exécutée n3fois
et ceci dans le pire ET dans le meilleur cas. La complexité est donc en Θ(n3)
Exercice 3 : On considère un type de données abstrait pour manipuler les polynômes. Cet exercice
propose d’implémenter certaines opérations de base concernant les polynômes à coefficients entiers
sur une variable. Soit El’ensemble des polynômes à coefficients entiers sur une variable entière x. On
considère les trois opérations sur E:
la dérivation : p(x)Ep(x)
l’addition : p(x), q(x)Ep(x) + q(x)
l’évaluation : p(x)E, a Zp(a)
On notera ces opérations Dériv(p), Somme(p, q) et Eval(p, a). Pour les implémenter, on choisit de
représenter un polynôme de Epar une liste chaînée p=(M1, ..., Mk)de monômes, ordonnée par
degré croissant, où chaque monôme Mj= (aj, dj)est caractérisé par son degré djNet son coeffi-
cient ajZ. Le polynôme associé à la liste pest alors p(x) = Pk
i=1 aixdi. Le polynôme nul, noté
polynul, est représenté par M0= (0,0).
x On utilise alors la structure suivante :
lien=cell
cell=Enreg.
deg,coef :entier
suiv :lien
FinEnreg.
Ainsi 3x2+ 4x+ 7 est représenté par p
p
• • •
071 4 2 3
a) Écrire un algorithme implémentant Dériv.
3
Dériv(p :lien)lien
p1p.suiv
Desallouer(p)
Tant que p1.suiv 6=Null Faire
p1.coef p1.coef *p1.deg
p1.deg p1.deg-1
p1p1.suiv
Fin Tant que
Retourner(p1)
4
b) Écrire un algorithme récursif implémentant Somme. Quelle est sa complexité au pire-cas ?
Somme(p1,p2 :lien)lien
c) Soit aZet nN. On suppose que le nombre d’opérations pour calculer anest en Θ(n). Soit
pE. Quelle est la complexité de l’algorithme naïf d’évaluation de pen a, qui évalue d’abord
chacun des monômes de pen aet fait la somme des valeurs trouvées?
[1] eval 0
[2] Tant que (p 6=Null)
[3] puisxp.deg
[4] eval puis *p.coef
[5] Répéter
[6] Fin Tant que
[7] Retourner(eval)
d) Soit p(x) = Pn
i=1 aixiun polynôme de Ede degré nécrit sous sa forme conventionnelle
chaque coefcient ajest négatif, nul ou positif. On considère la suite H0, ..., Hnde polynômes
associés à p:H0(x) = an, H1(x) = H0(x)×x+anl, ..., Hn(x) = Hn1(x)×x+a0
La suite (H0, ..., Hn)est la liste des polynômes du schéma de Horner et l’on a formellement
p(x) = Hn(x). Déduire du schéma de Horner un algorithme efficace, utilisant une liste double-
ment chaînée dont vous donnerez la définition, pour évaluer pen x. Quelle est la complexité de
cet algorithme ?
Exercice 4 : On considère les déclarations et l’algorithme suivants :
pt-entier=entier
lien=cell
cell=Enreg.
ele :entier
suiv :lien
FinEnreg.
L1,L2 :lien
p:pt-entier
[1] Allouer(p)
[2] p↑←10
[3] Allouer(L1), L1.ele1
[4] L2L1, L2.suivNull
[5] Répéter
[6] Allouer(L2)
[7] L2.suivL1
[8] L2.eleL1.ele*2
[9] L1L2
[10] Jusqu’à L1.ele>p
la mémoire après l’exécution de l’instruction [2]
p
L1 L2
10
la mémoire après l’exécution de l’instruction [4]
la mémoire à la fin de l’itération 1
5
1 / 6 100%