La suite de Fibonacci
πλ
23 Novembre 2017
R´esum´e
L’objectif de cette s´eance de travaux-pratiques est de mettre en ´evidence quelques observations faites en cours sur le calcul des nombres de la suite de Fibonacci. Une occasion de pr´esenter les outilsbc,gcc,gdb,objdump etgprof.
1 Arithm´ etique modulaire sur 64 bits
Soitnun module. L’ordre multiplicatif modulaire d’un entierxpremier avec nd´esigne le plus petit entier f tel quexf ≡1 (modn). Un tel entier est bien d´efini `a condition quexsoit inversible modulon. En effet, l’entierkvariant, la suitexk (modn) prenant ses valeurs dans un ensemble fini, il existe j > i tel que :
xj=xi (mod n) =⇒xj−i= 1 (modn),
on peut alors montrer que f divise j−i, et c’est bien le plus petit entier qui v´erifiexk = 1 (modn). Apr´es compilation de la sourcearithmos.c, on obtient : mesure> g c c −Wall a r i t h m o s . c −o a r i t h m o s . e x e
mesure> x =2147483648
mesure> n =658812288653553079 mesure> . / a r i t h m o s . e x e $x $n
o r d r e de 2 1 4 7 4 8 3 6 4 8 modx 6 5 8 8 1 2 2 8 8 6 5 3 5 5 3 0 7 9 > 255 mesure> bc <<< ” ( $x ˆ 3 ) % $n ”
1
1. Il y a un soucis, pourquoi ?
1
1 #include<stdio.h>
2 #include<stdlib.h>
3 /∗
4 ∗ test l ’ ordre multiplicatif d’un entier modulo un autre
5 ∗ status : bug
6 ∗/
7
8 typedef unsigned long longnombre;
9
10 intordre(nombre x, nombre m)
11 {
12 int res = 1;
13 nombre y = x;
14 while (y != 1 && res<255){
15 y = (x∗ y) % m;
16 res ++;
17 }
18 returnres;
19 }
20
21 intmain(intargc,char∗argv[])
22 {
23 nombre x = atoll(argv[1]);
24 nombre m = atoll(argv[2]);
25 int f = ordre( x, m );
26 if ( f <255 )
27 printf (”ordre de %Ld modx %Ld = %d\n”, x, m, f);
28 else
29 printf (”ordre de %Ld modx %Ld>255\n”, x, m);
30 return0;
31 }
arithmos.c
2
2. Faire un diagnostic !
3. D´ecrire sommairement une solution pour sortir de ce mauvais pas.
Indication : utiliserbc -lpour calculer le logarithme `a base 2 dexetn.
2 Fibonacci
On rappelle que la suite de Fibonacci est d´efinie par les r`egles suivantes : F0= 0, F1= 1, ∀n >1, Fn=Fn−1+Fn−2.
Il s’agit mettre en oeuvre le calcul des nombres de Fibonacci dans des pro- grammes en langage C. Les implantations doivent contenir une fonctionullong fib(int n)o`uullongest un type entier de 64 bits. Les commandes associ´ees prendront un entier n en argument pour ´ecrire la valeur de Fn sur la sortie standard.
2.1 m´ ethode it´ erative
1. Modifier la commande pour mettre en ´evidence la limite de FFn+1
n . 2. Proposer un ´equivalent deFn en fonction denet du nombre d’or.
3. D´eterminer empiriquement le domaine de validit´e de la commande en affichant les premiers termes des suitesFn etFn+1/Fn.
4. Utiliser l’option −S compilateur pour mettre en ´evidence le nombre d’op´erations machines g´en´er´ees par le compilateur pour la partie instruc- tion de la boucle de fib.
5. Retrouver les r´esultats avec les commandesgdbetobjdump.
6. Ecrire un script bas´e sur la commandebcpour calculer len-i`eme nombre de Fibonacci.
7. Quel est le nombre de chiffre d´ecinaux deF1000? 8. Retrouver ce r´esultat `a partir de l’´equivalent (4).
2.2 m´ ethode r´ ecursive
On noteT(n) le temps de calcul de la version r´ecursive.
1. Pour quelle valeur denpeut-on calculerFn en moins d’une minute.
2. Utiliser la commande gnuplotpour tracer le graphe de logT(n).
3. Proposer un ´equivalent deT(n) en fonction deFn.
4. Utiliser le profileur gprof pour d´eterminer le nombre d’appels r´esursif pour calculer F20.
3