- Algorithme de Strassen
-
L’algorithme de Strassen est un algorithme calculant le produit de deux matrices carrées de taille n. Il est dû à Volker Strassen en 1969[1]. La complexité de l'algorithme est en O(n2,807), soit une meilleure complexité que la multiplication naïve (en O(n3)) mais moins bonne que celle de l'algorithme de Coppersmith-Winograd (en O(n2,376)).
Sommaire
Importance du résultat
L'algorithme de Strassen a été publié en 1969. Non seulement il améliore la complexité connue du produit matriciel mais il démontre de surcroît que la multiplication naïve et donc le pivot de Gauss ne sont pas optimaux. Le travail de Strassen a permis de développer un nouveau champ de la recherche en informatique théorique : le calcul rapide du produit matriciel.
Plusieurs résultats importants suivront : Shmuel Winograd publie un algorithme en 1980 qui utilise moins d'additions que celui de Strassen et surtout en 1987, Don Coppersmith et Winograd publient l'algorithme de Coppersmith-Winograd améliorant la complexité de la multiplication.
Description de l'algorithme
Soient A et B deux matrices carrées de taille n dont les entrées sont sur l'anneau 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 :
où
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 »[2].
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
- T(n) = 7T(n / 2) + Θ(n2).
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).
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érence
- Strassen, Volker, Gaussian Elimination is not Optimal, Numerische Mathematik, 13:354-356, 1969
- 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 relai pour calculer le produit des « petites matrices » obtenues.
- Thomas Cormen, Charles Leiserson, and Ronald Rivest. Introduction to Algorithms, Second Edition. MIT Press and McGraw-Hill, 1990. ISBN 0-07-013143-0. Chapter 31: Section 31.2: Strassen's algorithm for matrix multiplication, pp.739–745.
Liens externes
Wikimedia Foundation. 2010.