Info Exercices 4 Algorithmique Création et utilisation de fonctions sous Python. 4 Algorithmique.......................................................................... 1 1 Complexité........................................................................ 2 2 Algorithmes de tri.................................................................. 4 3 Indications........................................................................ 6
Les difficultés sont échelonnées de la manière suivante : aucune,,, et. Certains énoncés sont tirés des annales des concours (oral et écrit) ; leur provenance est le plus souvent précisée. Les exercices notés et sont particulièrement délicats. 1. Complexité 1. [ L algorithme d Hörner ] ( ind ) Soient P un polynôme à coefficients réels et a R. On écrit P(X) = p 0 + p 1 X + + p n X n Le polynôme P sera représenté par le tableau [p0,...,pn] contenant ses coefficients. On cherche un algorithme de calcul efficace de P(a). a) Algorithme naïf d évaluation. i) Écrire sous forme d un pseudo-code un algorithme de calcul de P(a). ii) Trouver un invariant de boucle et prouver la correction de cet algorithme. iii) En déduire une fonction evaluationnaive(t,a) calculant P(a). iv) Sachant que le calcul de a k a un coût de l ordre de ln(k), quel est la complexité de cet algorithme? b) Hörner a proposé la méthode suivante : P(α) = p 0 + α (p 1 + α (p 2 + α (p 3 + α ( ) ))) Par exemple, pour calculer P(2) lorsque P = p 3 X 3 + p 2 X 2 + p 1 X + p 0, on calcule successivement : p 3, p 2 + 2p 3, p 1 + 2(p 2 + 2p 3 ) = p 1 + 2p 2 + 2 2 p 3, p 0 + 2 ( p 1 + 2p 2 + 2 2 p 3 ) = p0 + p 1 2 + p 2 2 2 + p 3 2 3 = P(2) i) Écrire cet algorithme sous la forme d un pseudo-code. ii) Trouver un invariant de boucle et prouver la correction de cet algorithme. iii) Écrire une procédure evaluationhorner(t,a) d arguments t et a un nombre réel et renvoyant la valeur P(a) par la méthode d Hörner. iv) Quelle est la complexité de cette fonction? v) Vérifier sur machine l efficacité de evaluationhorner par rapport à evaluationnaive. 2. [ Algorithmes de division euclidienne dans N ] ( ind ) On se propose d exposer, prouver puis comparer deux algorithmes de division euclidienne dans N. a) Algorithme naïf. i) Donner un algorithme naïf de division euclidienne reposant sur des soustractions successives. Prouver la terminaison et la correction de cet algorithme en déterminant un invariant de boucle. ii) Écrire une fonction divisioneuclidienne(a,b) renvoyant le couple (q, r ) en suivant l algorithme naïf. iii) Quelle est la complexité de cet algorithme? b) Algorithme binaire. On propose l amélioration suivante : LLG PCSI 2 Info Exercices 4 2
Algorithme 1 : Algorithme binaire de division euclidienne Données : Deux entiers naturels a et b tels que b 0; Résultat : Le couple quotient-reste de la division euclidienne de a par b; Initialisation : q 0, w b, r a; tant que w r faire w 2 w; fin tant que w b faire q 2 q; w quotient de w par 2; si w r alors r r-w; q q+1; fin fin Renvoyer (q,r); i) Prouver la terminaison de cet algorithme. ii) Établir que la propriété suivante est un invariant de la seconde boucle : En déduire la correction de l algorithme. { qw + r = a 0 r < w iii) Écrire une fonction divisioneuclidiennebinaire(a,b) renvoyant le couple (q, r ) en suivant cet algorithme. iv) Quelle est la complexité de cet algorithme? 3. [ Deux algorithmes d exponentiation ] ( ind ) On expose dans cet exercice deux algorithmes classiques de calcul de a n où a et n sont deux entiers naturels non nuls. a) Algorithme naïf. i) Écrire un algorithme itératif renvoyant a n. Prouver la terminaison puis la correction de cet algorithme. ii) Quelle est la complexité de cet algorithme? iii) Écrire une fonction e(a,n) renvoyant a n par cet algorithme. b) Algorithme d exponentiation rapide. On considère l algorithme suivant : Algorithme 2 : Exponentiation rapide Données : Deux entiers a et n de N ; Résultat : a n ; Initialisation : R 1, A a, N n; tant que N > 0 faire si N est impair alors R R A; A A A; N quotient dans la division euclidienne de N par 2; Renvoyer R i) Montrer la terminaison de l algorithme. ii) Montrer que a n = RA N est un invariant de boucle. LLG PCSI 2 Info Exercices 4 3
iii) En déduire la correction de cet algorithme. iv) Calculer la complexité de cet algorithme. v) Écrire une fonction er(a,n) renvoyant a n par cet algorithme. 4. [ Algorithme d Euclide du calcul du PGCD, application au PPCM ] ( ind ) a) Terminaison et correction de l algorithme d Euclide. i) Rappeler l algorithme d Euclide du calcul du PGCD deux entiers naturels a et b vérifiant la condition (a, b) (0, 0). On donnera un pseudo-code. La terminaison et la correction de cet algorithme ont été prouvées dans le cours d arithmétique. ii) Écrire une fonction pgcd(a,b) renvoyant le PGCD de deux entiers naturels a et b selon l algorithme d Euclide. iii) Écrire une fonction ppcm(a,b) renvoyant le PPCM de deux entiers naturels a et b. iv) Déterminer le PGCD et le PPCM des entiers a = 1113245 et b = 5478221 au moyen de cette fonction. b) Nombre d étapes de l algorithme d Euclide. Soient a et b deux entiers naturels tels que a b > 0. On note (f n ) la suite de Fibonacci : { f0 = 0, f 1 = 1 n N, f n+2 = f n+1 + f n 5 + 1 i) Rappeler l expression de f n en fonction du nombre d or φ =. 2 ii) Établir le théorème de Lamé : si le calcul de d = a b avec a b > 0 par l algorithme d Euclide demande n étapes, alors : a df n+2 et b df n+1 iii) Vérifier qu en particulier, si a = F n+2 et b = F n+1, il y a exactement n étapes de calcul. iv) En déduire que le nombre d étapes de l algorithme d Euclide est logarithmique en b. 2. Algorithmes de tri 5. [ Tri par sélection ] ( ind ) Notons n la longueur de la liste t. Le tri par sélection s effectue de la manière suivante : on commence par déterminer le plus petit parmi t[0],..., t[n-1] puis on échange t[0] et cet élément. On continue par déterminer le plus petit élément parmi t[1],...,t[n-1] puis on échange t[1] et cet élément, et on continue ainsi de suite jusqu à épuisement de la liste. a) Mettre en œuvre cet algorithme à la main sur t=[6,-3,7,5,1,0]. b) Écrire une procédure triselection(t) renvoyant la liste t triée selon cette méthode. c) Prouver la terminaison et la correction de cette fonction. d) Déterminer la complexité de cet algorithme. LLG PCSI 2 Info Exercices 4 4
6. [ Tri par insertion ] ( ind ) Le tri par insertion est un algorithme de tri que la plupart des personnes utilisent naturellement pour trier des cartes : prendre les cartes mélangées une à une sur la table, et former une main en insérant chaque carte à sa place. Le tableau est trié en place, ie on ne crée pas de tableau auxiliaire, on travaille directement sur le tableau initial. a) Mettre en œuvre cet algorithme à la main sur t=[6,-3,7,5,1,0]. b) Écrire une fonction triinsertion(t) renvoyant la liste t triée selon cet algorithme. c) Prouver la terminaison et la correction de cet algorithme. d) Calculer la complexité de cette fonction dans le meilleur des cas puis dans le pire des cas. 7. [ Tri-bulle ] ( ind ) Le principe du tri à bulle est le suivant : parcourir le tableau en comparant les couples d éléments successifs. Lorsque deux éléments successifs ne sont pas dans l ordre croissant, ils sont échangés : le maximum arrive en position finale en remontant comme une bulle de champagne. On recommence alors l opération jusqu à obtenir une liste entièrement triée. a) Mettre en œuvre cet algorithme à la main sur t=[6,-3,7,5,1,0]. b) Écrire une fonction tribulle(t) renvoyant la liste t triée par cette méthode. c) Prouver la terminaison et la correction de cet algorithme. d) Quelle est la complexité dans le meilleur des cas puis dans le pire des cas de cet algorithme? 8. [ Tri par dénombrement ] ( ind ) Soit N un entier naturel. On suppose, dans cette partie, que les listes sont constituées d entiers compris entre 0 et N. Écrire une fonction tripostier(t) qui trie une liste t en temps linéaire par rapport à sa longueur. On pourra utiliser une liste auxiliaire tcomptage qui compte les occurrences de chaque entier de 0,N. LLG PCSI 2 Info Exercices 4 5
3. Indications 1. [ L algorithme d Hörner ] 2. [ Algorithmes de division euclidienne dans N ] 3. [ Deux algorithmes d exponentiation ] 4. [ Algorithme d Euclide du calcul du PGCD, application au PPCM ] 5. [ Tri par sélection ] 6. [ Tri par insertion ] 7. [ Tri-bulle ] 8. [ Tri par dénombrement ] LLG PCSI 2 Info Exercices 4 6