l`algorithme de Strassen - Département d`Informatique de l`ENS

Transcription

l`algorithme de Strassen - Département d`Informatique de l`ENS
Algorithmique et Programmation
Projet : algorithme de Strassen pour la multiplication de matrices
Ecole normale supérieure
Département d’informatique
[email protected]
2011-2012
1
Algorithme de Strassen
Étant données deux matrices M de taille m × n et N de taille n × p, la méthode naı̈ve calcule
M × N en O (m × n × p) (coût cubique). L’algorithme récursif de Strassen (voir [?, §31.2]) est plus
malin. Supposons d’abord m, n, p pairs. Les matrices M et N sont coupées chacune en quatre blocs de
taille (m/2) × (n/2) et (n/2) × (p/2) :
M11 M12
N11 N12
M=
N=
M21 M22
N21 N22
On calcule ensuite récursivement les 7 sous-produits suivants :

X1 = (M11 + M22 ) × (N11 + N22 )




X2 = (M21 + M22 ) × N11




X
 3 = M11 × (N12 − N22 )
X4 = M22 × (N21 − N11 )


X

5 = (M11 + M12 ) × N22



X

6 = (M21 − M11 ) × (N11 + N12 )


X7 = (M12 − M22 ) × (N21 + N22 )
Pour obtenir le produit M × N , les sous-produits Xi sont composés de la manière suivante :

P11 = X1 + X4 − X5 + X7



P12 = X3 + X5
 P21 = X2 + X4


P22 = X1 − X2 + X3 + X6
On vérifie que l’on a bien :
M ×N =
P11
P21
P12
P22
car

P11



P12
 P21


P22
= M11 × N11 + M12 × N21
= M11 × N12 + M12 × N22
= M21 × N11 + M22 × N21
= M21 × N12 + M22 × N22
Dans le cas où m, n ou p est impair, on se ramène au cas pair en ajoutant une ligne ou une colonne
en bas ou à droite de M ou N (ou les deux). La récursivité s’arrête dès qu’une dimension est 1.
2
Parenthèsage optimal pour une séquence de multiplications
On veut maintenant multiplier n matrices M1 , . . . , Mn de taille différentes a1 × b1 , . . . , an × bn , mais
avec la contrainte que leur produit M = M1 × · · · × Mn est bien défini (c’est-à-dire 1 ≤ i < n =⇒ bi =
ai+1 ).
Pour se ramener à n−1 multiplication de deux matrices, il faut définir un parenthésage. L’associativité
de la multiplication garantit que tous les parenthésages donnent le même résultat. 1 Par contre, ils n’ont
pas tous le même coût. L’algorithme suivant (voir [?, §16.4]) trouve le coût optimal en O(n3 ) par une
méthode de programmation dynamique.
1. C’est vrai dans R, Z, mais aussi avec le type int qui calcule modulo 232 ou 264 . Par contre cela n’est pas vrai pour
les nombres à virgule flottante.
1
Pour mutliplier n matrices, on multiplie toujours les p premières et n − p dernières matrices (pour un
certain p) et ensuite on multiplie les deux matrices pour un coût qui dépend de la taille de ces matrices.
Trouver la valeur de p est simple si on connaı̂t déjà le coût pour multiplier n’importe quel suite de k < n
matrices (on prendre simplement le minimum parmis toutes les valeurs possibles de p).
Voici le pseudo-code exprimant cet algorithme. c[i, j] represente le (meilleur) coût pour multiplier
Mi Mi+1 ldotsMj .
pour i de 1 à n
c[i, i] = 0
fin pour
pour j de 1 à n − 1
pour i de 1 à n − j
c[i, i + j] = min { c[i, i + k] + c[i + k + 1, i + j] + t(ai , bi+k , bi+j ) | k ∈ [0, j − 1] }
fin pour
fin pour
retourner c[1, n]
La fonction auxiliaire t(m, n, p) (à déterminer !) calcule le coût de la multiplication d’une matrice
m × n par une matrice n × p. Au cours de l’algorithme, on maintient dans c[i, j], pour i ≤ j, le coût
optimal de Mi × · · · × Mj .
3
Travail demandé
Vous programmerez une fonction qui multiplie deux matrices de dimensions quelconques par la méthode de Strassen. Les coefficients seront de type int.
1. Implémenter l’algorithme cubique naı̈f qui calcule le produit de deux matrices de taille quelconque
donnés en entrée.
2. Implémenter l’algorithme de Strassen qui calcule le produit de deux matrices de taille quelconque
donnés en entrée.
3. Implémenter un algorithme qui calcule le nombre de multiplication, d’addition et de soustraction
d’entiers que fait l’algorithme de Strassen sur deux matrices dont la taille est donné en entrée.
4. Implémenter un algorithme qui calcule le produit d’un nombre variable de matrices en entrée en
les multipliant de gauche à droite (et en utilisant l’algorithme de Strassen pour la multiplication
de deux matrices).
5. Implémenter un algorithme qui calcule un parenthèsage optimale et le nombre d’opérations estimés.
6. Implémenter un algorithme qui calcule le produit d’un nombre variable de matrices en entrée
utilisant le parenthèsage optimale.
7. Comparer le temps de calcul de l’algorithme cubique et l’algorithme de Strassen pour multipler
deux matrices. Comparer le temps de calcul de l’algorithme cubique gauche à droite et l’algorithme
de parenthèsage optimale pour multipler plusieurs matrices. Comparer le temps de calcul de l’algorithme de Strassen et le nombre d’opération qu’il fait. Aussi verifier bien sûr que les résultats sont
les mêmes sur les mêmes entrées !
2

Documents pareils