Diviser pour régner – Cours 4 : Matrices et polynômes

publicité
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
Téléchargement