#entrée : un entier n
#sortie : le n^e terme de la suite de Fibonacci
#algorithme en temps O(M(n)) où M(n) est la complexité d'une multiplication de nombres de n bits
def fib3(n):
#entrée : deux matrices A et B de taille 2X2 avec des nombres sur k bits
#sortie : la matrice A*B
#calcul direct. Nb constant d'opérations arithmétiques.
#en O(M(k)) si M(k) est la complexité pour faire une multiplication de deux nombres de k bits chacun
def matrix22mult(A, B):
return [[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]]]
#entrée: une matrice A de taille 2X2, n entier
#sortie : la matrice A^n
#calcul avec exponentiation rapide O(log n M(n)) mais en fait en O(M(n))
def matrix22expo(A, n):
if n == 0:
return [[1, 0], [0, 1]]
else:
B = matrix22expo(A, n//2)
if n % 2 == 0:
return matrix22mult(B, B)
else:
return matrix22mult(A, matrix22mult(B, B))
return matrix22expo([[0, 1], [1, 1]], n) [0][1]