Académique Documents
Professionnel Documents
Culture Documents
Durée : 1h 30'
Mme. S. Darragi et M. A. Ammar - IPEST : (PCSI/MPSI) 12 février 2022
1 # Algorithme 1
2 def toto(n):
3 f=1
4 for i in range(1,n+1):
5 f*=i
6 return f
1 # Algorithme 2
2 def titi(n):
3 s=0
4 for i in range(1,n+1):
5 s+=toto(i)
6 return s
1 # Algorithme 3
2 def tata(n):
3 s=0
4 for i in range(1,n+1):
5 s+=titi(i)
6 return (s)
Q1. Décrire ce que fait chacune des fonctions toto, titi et tata. Déterminer leurs coûts et
classes de complexité.
Q2. Peut-on donner une version linéaire de la fonction tata, si oui proposer la ?
Page 1
Exercice 2 : Multiplication égyptienne
Écrire une fonction qui calcule le produit de deux entiers en n’utilisant que des additions, des multi-
plications et des divisions par 2 (cette méthode s’appelle le produit du paysan russe ou multiplication
égyptienne).
Principe.
Pour calculer le produit de x par y, on regarde si y est pair en multiplie x par deux et on divise y
par 2, si y est impair on ajoute x au résultat initialement nul et on retranche 1 de y qui devient
alors pair, on itère ce processus jusqu’à ce que y devient nul.
1 def tri(L):
2 n = len(L)
3 for i in range(1, n):
4 j = i
5 x = L[i]
6 while 0 < j and x < L[j-1]:
7 L[j] = L[j-1]
8 j = j-1
9 L[j] = x
Q1. Lors de l’appel tri(L) lorsque L est la liste [5, 2, 3, 1, 4], donner le contenu de la
liste L à la fin de chaque itération de la boucle for.
Q2. Soit L une liste non vide d’entiers ou de flottants. Montrer que “la liste L[0:i+1] (avec la
convention Python) est triée par ordre croissant à l’issue de l’itération i ”est un invariant de
boucle. En déduire que tri(L) trie la liste L.
Q3. Évaluer la complexité dans le meilleur et dans le pire des cas de l’appel tri(L) en fonction
du nombre n d’éléments de L. Citer un algorithme de tri plus efficace dans le pire des cas.
On souhaite, partant d’une liste constituée de couples (chaîne, entier), trier la liste par ordre croissant
de l’entier associé suivant le fonctionnement suivant :
Q4. Écrire en Python une fonction tri_chaine (version modifiée de la fonction tri) réalisant
cette opération.
Page 2
Exercice 4 : L’enclot du robot
Page 3
Les points définissant la partie sud-ouest de l’enveloppe sont les points Pi tels que a j ≤ ai et b j ≤ bi
implique a j = ai et b j = bi pour tout j (0 ≤ j < n ).
Q3. Dans l’exemple précédent, donner parmi les 20 points Pi , les points définissant la partie
sud-ouest de l’enveloppe.
Q4. Écrire une fonction frontiereSO prenant en argument les listes a et b et retournant le
nombre k de points définissant la partie sud-ouest de l’enveloppe Manhattan des n points
de coordonnées ai et bi . On modifiera les listes a et b pour qu’ils contiennent dans leur k
premières places les coordonnées des points définissant la partie sud-ouest de l’enveloppe,
rangés en ordre d’abscisses croissantes.
Après avoir exécuté la fonction précédente, on suppose qu’une fonction a rangé dans deux tableaux
aSO, bSO les coordonnées des points précédemment trouvés, qui définissent la partie sud-ouest. Une
variable globale nSO a pour valeur le nombre de ces points.
Les points définissant la partie nord-ouest de l’enveloppe sont les points Pi tels que a j ≤ ai et b j ≥ bi
implique a j = ai et b j = bi pour tout j (0 ≤ j < n )
Q5. Donner les points définissant la partie nord-ouest de l’enveloppe sur l’exemple. Modifier
la fonction précédente pour obtenir la fonction frontiereNO correspondante pour la partie
nord-ouest de l’enveloppe.
Q6. Écrire également les fonctions frontiereSE et frontiereNE correspondant aux parties
sud-est et nord-est.
Page 4