Algorithme de Strassen

Un article de Wikipédia, l'encyclopédie libre.
Ceci est une version archivée de cette page, en date du 2 décembre 2014 à 18:42 et modifiée en dernier par Mm (discuter | contributions). Elle peut contenir des erreurs, des inexactitudes ou des contenus vandalisés non présents dans la version actuelle.

L’algorithme de Strassen est un algorithme calculant le produit de deux matrices carrées de taille n, proposé par Volker Strassen en 1969[1]. La complexité de l'algorithme est en , avec pour la première fois un exposant inférieur à celui de la multiplication naïve (en ).

L'avantage algorithmique sur le nombre de multiplications a néanmoins un inconvénient : l'algorithme n'est pas très stable numériquement[réf. nécessaire].

Importance du résultat

Historiquement, l'algorithme de Strassen est le premier algorithme de multiplication de matrices demandant asymptotiquement un nombre d'opérations arithmétiques (additions et multiplications) . On ignorait auparavant s'il était possible de multiplier des matrices en complexité sous-cubique. (Ce n'est cependant pas le premier algorithme « plus rapide » que l'algorithme naïf : Shmuel Winograd avait donné en 1967 un algorithme demandant environ multiplications dans le cas de matrices à coefficients dans un anneau commutatif, contre environ pour l'algorithme naïf.)

De surcroît, l'article de Strassen montre comment utiliser l'algorithme rapide de multiplication pour calculer l'inverse d'une matrice avec la même borne de complexité. Il prouve ainsi que l'algorithme usuel du pivot de Gauss n'est pas optimal.

Le travail de Strassen a ouvert un champ de recherche important en informatique théorique. La question centrale dans ce domaine est de savoir s'il est possible de multiplier deux matrices en opérations pour arbitrairement proche de . Parmi les résultats importants qui suivront, on peut citer notamment l'algorithme de Coppersmith-Winograd (1987), dont la complexité est longtemps resté la meilleure connue.

Description de l'algorithme

Soit R un anneau unitaire et soient A et B des matrices carrées de taille n dont les coefficients sont éléments de l'ensemble sous-jacent à R. Pour des raisons de simplicité on traite le cas où n est une puissance de 2. On peut toujours se ramener à ce cas en rajoutant éventuellement des colonnes et des lignes de zéros. L'algorithme de Strassen permet de calculer la matrice produit C.

Les trois matrices A, B et C sont divisées en matrices par blocs de taille égale :

On a alors

Cette méthode nécessite 8 multiplications de matrices pour calculer les Ci,j, comme dans le produit classique.

La force de l'algorithme de Strassen réside dans un ensemble de sept nouvelles matrices Mi qui vont servir à exprimer les Ci,j avec seulement 7 multiplications au lieu de 8 :

Les Ci,j sont alors exprimées comme

Le procédé est répété jusqu'à ce que les matrices A et B soient « de petite taille ».

Il n'est pas nécessaire d'itérer le procédé jusqu'à une taille 1. En pratique, l'algorithme de Strassen est utilisé pour les matrices de grande taille. Il divise la taille jusqu'aux dizaines ou centaines et un autre algorithme de multiplication prend ensuite le relais pour calculer le produit des « petites matrices » obtenues.

Dans l'algorithme original de Strassen, chaque niveau de récursion effectue 18 additions et soustractions de blocs en plus des 7 multiplications. En 1980, Shmuel Winograd propose des formules alternatives qui nécessitent le même nombre de multiplications mais seulement 15 additions. En 2010, Marco Bodrato donne une nouvelle variante qui égale les 7 multiplications et 15 additions de l'algorithme de Winograd pour un produit quelconque tout en demandant moins d'opérations dans le cas particulier du calcul du carré d'une matrice.

Complexité

La multiplication matricielle « naïve » utilise

multiplications des éléments de l'anneau R. Les additions sont généralement ignorées dans le calcul de la complexité car elles sont beaucoup plus rapides que la multiplication, en particulier si la taille des entrées est supérieure à la taille du mot machine.

Avec l'algorithme de Strassen, le nombre de multiplications T(n) est réduit à

Cet exposant est obtenu comme la solution de l'équation par récurrence

La constante dans la complexité est de l'ordre de 50, ce qui fait que l'algorithme de Strassen n'est efficace que pour des matrices de grandes tailles. L'algorithme de Strassen est aussi peu efficace algorithmiquement sur les matrices avec peu de coefficients non-nuls (matrices creuses).

Référence

  1. Strassen, Volker, Gaussian Elimination is not Optimal, Numerische Mathematik, 13:354-356, 1969

Bibliographie

Liens externes