Multiplication rapide de matrices : Algorithme de Strassen Multiplication classique de polynômes Diviser pour régner Cours 4 : Matrices et polynômes Mario Valencia e-mail : [email protected] 21/02/2017 This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License. Algor Multiplication rapide de matrices : Algorithme de Strassen Multiplication classique de polynômes Algor Algorithme de Strassen : multiplication de matrices (1) • La méthode classique : Soient A et B deux matrices n × n. Le produit est une matrice C = AB de taille n × n : c c 11 21 • . . . cn c c 12 22 . . . 1 ... ... ... . . . ... c c 1n 2n . . . cnn a a = 11 21 a a . . . an 22 . . . 1 ... ... ... . . . ... a a 1n 2n . . . ann b b 11 21 . . . bn b b 12 22 . . . 1 ... ... ... . . . ... b b 1n 2n . . . bnn Les éléments de la matrice C se déterminent de la façon suivante : n cij = • 12 X k =1 aik bkj où i et j varient de 1 à n. Donc, pour calculer le produit de deux matrices n × n cela revient à faire n multiplications et n (n − 1) additions. 3 2 Multiplication rapide de matrices : Algorithme de Strassen Multiplication classique de polynômes Algor Algorithme de Strassen : multiplication de matrices (2) • Prenons le produit de matrices 2 × 2 : c c 11 21 • 12 a a = 22 11 21 a a 12 b b 22 b b 11 12 21 22 où, c = a b + a b ; c = a b + a b ; =a b +a b ; c =a b +a b . Cela nécessite 8 multiplications et 4 additions. L'idée de Volker Strassen est de trouver un moyen de multiplier les matrices A et B de taille 2 × 2 en utilisant seulement 7 multiplications au lieu de 8. c 21 • c c 11 11 21 11 11 12 22 21 21 22 12 11 21 12 12 12 22 22 22 Multiplication rapide de matrices : Algorithme de Strassen Multiplication classique de polynômes Algor Algorithme de Strassen : multiplication de matrices (3) • Multiplication de matrices 2 × 2 : p p p p p p p 1 2 3 4 5 6 7 = (a11 + a22 )(b11 + b22 ) = (a21 + a22 )(b11 ) = (a11 )(b12 − b22 ) = (a22 )(b21 − b11 ) = (a11 + a12 )(b22 ) = (a21 − a11 )(b11 + b12 ) = (a12 − a22 )(b21 + b22 ) et en remarquant que : c c 11 21 • = p1 + p4 − p5 + p7 = p2 + p4 c c 12 22 = p3 + p5 = p1 − p2 + p3 + p6 Cela donne 7 multiplications et 18 additions. Multiplication rapide de matrices : Algorithme de Strassen Multiplication classique de polynômes Algor Algorithme de Strassen : multiplication de matrices (4) • Diviser pour régner : multiplication de matrices N × N , avec N = 2k : l'algorithme récursif de Strassen recherche le produit C = AB de deux matrices carrées A et B de taille N , en divisant les trois matrices A, B et C en matrices par blocs de taille égale à N /2 , où Xij est la sous-matrice carrée de X (ici X dénote A, B ou C ) formée des N /2 premières (resp. dernières) lignes si i = 1 (resp. si i = 2) et des premières (resp. dernières) N /2 colonnes si j = 1 (resp. si j = 2). C C 11 21 C C 12 22 = A A 11 21 A A 12 22 B B × 11 21 B B 12 22 Multiplication rapide de matrices : Algorithme de Strassen Multiplication classique de polynômes Algor Algorithme de Strassen : multiplication de matrices (5) matrice [ N ][ N] strassen (A , B , { si (N == 1) return A*B; sinon { P1 = strassen ( A11 + A22 , P2 = strassen ( A21 + A22 , P3 = strassen ( A11 , B12 P4 = strassen ( A22 , B21 P5 = strassen ( A11 + A12 , P6 = strassen ( A21 - A11 , P7 = strassen ( A12 - A22 , C11 C12 C21 C22 } } = = = = P1 P3 P2 P1 + + + - return (C ); P4 - P5 + P7 ; P5 ; P4 ; P2 + P3 + P6 ; N) B11 + B22 , N /2); B11 , N /2); B22 , N /2); B11 , N /2); B22 , N /2); B11 + B12 , N /2); B21 + B22 , N /2); Multiplication rapide de matrices : Algorithme de Strassen Multiplication classique de polynômes Algor Algorithme de Strassen : complexité (6) • Soit T (N ) la complexité en temps de l'algorithme recursif de Strassen pour multiplier 2 matrices carrées de taille N = 2k . Donc, on a : T (1) = 1, T (N ) = 7T (N /2) + 18(N /2) = 7 T (N /2 ) + 18.7(N /2 ) + 18(N /2) = 7 T (N /2 ) + 18.7 (N /2 ) + 18.7(N /2 ) + 18(N /2) 2 2 3 3 2 2 3 2 2 2 2 2 2 2 = = = .. . i −1 18N 2 X 7 i i 7 T (N /2 ) + ( ( )k ) 4 O (N log2 4 k =0 7 ) ≈ O (N 2.81 ) Multiplication rapide de matrices : Algorithme de Strassen Multiplication classique de polynômes Multiplication classique de polynômes : Introduction • • Le produit de polynômes et d'entiers est une opération élémentaire, qui intervient dans un nombre impressionnant d'algorithmes de calcul formel. Exemples d'applications de la multiplication de polynômes : • • • • • Algorithmes de calcul de pgcd Algorithmes de factorisation en une ou plusieurs variables Algorithmes de composition de séries formelles Algorithmes d'évaluation multipoint et d'interpolation, etc. Certains problèmes, en cryptologie ou en théorie des nombres, nécessitent de manipuler des polynômes de degré de l'ordre de 100000, tailles auxquelles les algorithmes rapides sont indispensables. Algor Multiplication rapide de matrices : Algorithme de Strassen Multiplication classique de polynômes Introduction • • Dans ce cours, on s'intéresse a la complexité arithmétique de la multiplication de polynômes à une variable où les coecients appartient à un anneau commutatif et unitaire. Un anneau (A, +, x ) est un ensemble A muni de deux opérations : + et x , appelées usuellement "addition" et "multiplication" resp., vériant : • (A, +) est un groupe Abélien ; • la multiplication est associative, distributive par rapport à l'addition, et elle possède un élément neutre. • Si la multiplication est aussi commutative, alors (A, +, x ) est appelé un anneau commutatif. Ex. (Z, +, x ), (R, +, x ), etc. Algor Multiplication rapide de matrices : Algorithme de Strassen Multiplication classique de polynômes Multiplication de polynômes et multiplication d'entiers Considerons les deux exemples suivants : • Polynômes : Soient à multiplier 3X + 2X + 1 et 6X + 5X + 4 dans Z[X ]. 2 2 (3X 2 + 2X + 1) × (6X 2 + 5X + 4) = (3.6)X 4 + (3.5 + 2.6)X 3 + (3.4 + 2.5 + 1.6)X 2 + (2.4 + 1.5)X + (1.4) = 18X 4 + 27X 3 + 28X 2 + 13X + 4 • Nombres entiers : Soient a multiplier 321 et 654 en base 10. (3.102 + 2.10 + 1) × (6.102 + 5.10 + 4) = (3.6)104 + (3.5 + 2.6)103 + (3.4 + 2.5 + 1.6)102 + (2.4 + 1.5)10 + (1.4) = 18.104 + 27.103 + 28.102 + 13.10 + 4 = 2.105 + 9.103 + 9.102 + 3.10 + 4 = 209934. • Dans le deux cas, nous avons retranscrit l'algorithme naïf, et la suite de calculs est essentiellement la même, sauf que pour les entiers, il faut en outre gérer les retenues. Algor Multiplication rapide de matrices : Algorithme de Strassen Multiplication classique de polynômes Multiplication de polynômes : algorithme naïf (1) À partir d'ici, on travaillera avec des polynomes F et G à coecients dans un anneau A, ayant un degré au plus n − 1. Formellement, • F = f + f X + . . . + fn− X n− et G = g + g X + . . . + gn − X n − ; • le probleme est alors de calculer (les coecients de) 0 0 1 1 1 1 H = F .G 1 1 = h0 + h1 X + . . . + h2n−2 X 2n−2 . Algor Multiplication rapide de matrices : Algorithme de Strassen Multiplication classique de polynômes Multiplication de polynômes : algorithme naïf (2) • Ex. H = FG = (1 + 2X + 3X ) × (4 + 5X + 6X ) 2 = 4+ + X+ 8X + X 10X 12X 28X 5 6 + = 4+ • 2 2 + 2 + 2 + X 15X 27X 12 3 3 + 3 + X 18X 18 4 4 L'algorithme : H = FG • X+ 13 2 n −2 X 2 = i =0 hi X i avec hi X = j +k =i fj gk . Complexité : calculer les hi demande O (n ) opérations dans A. 2 Algor Multiplication rapide de matrices : Algorithme de Strassen Multiplication classique de polynômes Algorithme de Karatsuba (1) • • • Il est possible de gagner "une" multiplication pour le produit de polynômes de degré 1. Soient les polynomes F = f + f X et G = g + g X . Le produit H = FG s'écrit 0 H=f g 0 • • 0 1 0 1 + (f0 g1 + f1 g0 )X + f1 g1 X 2 . Eectuer les 4 produits f g , f g , f g , f g correspond à l'algo. naïf. Mais, Karatsuba a remarqué que le coecient de X s'écrit 0 fg 0 1 0 0 1 1 0 1 1 + f1 g0 = (f0 + f1 )(g0 + g1 ) − f0 g0 − f1 g1 . Cette écriture mène à un algorithme qui eectue 3 multiplications et 4 additions. Algor Multiplication rapide de matrices : Algorithme de Strassen Multiplication classique de polynômes Algorithme de Karatsuba (2) Cas général : On suppose que F et G sont de degré au plus n − 1, et que n = 2k (pour l'instant). On pose alors F = F (0) + F (1) X k , G = G (0) + G (1) X k , F ( ) , F ( ) , G ( ) , G ( ) ayant de degrés au plus k − 1. Le produit H = FG s'écrit 0 1 0 1 H = F ( ) G ( ) + (F ( ) G ( ) + F ( ) G ( ) )X k + F ( ) G ( ) X 0 0 0 1 1 0 1 1 k 2 Algor Multiplication rapide de matrices : Algorithme de Strassen Multiplication classique de polynômes Algorithme de Karatsuba (3) Supposons que n est une puissance de 2. L'algorithme est le suivant F , G de degré au plus n − 1, n puissance de 2. Sortie : H = FG . Si n = 1, renvoyer FG . Calculer A = F ( ) G ( ) et A = F ( ) G ( ) récursivement. Calculer A = F ( ) + F ( ) et A = G ( ) + G ( ) . Calculer A = A .A récursivement. Calculer A = A − A et A = A − A . Renvoyer A + A X + A X n . Entrée : 1. 2. 3. 4. 5. 6. 0 1 0 0 3 5 3 6 5 1 7 1 0 4 1 4 1 7 n 1 1 2 2 2 6 2 Algor Multiplication rapide de matrices : Algorithme de Strassen Multiplication classique de polynômes Algorithme de Karatsuba (4) Complexité : T (n) le nombre de multiplications dans A. • T (1) = 1. • T (n) = 3T (n/2) + 4n. • T (n) ≤ 9n . Donc, T (n) = O (n , ) log2 3 1 59 Algor