Info – Exercices 4 Algorithmique
Création et utilisation de fonctions sous Python.
4 Algorithmique .......................................................................... 1
1 Complexité........................................................................ 2
2 Algorithmesdetri.................................................................. 4
3 Indications ........................................................................ 6
PCSI2\2014-2015 Laurent Kaczmarek
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 aR. On écrit
P(X) =p0+p1X+···+pnXn
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 aka un coût de l’ordre de ln(k), quel est la complexité de cet algo-
rithme ?
b) Hörner a proposé la méthode suivante :
P(α)=p0+α·¡p1+α·¡p2+α·¡p3+α·(···)¢¢¢
Par exemple, pour calculer P(2) lorsque P =p3X3+p2X2+p1X+p0, on calcule successivement :
p3,p2+2p3,p1+2(p2+2p3)=p1+2p2+22p3,
p0+2¡p1+2p2+22p3¢=p0+p12+p222+p323=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 tet aun nombre réel et ren-
voyant 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 succes-
sives. 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’algo-
rithme naïf.
iii) Quelle est la complexité de cet algorithme ?
b) Algorithme binaire.
On propose l’amélioration suivante :
LLG \PCSI2Info – Exercices 4 \2
PCSI2\2014-2015 Laurent Kaczmarek
Algorithme 1 : Algorithme binaire de division euclidienne
Données : Deux entiers naturels aet btels que b6=0;
Résultat : Le couple quotient-reste de la division euclidienne de apar b;
Initialisation : q0, w b, r a;
tant que wÉrfaire
w2×w;
fin
tant que w6= bfaire
q2×q;
wquotient de w par 2;
si wÉralors
rr-w;
qq+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 :
½qw +r=a
0Ér<w
En déduire la correction de l’algorithme.
iii) Écrire une fonction divisionEuclidienneBinaire(a,b) renvoyant le couple (q,r) en sui-
vant 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 anaet nsont deux entiers
naturels non nuls.
a) Algorithme naïf.
i) Écrire un algorithme itératif renvoyant an. 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 anpar cet algorithme.
b) Algorithme d’exponentiation rapide.
On considère l’algorithme suivant :
Algorithme 2 : Exponentiation rapide
Données : Deux entiers aet nde N;
Résultat :an;
Initialisation : R1, A a, N n;
tant que N>0faire
si N est impair alors
RR×A;
AA×A;
Nquotient dans la division euclidienne de N par 2;
Renvoyer R
i) Montrer la terminaison de l’algorithme.
ii) Montrer que an=RANest un invariant de boucle.
LLG \PCSI2Info – Exercices 4 \3
PCSI2\2014-2015 Laurent Kaczmarek
iii) En déduire la correction de cet algorithme.
iv) Calculer la complexité de cet algorithme.
v) Écrire une fonction er(a,n) renvoyant anpar 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 aet bvérifiant la
condition (a,b)6= (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 aet bselon l’al-
gorithme d’Euclide.
iii) Écrire une fonction ppcm(a,b) renvoyant le PPCM de deux entiers naturels aet 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 aet bdeux entiers naturels tels que aÊb>0. On note (fn) la suite de Fibonacci :
½f0=0, f1=1
nN,fn+2=fn+1+fn
i) Rappeler l’expression de fnen fonction du nombre d’or φ=p5+1
2.
ii) Établir le théorème de Lamé : si le calcul de d=abavec aÊb>0 par l’algorithme d’Euclide
demande nétapes, alors :
aÊdFn+2et bÊdFn+1
iii) Vérifier qu’en particulier, si a=Fn+2et b=Fn+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 nla 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 ttriée selon cette méthode.
c) Prouver la terminaison et la correction de cette fonction.
d) Déterminer la complexité de cet algorithme.
LLG \PCSI2Info – Exercices 4 \4
PCSI2\2014-2015 Laurent Kaczmarek
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 ttrié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 suc-
cessifs. Lorsque deux éléments successifs ne sont pas dans l’ordre croissant, ils sont échangés : le maxi-
mum 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 ttrié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 ten 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 \PCSI2Info – Exercices 4 \5
1 / 6 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !