algorithmique (école d'ingénieur) · Chapitre 13 · Exercice de TD
Fibonacci en
Diviser pour régner · niveau 2
Énoncé
Avec , on admet que pour , où , et . Écrire une fonction récursive qui calcule en produits de matrices de long, puis une fonction qui retourne . Vérifier . Jusqu'à quelle valeur de le résultat tient-il dans un long ?
Corrigé
On calcule par exponentiation rapide : si est pair, et sinon.
static long[][] produit(long[][] A, long[][] B) {
return new long[][] {
{A[0][0] * B[0][0] + A[0][1] * B[1][0], A[0][0] * B[0][1] + A[0][1] * B[1][1]},
{A[1][0] * B[0][0] + A[1][1] * B[1][0], A[1][0] * B[0][1] + A[1][1] * B[1][1]}};
}
static long[][] puissance(long[][] M, int n) { // M^n, n >= 0
if (n == 0) return new long[][] {{1, 0}, {0, 1}};
long[][] R = puissance(M, n / 2); // M^(n/2)
R = produit(R, R); // M^(2(n/2))
return n % 2 == 0 ? R : produit(R, M);
}
static long fib(int n) {
return puissance(new long[][] {{0, 1}, {1, 1}}, n)[0][1];
}
13.7 : f(10) = 55, f(90) = 2880067194370816120, f(92) = 7540113804746346429
Chaque appel divise par deux et fait au plus deux produits de matrices (huit multiplications chacun) : opérations. Le plus grand terme représentable est : dépasse . Au-delà, il faut BigInteger.
100 % gratuit
La suite du chapitre est sur Adloun
- 10 autres exercices corrigés dans ce chapitre
- Les 2 QCM du chapitre, le premier sans compte
- Le tuteur, qui guide pas à pas sans donner la réponse
Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.