Module Info31 – L2 Sciences & Techniques Université de Bourgogne Dominique Michelucci
Document de travail pour le TD2 Exercices de base
1- Puissance rapide
Construisez un algorithme de calcul de puissance rapide sur les entiers :
- la méthode de réduction consiste à remplacer n2k par (n2 )k et n2k+1 par n*(n2 )k
- indiquez de façon précise les cas d'arrêt et précisez pourquoi les appels récursifs vont se terminer.
Donnez les bases de ce même algorithme pour la puissance rapide de matrices.
Remarque- pour calculer une puissance d'entiers an il est possible d'écrire la puissance, n, en binaire sous la forme : 20 n0 + 21 n1 + 22 n2 + 23 n3 + … + 2k nk et d'utiliser l'algorithme suivant :
// calcul de an avec n=20 n0 + 21 n1 + 22 n2 + 23 n3 + … + 2k nk
r ← 1
pour i de k à 0 faire r ← r*r si nk ==1 alors r ← r*a
fsi fpour
2- Fibonacci
La suite de Fibonacci est définie par : F0=0; F1=1;
Fn=Fn−1+Fn−2, pour n>1 a) Proposez un calcul récursif simple de cette suite.
b) Construisez l'arbre des premiers appels récursifs (jusqu'à n valant 4 ou 5) et calculez le nombre d'appels sur 0 et 1. Vérifiez que pour toute valeur de n, le nombre d'appels de F1 est égal à la valeur de la suite de Fibonacci sur n.
c) Pour obtenir une certaine efficacité, on veut conserver et réutiliser des résultats intermédiaires. L'idée est de passer à du calcul matriciel, comme illustré ci-contre.
Quelle matrice doit être utilisée ?
Remarque Le calcul matriciel de (Fn, Fn-1) sera donc fait comme indiqué ci-contre : le calcul de la suite de Fibonacci consiste à calculer une puissance de matrice.
Il est possible d'utiliser une méthode de calcul de puissance rapide, comme celle vue en question 1.
3- Suites
Ecrivez un calcul récursif de la suite de Thue-Morse qui est définie par :
T0=0 T2n=Tn
T2n+1=1-Tn
Remarque La suite de Thue-Morse, permet de dessiner une courbe de Von Koch en n segments (avec une boucle « pour i de 1 à n » dans laquelle on avance d'une unité si la valeur Ti de la suite est 0 et en tournant à gauche de 60 degrés si la valeur Ti de la suite est 1).
TD2-1- ( Fn , Fn-1 ) = ( Fn-1 , Fn-2 )
? ?
? ?
( Fn , Fn-1 ) = ( Fn-2 , Fn-3 ) 2
? ?
? ?
( Fn , Fn-1 ) = ( Fn-3 , Fn-4 ) 3
? ?
? ?
( Fn , Fn-1 ) = ( F1 , F0 )
n-1
? ?
? ?
. . .
Module Info31 – L2 Sciences & Techniques Université de Bourgogne Dominique Michelucci
Ecrivez un calcul récursif de la fonction HOTPO1 qui est définie pour tout entier n>0 par :
h(n) : selon
cas n=1 : 1
cas n pair : h (n/2)
cas n >1 et impair : h (3n + 1) fcas
D'après Denis Lugiez, université de Marseille- Proposez un algorithme permettant, pour un entier n
donné, d'afficher :
- les résultats des calculs successifs h(n), h2(n), h 3(n), … jusqu'à obtenir 1,
- le nombre d'itérations nécessaires pour obtenir 1 en partant de n, pour n variant entre 1 et 10000.
4- Recherche d'un élément dans un tableau
Ecrivez l'algorithme de recherche du ke élément d'un tableau en adaptant la méthode du tri rapide. Il n'est pas demandé de trier le tableau.
Autres schémas récursifs 5- Cascade des appels récursifs
Ecrivez deux calculs récursifs qui affichent un par un, respectivement à l'endroit et à l'envers, les chiffres constituant un entier donné.
Par exemple pour 23657, vous devez afficher 2 3 6 5 7 et 7 5 6 3 2.
Vous disposez des opérations % et / pour accéder au dernier chiffre d'un entier (reste de la division entière par 10) et au début d'un entier (division entière par 10).
6- Fonction d'Ackerman
La fonction d'Ackerman est définie par :
A(a,b)= si a=0 alors b+1
si a>0 et b=0 alors A(a-1,1)
si a>0 et b>0 alors A(a-1,A(a,b-1))
Attention : ne pas lancer le calcul de cette fonction pour des valeurs élevées de a et b (a<=2 semble être un choix raisonnable). Vous trouverez une table des premières valeurs de la fonction d'Ackerman à l'adresse http://www-users.cs.york.ac.uk/susan/cyc/a/ackermnn.htm. En TP, vous pourrez utiliser en Java les « bigInteger ».
7- Récursivité croisée
D'après Patrick Cégielski, université Paris Est Créteil & LACL- Ecrivez le calcul de la suite un sachant que un, vn et wn sont définies pour tout entier n≥0 par :
– u0 = 1 et un+1 = 2un + 3vn + wn
– v0 = 2 et vn+1 = un + vn + 2wn
– w0 = 3 et wn+1 = un + 4vn + wn
Annexe- complément au TP sur les fractales Fractale de Mandelbrot
Vocabulaire nombre complexe (somme, produit, module).
La fonction f(z) =z2+c est définie sur les nombres complexes et on peut démontrer que si le module de z est supérieur strictement à 2, alors le module de f n(z) tend vers +∞.
Pour dessiner la fractale de Mandelbrot, vous devez utiliser la forme suivante de cette propriété : si il
1 Lothar Collatz, 1937 : quelque soit la valeur de départ, cette suite atteint la valeur 1. Cette conjecture est aussi connue sous le nom de problème de Syracuse ... et sous le sigle HOTPO (Half Or Triple Plus One). Vous trouverez quelques courbes de « hotpo » à l'adresse http://mathematicalgarden.wordpress.com/2009/01/04/the-syracuse-problem/
TD2-2-
Module Info31 – L2 Sciences & Techniques Université de Bourgogne Dominique Michelucci
existe k, tel que f k(z)> 2 alors il y a divergence.
Procédez de la façon suivante :
– le nombre complexe c est défini par les réels x et y, – choisir un nombre maximal n d'itérations,
– calculer f (z), f 2(z), f 3(z), … f n(z)
– si le module de f n(z) est inférieur à 2 alors on suppose qu'il n'y aura pas divergence,
– et on trace le point de coordonnées (x, y) … en bleu sur la figure ci-contre.
Les bornes du calcul de f n(z) étant petites (notées xmin et xmax, ymin et ymax), on utilise un facteur de grossissement pour l'affichage.
Etant données les valeurs xmin, xmax, ymin, ymax, ainsi que le facteur de grossissement et le nombre maximum d'itérations, tracez la fractale de Mandelbrot.
// dans tout l'algorithme, pour les calculs sur les complexes // le suffixe r indique l'axe horizontal
// le suffixe i indique l'axe vertical
// définir deux constantes pour les largeur et hauteur de l'écran graphique largeur ←
hauteur ←
// définir les dimensions de la fenêtre de calcul xmin ←
xmax ← ymin ← ymax ←
// définir le nombre maximum d'itérations et la valeur limite de calcul iters ←
limite ←
// initialisation du complexe c cr ←
ci ←
// taille du pixel sur l'écran graphique pixLarg ←(xmax-xmin)/largeur
pixLong ←(ymax-ymin)/hauteur // calculs
pour x de 0 à hauteur
zr0 ← xmin + x * pixLarg pour y de 0 à largeur
zi0 ← ymin + y*pixLong
zr ← zr0 // initialisation du complexe z zi ← zi0
modr ← zr*zr // calcul du module de z modi ← zi*zi
nbi ← 0 // compteur du nombre d'itérations effectuées tant que nbi < iters ET modr+modi < limite
zi ← 2*zr*zi + ci zr ← modr-modi +cr modr ← zr*zr
modi ← zi*zi nbi++
ftq
si nbi==iters alors // dessiner
tracer le point (x,y) fsi
fpour fpour
TD2-3- xmin=-2.0 xmax=1.0 ymin=-1.0 ymax=1.0 nbmax=100 facteur=250