Puissances de matrices et Fibonacci
Exercice · informatique (tronc commun des prépas scientifiques), chapitre 5 — Algorithmes dichotomiques
Énoncé
En admettant la fonction matmul(A, B) multipliant deux matrices , adapter l'exponentiation rapide pour calculer (le 100e terme de la suite de Fibonacci) via la relation :
Corrigé
def matmul(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]]]
def matpow(A, n: int):
R = [[1, 0], [0, 1]] # Matrice identité (neutre)
B, m = A, n
while m > 0:
# Invariant : R @ B**m == A**n
if m % 2 == 1:
R = matmul(R, B)
B = matmul(B, B)
m = m // 2
return R
F = matpow([[1, 1], [1, 0]], 100)
# F[0][1] contient la valeur exacte de F_100
assert F[0][1] == 354224848179261915075
La complexité de ce calcul est de multiplications de matrices.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.