Deuxième semestre 2009-2010 Université Paris 7 Licence 1re année CF2 - Calcul Formel [email protected] Feuille d'exercices No 3 Bis - Récursivité Exercice 1 : Suite de Fibonacci : On dénit F0 = 0, F1 = 1 et Fn = Fn−1 + Fn−2 , pour n ≥ 2. Construire une procédure récursive fibo qui calcule le n-ième nombre de Fibonacci Fn . Evaluer le temps de calcul de F20 de la manière suivante : [> u:=time(); fibo(20); time()-u;. Modier la procédure précédente en introduisant option remember; dans la procédure. Evaluer de la même manière le temps de calcul. Commenter. Ecrire une autre procédure itérative fiboiter qui calcule Fn . Evaluer le temps de calcul. Exercice 2 : Exponentiation rapide : Soit x réel. On souhaite calculer de manière efcace (ie. en minimisant le nombre de calculs) xn pour n entier naturel. L'algorithme d'exponentiation rapide repose sur le calcul suivant : ( n x = x 2 .x 2 , si n pair n−1 n−1 2 2 x .x .x si n impair. n n 1. Combien de multiplications eectue-t-on en eectuant naïvement le calcul de xn ? 2. Combien de calculs eectue-t-on, au pire, dans l'algorithme d'exponentiation rapide ? 3. Ecrire une procédure récursive eectuant le calcul de xn selon le principe de l'exponentiation rapide. 4. Procéder de même en rédigeant cette fois-ci une procédure itérative. Exercice 3 : Algorithme d'Euclide : Pour deux entiers a, b, il existe un unique entier d tel que d divise a et b et tel que, si u divise a et b, alors u divise d. d est le PGCD Grand Commun Diviseur) de a et b. Ainsi, le P GCD de 60 et 45 est 15. positif (Plus 1. Quel est le P GCD de a et de 0 ? 2. Pour b non nul, soit r le reste de la division entière de a par b (fonction Maple irem(a, b)). Prouver que P GCD(a, b) = P GCD(b, r). Noter que |r| < |b|. 3. En utilisant les questions précédentes, construire une procédure récursive Pgcd(a, b) qui renvoie le P GCD de a et b (Algorithme d'Euclide ). 4. Donner une version itérative Pgcd_it(a,b) de la procédure. Exercice 4 : Identité de Bezout (Algorithme d'Euclide étendu) : Si d est le P GCD de a et b, un résultat d'arithmétique nous dit qu'il existe un couple (u, v) tel que d = u × a + v × b, (identité de Bezout ). Reprendre l'idée de la procédure Pgcd et en déduire une procédure récursive Bezout(a, b) qui renvoie une liste [u, v] de coecients de l'identité de Bezout. Ainsi : 3 = P GCD(9, 15). Bezout(9, 15) doit renvoyer une liste [u, v] telle que 3 = u × 9 + v × 15. 1 (Indications : Avec les notations ci-dessus : en supposant b non nul et la division entière a = q × b + r, on a : d = u × a + v × b = u × (q × b + r) + v × b = (u × q + v) × b + u × r. Ainsi le calcul de Bezout(a, b) = [u,v] se ramène au calcul de Bezout(b, r) = [u*q+v, u]. On choisira une valeur adéquate pour Bezout(a,0).) Exercice 5 : Écrire une version itérative Bezout_it(a, b) de la procédure ci-dessus. 2