Calculer Fibonacci efficacement

L'exponentiation matricielle

Peut-on battre le coût linéaire ? Oui, en écrivant la récurrence sous forme matricielle. On empile deux termes consécutifs et on remarque :

   | F(n+1) |   | 1  1 |   | F(n)   |
   |        | = |      | * |        |
   | F(n)   |   | 1  0 |   | F(n-1) |

Multiplier par cette matrice fait avancer d'un cran. L'appliquer n fois donne une identité remarquable :

   | 1  1 |^n   | F(n+1)  F(n)   |
   |      |   = |                |
   | 1  0 |     | F(n)    F(n-1) |

Calculer F(n) revient donc à élever cette matrice à la puissance n. Or une puissance se calcule par exponentiation rapide : au lieu de multiplier n fois, on élève au carré à répétition en lisant n en binaire.

   M^16 = ((((M^2)^2)^2)^2)      (4 elevations au carre, pas 15 produits)

Coût : logarithmique, O(log n) multiplications de matrices 2×2. On atteint F(1 000 000) en une poignée d'opérations, là où l'itération en demanderait un million.

Cette écriture livre en prime de belles identités. En prenant le déterminant de l'égalité ci-dessus (celui de la matrice de base vaut −1, donc celui de sa puissance n vaut (−1)^n) :

   F(n-1) * F(n+1) − F(n)²  =  (−1)^n       (identité de Cassini)

Une seule idée — voir la récurrence comme une matrice — fournit à la fois l'algorithme le plus rapide et des formules élégantes. C'est toute la puissance de l'algèbre linéaire mise au service d'une suite d'entiers.