Vous êtes sur la page 1sur 4

Épreuve d’informatique №2

Durée : 1h 30'
Mme. S. Darragi et M. A. Ammar - IPEST : (PCSI/MPSI) 12 février 2022

L’usage des calculatrices est interdit.


— L’épreuve comporte 4 pages.
— La présentation, la lisibilité, la qualité de la rédaction et la précision des raisonnements
entreront pour une part importante dans l’appréciation des copies.
— Les algorithmes doivent être commentés.

Exercice 1 : Étude d’algorithmes

Soient les fonctions suivantes :

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.

Exercice 3 : Algorithme de tri

On se donne la fonction tri suivante, écrite en Python :

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 :

>>> L = [['Bresil', 76], ['Kenya', 26017], ['Ouganda', 8431]]


>>> tri_chaine(L)
>>> L
[['Bresil', 76], ['Ouganda', 8431], ['Kenya', 26017]]

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

Un robot rend visite à n points Pi (0 ≤ i < n) de coordonnées (ai , bi ) (ai ∈ N, bi ∈ N, n ≥ 0).


Le robot ne fait que des déplacements parallèles à l’axe des abscisses ou à l’axe des ordonnées. Ses
déplacements sont toujours de longueur minimale entre deux points. Toutefois le robot n’est pas très
fiable. On veut délimiter l’espace minimal nécessaire pour ses déplacements en tendant une ficelle
autour du périmètre strictement nécessaire pour les déplacements du robot. L’intérieur Manhattan
des n points est l’ensemble des points de coordonnées (x, y) vérifiant les quatre conditions suivantes :
• ∃i : 0 ≤ i < n et ai ≤ x et bi ≤ y ( sud - ouest )
• ∃i : 0 ≤ i < n et ai ≥ x et bi ≤ y ( sud - est )
• ∃i : 0 ≤ i < n et ai ≥ x et bi ≥ y ( nord - est )
• ∃i : 0 ≤ i < n et ai ≤ x et bi ≥ y ( nord - ouest )
L’enveloppe Manhattan est un polygone dont l’intérieur est l’intérieur Manhattan de ces n points.
Par exemple sur les 20 points de la figure suivante, c’est le polygone suivant :

On se propose de calculer les points définissant l’enveloppe Manhattan.


Q1. Écrire la fonction sudouest qui retourne True si et seulement si le point de coordonnées
(x1 , y1 ) est au sud-ouest du point de coordonnée (x2 , y2 ) c’est-à-dire x1 ≤ x2 et y1 ≤ y2 . sinon
False.
Écrire de même les fonctions nordouest, sudest et nordest.
Nous décomposons le calcul de l’enveloppe en quatre fonctions : la première calcule les points
définissant la partie sud-ouest de l’enveloppe, la deuxième calcule les points définissant la
partie nord-ouest, la troisième et quatrième font de même sur les parties sud-est et nord-est.
On suppose les coordonnées des n points rangés dans deux listes a et b d’entiers contenant l’abscisse
ai et l’ordonnée bi du point Pi pour tout i (0 ≤ i < n). En outre, on suppose les points rangés par
ordre d’abscisses croissantes, c’est-à-dire ai ≤ a j pour (0 ≤ i < j < n).
Q2. Écrire une fonction echange prenant comme arguments les listes a et b, les indices i et j
et qui échange, dans chacun des listes a et b, les valeurs contenues aux indices i et j.

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.

Exercice 5 : Triangle de Sierpinski

Q1. En utilisant la commande plt.fill(X, Y, options),


écrire une fonction polygon(A, B, C) qui trace le triangle plein dont les sommets A, B et
C ont pour coordonnées (xa , ya ), (xb , yb ), (xc , yc ).
Q2. Définir une fonction récursive sierpinski permettant le tracé présenté figure 1 (tous les
triangles sont équilatéraux).

Figure 1 – Le résultat des fonctions sierpinski(n) pour n = 1, 2, 3.

Page 4

Vous aimerez peut-être aussi