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