Complexité - Corrigé TD1 - 2 (4 Novembre 2021)
Complexité - Corrigé TD1 - 2 (4 Novembre 2021)
Complexité - Corrigé TD1 - 2 (4 Novembre 2021)
1- Écrire les six algorithmes décrits ci-dessous pour déterminer si un nombre entier est premier ou
composé.
Algorithme A1 : Sachant qu’un nombre premier n est un nombre entier qui n’est divisible que par
1 et par lui-même. L’algorithme A1 va donc consister en une boucle dans laquelle on va tester si le
nombre n est divisible par 2, 3, ..., n-1.
Algorithme A1 ;
début
premier = vrai ;
i=2;
tant que (i <= n-1) et premier faire
si (n mod i = 0) alors
premier = faux
sinon
i = i+1 ;
fin.
Le pire cas qui nécessite le plus long temps, correspond au cas où n est premier car c’est
dans ce cas que la boucle s’exécute avec un nombre maximum d’itérations. Dans ce cas ce
nombre est égal à n-2.
La complexité est donc en O(n).
Algorithme A2 : Sachant que si n est divisible par 2, il est aussi divisible par n/2 et s’il est
divisible par 3, il est aussi divisible par n/3. De manière générale, si n est divisible par i pour i = 1
... [n/2] où [n/2] dénote la partie entière de n/2, il est aussi divisible par n/i. Selon cet énoncé,
proposer une optimisation de l’algorithme A1.
Algorithme A3 : Si n est divisible par x, il est aussi divisible par n/x. Il serait intéressant
d’améliorer A2 en ne répétant le test de la divisibilité que jusqu’à x = n/x.
Algorithme A3 ;
début
premier = vrai ;
i=2;
tant que i <= 𝑛 et premier faire
si (n mod i = 0) alors
premier = faux
sinon
i = i+1 ;
fin.
Algorithme A4 : Dans le cas où n est impair, il ne faut tester la divisibilité de n que par les
nombres impairs. Proposez l’algorithme correspondant.
Algorithme A4 ;
début
premier = vrai ;
si (n <> 2) et (n mod 2 = 0)
alors premier = faux
sinon si ( n <> 2) alors
début
i=3 ;
Le pire cas correspond au cas où n est premier et dans ce cas le nombre maximum
d’itérations de la boucle est égal à [n/2] -2, la complexité est en O(n).
Algorithme A5;
début
premier = vrai ;
si (n <> 2) et (n mod 2 = 0) alors
premier = faux
sinon si ( n <> 2) alors
début
i=3 ;
tant que (i <= [n/2]) et premier faire
si (n mod i = 0) alors premier = faux sinon i = i+2 ;
fin
fin.
Le nombre d’itérations de la boucle pour un nombre premier est égal à la moitié du nombre
d’itérations de A3, il est égal à [n/4] – 1. La complexité est donc en O(n).
Algorithme A6 ;
début
premier = vrai ;
si (n <> 2) et (n mod 2 = 0) alors premier = faux
sinon si ( n <> 2) alors
début
i=3 ;
tant que (i <= 𝑛) et premier faire
si (n mod i = 0) alors premier = faux sinon i = i+2 ;
fin
fin.
A3 [ 𝑛 ] -1 O( 𝑛) 8337
A6 ([ 𝑛 ]/2 – 1) O( 𝑛) 4168
Exercice N°2:
1- Calculer les ordres de grandeur suivants en secondes : 1 heure, 1 jour, 1 semaine, 1 mois, 1
année, 1 siècle, 1 millénaire.
● 1min = 60 s
● 1 heure = 3600s = 3.6 * 103s
● 1 jour = 86400s = 8.64* 104s
● 1 semaine = 604800s ≈ 6.05* 105s
● 1 mois= 2 592 000s ≈ 2.59 *106s
● 1 année =31 536 000 ≈ 3.15 *107s
● 1 siècle =3 153 600 000≈3.15* 109s
● 1 millénaire = 31 536 000 000 ≈ 3.15* 1010s
2- Considérer 7 algorithmes A0, A1, ..., A6 conçus pour résoudre un même problème de taille n.
La complexité en temps de chacun de ces algorithmes est exprimée dans la table ci-dessous.
A4 2
O(𝑛 ) 102s = 104=2 h 46 106=11 jrs 13 0.1s 10s 16mn40s
1min 40s min 40 s h 46 m 40 s
A5 3
O(𝑛 ) 103s = 106 =11 jrs 109=31ans 1s 16mn40s 11j13h 46min
16min 13 h 46 m 8mois 40s
40s 40 s 19jrs 1 h 46
min 40 s
A6 4
O(𝑛 ) 10 000s = 100 000 1012s ≃ 31 10s 1j 3h 46min 31ans 8mois
2h 46min 000s = millénaires 40s 19jrs 1h 46min
40s 38mois 17 40s
jours 9h
46min 40s
A7 𝑛
O(2 ) 1 024s = 1.267*1030s 1.07*10301 ≃ 1.02s 3.2*1016mill 3.2*10286millé
17min 4s ≃ 4*1019 3*10290 énaires naires
millénaires millénaires
En supposant qu’une unité de taille s’exécute en 1 seconde, calculer le temps nécessaire pour
traiter des tailles respectivement égales à 10, 100 et 1000.
3- Répéter la question 2 avec une unité de temps égale à une milliseconde puis à une
microseconde.
Nous concluons que l’augmentation de la performance de la machine de calcul apporte les effets
suivants :
Exercice N°3:
Considérer le théorème suivant sur le PGCD (le Plus Grand Commun Diviseur) :
PGCD(a,b) = PGCD(b, a mod b)
1- Utiliser ce théorème pour écrire un algorithme de calcul itératif du PGCD de deux entiers a et
b.
Si a est supérieur à b, la séquence reste, b et a fait partie de la suite de Fibonacci, car les deux
dernières itérations correspondent respectivement à reste=1 et à reste=0, qui coïncident avec
l’initialisation de la suite de Fibonacci. En résumé le cas le plus défavorable correspond au calcul
du pgcd de deux nombres consécutifs de la suite de Fibonacci:
Fn-1 et Fn-2 où Fn = Fn-1 + Fn-2 ; F1 = 1 et F0 = 0.
Sachant que :
Fn = Fn-1 + Fn-2 et Fn-1 = Fn-2 + Fn-3 ⇒ Fn = 2*Fn-2 + Fn-3 ⇒ Fn ≥ 2* Fn-2
De la même manière:
F n > 2*F n-2 > 2*2*F n-4 > ...> 2 k
La complexité de la fonction pgcd est la même que celle calculée pour la 2ème question.
c’est-à-dire en O(ln a) avec a > b.
4- Écrire un algorithme pour calculer le PPCM (Plus Petit Commun Multiple) de deux nombres a
et b et calculer sa complexité.
|𝑎*𝑏|
𝑃𝑃𝐶𝑀(𝑎, 𝑏)=
𝑃𝐺𝐶𝐷(𝑎,𝑏)