Adloun

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

Exercice suivant et tuteur

Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant et tuteur →