Adloun

É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.