De l'égalité
\[ \left( \begin{matrix} F_{n+1} \\ F_n \end{matrix} \right) = \left( \begin{matrix} 1 & 1 \\ 1 & 0 \end{matrix} \right) \times \left( \begin{matrix} F_{n } \\ F_{n -1}\end{matrix} \right) \]
on déduit facilement :
\[ \left( \begin{matrix} F_{n+1} \\ F_n \end{matrix} \right) = \left( \begin{matrix} 1 & 1 \\ 1 & 0 \end{matrix} \right)^n \times
\left( \begin{matrix} 1 \\ 1\end{matrix} \right) \]
def produit(A, B):
"""
A = [[a,b]
[c,d]] matrice 2*2
B est une autre matrice 2*2
La fonction retourne le produit C des deux matrices
"""
C = [[0,0],[0,0]]
for i in (0,1) :
for j in (0,1) :
C[i][j] = A[i][0]*B[0][j] + A[i][1]*B[1][j]
return C
def puissance(A, n, p = [[1,0],[0,1]]) :
"""
A est une matrice 2*2.
La fonction retourne A^n.
"""
if n == 0 : return p
if (n%2 == 0) : return puissance(produit(A,A), n//2, p )
else : return puissance(produit(A,A), n//2, produit(p,A) )
def fibonacci(n) :
A = [[1,1],[1,0]]
F = puissance(A, n)
return F[1][0] + F[1][1]
for k in range(20) :
print(fibonacci(k))
Il ne reste plus quà constater que, dans la fonction puissance, le nombre d'appels à la fonction produit est en log(n)
(voir cette fiche d'exercices).
Comme chaque appel de produit
fait intervenir un nombre constant d'opérations, on a bien au final une complexité
en log(n).