Algorithme de Strassen

Un article de Wikipédia, l'encyclopédie libre.
Aller à : navigation, rechercher

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(n^{2,807}), soit une meilleure complexité que la multiplication naïve (en O(n^3)) mais moins bonne que celle de l'algorithme de Coppersmith-Winograd (en O(n^{2,376})).

Importance du résultat[modifier | modifier le code]

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[modifier | modifier le code]

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 :

 
\mathbf{A} =
\begin{bmatrix}
\mathbf{A}_{1,1} & \mathbf{A}_{1,2} \\
\mathbf{A}_{2,1} & \mathbf{A}_{2,2}
\end{bmatrix}
\mbox { , }
\mathbf{B} =
\begin{bmatrix}
\mathbf{B}_{1,1} & \mathbf{B}_{1,2} \\
\mathbf{B}_{2,1} & \mathbf{B}_{2,2}
\end{bmatrix}
\mbox { , }
\mathbf{C} =
\begin{bmatrix}
\mathbf{C}_{1,1} & \mathbf{C}_{1,2} \\
\mathbf{C}_{2,1} & \mathbf{C}_{2,2}
\end{bmatrix}

\mathbf{A}_{i,j}, \mathbf{B}_{i,j}, \mathbf{C}_{i,j} \in F^{n/2}\times F^{n/2}.

On a alors

\mathbf{C}_{1,1} = \mathbf{A}_{1,1} \mathbf{B}_{1,1} + \mathbf{A}_{1,2} \mathbf{B}_{2,1}
\mathbf{C}_{1,2} = \mathbf{A}_{1,1} \mathbf{B}_{1,2} + \mathbf{A}_{1,2} \mathbf{B}_{2,2}
\mathbf{C}_{2,1} = \mathbf{A}_{2,1} \mathbf{B}_{1,1} + \mathbf{A}_{2,2} \mathbf{B}_{2,1}
\mathbf{C}_{2,2} = \mathbf{A}_{2,1} \mathbf{B}_{1,2} + \mathbf{A}_{2,2} \mathbf{B}_{2,2}

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 :

\mathbf{M}_{1} := (\mathbf{A}_{1,1} + \mathbf{A}_{2,2}) (\mathbf{B}_{1,1} + \mathbf{B}_{2,2})
\mathbf{M}_{2} := (\mathbf{A}_{2,1} + \mathbf{A}_{2,2}) \mathbf{B}_{1,1}
\mathbf{M}_{3} := \mathbf{A}_{1,1} (\mathbf{B}_{1,2} - \mathbf{B}_{2,2})
\mathbf{M}_{4} := \mathbf{A}_{2,2} (\mathbf{B}_{2,1} - \mathbf{B}_{1,1})
\mathbf{M}_{5} := (\mathbf{A}_{1,1} + \mathbf{A}_{1,2}) \mathbf{B}_{2,2}
\mathbf{M}_{6} := (\mathbf{A}_{2,1} - \mathbf{A}_{1,1}) (\mathbf{B}_{1,1} + \mathbf{B}_{1,2})
\mathbf{M}_{7} := (\mathbf{A}_{1,2} - \mathbf{A}_{2,2}) (\mathbf{B}_{2,1} + \mathbf{B}_{2,2})

Les Ci,j sont alors exprimées comme

\mathbf{C}_{1,1} = \mathbf{M}_{1} + \mathbf{M}_{4} - \mathbf{M}_{5} + \mathbf{M}_{7}
\mathbf{C}_{1,2} = \mathbf{M}_{3} + \mathbf{M}_{5}
\mathbf{C}_{2,1} = \mathbf{M}_{2} + \mathbf{M}_{4}
\mathbf{C}_{2,2} = \mathbf{M}_{1} - \mathbf{M}_{2} + \mathbf{M}_{3} + \mathbf{M}_{6}

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

Complexité[modifier | modifier le code]

La multiplication matricielle « naïve » utilise

n^3 = n^{\log_{2}8}

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 à

n^{\log_{2}7}\approx n^{2,807}.

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

T(n)=7T(n/2)+\Theta(n^2).

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[modifier | modifier le code]

  1. Strassen, Volker, Gaussian Elimination is not Optimal, Numerische Mathematik, 13:354-356, 1969
  2. 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.

Bibliographie[modifier | modifier le code]

Liens externes[modifier | modifier le code]