PCSI TP MAPLE 9 : ALGORITHMES CLASSIQUES 1) Algorithme d’Euclide. Il a été vu dans le TP8. Pouvez cette fois faire une version non récursive de la mise en œuvre de cet algorithme ? 2) Algorithme de détermination de la primalité d’un naturel. Rappeler pourquoi un entier n est premier ss’il ne possède aucun diviseur entre 2 et ……….. Écrire une procédure estpremier:=proc(n) qui aura la même fonction que isprime Comparer les temps de calcul entre estpremier et isprime. 3) Algorithme de détermination de la liste des nombres premiers de 2 à n, dit algorithme du crible d’Eratosthène. Principe (essayer déjà sur feuille avec n = 50): a) partir de la liste L des entiers de 2 à n. b1) barrer dans cette liste tous les éléments qui sont multiples stricts du premier terme b2) barrer dans la liste obtenue tous les éléments qui sont multiples stricts du deuxième terme. … bk) barrer dans la liste obtenue tous les éléments qui sont multiples stricts du k-ième terme. c) s’arrêter lorsque le k-ième terme a un carré > n. La liste L modifiée comporte alors tous les nombres premiers de 1 à n. Écrire une procédure listePremiers:=proc(n) qui donne la liste des nombres premiers de 1 à n. Pour barrer dans la liste, vous utiliserez soit « minus » (il faudra alors convertir la liste en ensemble par {op(L)}, soit « remove ». 4) Algorithme de décomposition d’un naturel dans une base. b Principe : si n a0 a1b a2b 2 .. aN b N a N ...a0 , a0 est le reste de la division de n par b b et n1 a1 a2b a3b 2 .. aN b N 1 aN ...a1 est le quotient dans cette division. Écrire une procédure (récursive ou non) dec:=proc(n,b) retournant la séquence des chiffres de n dans la base b. Utiliser « iquo » et « irem ». 5) Algorithme d’exponentiation rapide. a) Écrire une procédure expol:=proc(a,n) retournant an. b) Principe de l’algorithme d’exponentiation rapide. Il consiste à décomposer n en somme de puissances de 2 (autrement dit à écrire n en base 2) et d’en déduire un calcul de an par une suite d’élévations au carré successives. Par exemple 100= 4 + 32 + 64 , donc a 100 a 64 a 32 2 a .a .a , sachant que a a 4 4 32 64 32 2 2 2 et . L’algorithme s’effectuera de la manière suivante : divisions 100 successives 50 25 impair 12 6 3 impair 1 impair de n par 2 élévations a successives de a au carré résultat 1 a2 a4 a8 a16 a 32 a 64 1 a4 a4 a4 a 4 a 32 a 36 a 4 a 32 a 64 a100 Écrire une procédure (récursive, ou non) expor:=proc(a,n) retournant an et utilisant cet algorithme. Comparer les temps de calcul entre « expol » et « expor ». c) Pour ceux qui connaissent les congruences : appliquer la méthode de l’exponentiation rapide pour obtenir le reste de la division de 22002005 par 101. 6) La bonne vieille division. Programmer une fonction f:=proc(a,b,k) qui retourne une liste formée de la partie entière du quotient de a par b, puis les k premières décimales du quotient (par exemple, f(22,7,5)=[3,1,4,2,8,5]) ; les seules fonctions autorisées sont , , , iquo, et irem. 7) L’extraction de racines carrées. Programmer une fonction f:=proc(n,k) qui retourne la liste formée de la partie entière du quotient de la racine carrée de n, puis de ses k premières décimales ; les seules opérations autorisées sont , , . 8) Algorithme de division euclidienne des polynômes. A et B étant donnés, déterminer Q et R. Degré d’un polynôme : degree Coefficient dominant d’un polynôme : lcoeff 9) Algorithme de Horner pour calculer les valeurs d’un polynôme. Principe : P x a0 a1 x ... an xn a0 x a1 x a2 x a3 ..... x an1 xan Écrire une procédure horner:=proc(a,x,n) qui retourne n a k x k . k 0 Comparer les temps de calcul avec un calcul normal (pour le test prendre a k k , x 4, n 100 ). 9) Algorithme glouton pour la décomposition d’un rationnel > 0 en somme de fractions égyptiennes. Principe : retrancher la plus grande fraction égyptienne inférieure ou égale à x et recommencer jusqu’à ce qu’on obtienne zéro. Écrire une procédure glouton:=proc(x) qui retourne la liste des fractions égyptiennes obtenues par cet algorithme ; leur somme doit être égale à x. Exercice : démontrer que cet algorithme se termine toujours. Autres algorithmes, pour mémoire : - algorithme d’insertion pour le tri (cf. TP 8), - algorithme de calcul approché d’une solution d’une équation par dichotomie. - algorithme du pivot de Gauss pour la résolution d’un système linéaire. -algorithme de Schmidt pour la détermination d’une base orthonormée.