Élever une matrice à une puissance, en Python
Exercice d'entraînement · niveau 3 (difficile) · mathématiques appliquées (ECG 1re année), chapitre 2 — Calcul matriciel et systèmes linéaires · Puissances et polynômes annulateurs
Énoncé
Écrire une fonction Python puissance(A, n) qui calcule pour une matrice carrée A (tableau numpy) et un entier , en n'utilisant que np.dot, np.eye et une boucle. Combien de produits de matrices effectue-t-elle ? Proposer ensuite une version qui en fait beaucoup moins en utilisant .
Corrigé
Version directe.
import numpy as np
def puissance(A, n):
P = np.eye(len(A)) # A^0 = I
for _ in range(n):
P = np.dot(P, A) # un produit par tour
return P
La boucle tourne fois et fait un produit par tour : produits de matrices. Pour des matrices , chaque produit coûte de l'ordre de multiplications de nombres, soit environ en tout.
Version rapide. On exploite et :
def puissance_rapide(A, n):
if n == 0:
return np.eye(len(A))
B = puissance_rapide(A, n // 2)
C = np.dot(B, B)
if n % 2 == 1:
C = np.dot(A, C)
return C
Le compte. À chaque appel, est divisé par : il y a donc de l'ordre de appels, et chacun fait un ou deux produits. Le nombre de produits est au plus , contre pour la première version. Pour : environ produits au lieu de .
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.