Matrices are mathematical structures of great value to many knowledge areas, being Computing Science one. Among the possible operations on matrices highlight the multiplication, both for its applicability as the high asymptotic complexity involved in the process. The high coeficient of complexity observed in the traditional method served as motivation for many researchers, as Volker Strassen, Don Coppersmith and Shmuel Winograd, embark on the search for more efficient means of resolution. In view of the importance and problems involved in calculating the matrix product, this article provides a brief description on the topic, highlighting the major developed methods, characteristics and constraints.
O uso de tecnologias de big data na concepção e execução de estratégias de en...
Multiplicação de matrizes
1. Multiplicação de Matrizes
Do O(n3
) ao O(n2
)
Diego Antonio Lusa 1
Resumo: As matrizes são estruturas matemáticas de grande valia para diversas áreas do conheci-
mento, sendo a Ciência da Computação uma delas. Dentre as operações aplicáveis sobre matrizes
destaca-se a multiplicação, tanto pela sua aplicabilidade quanto pela elevada complexidade assin-
tótica envolvida no processo. O alto coeficiente de complexidade observado no método tradicional
serviu de motivação para diversos pesquisadores, como Volker Strassen, Shmuel Winograd e Don
Coppersmith, enveredarem-se na busca por meios mais eficientes de resolução. Em vista da impor-
tância e problemática envolvida no cálculo do produto de matrizes, o presente artigo traz uma breve
descrição acerca do tema, ressaltando os principais métodos desenvolvidos, suas características e
restrições.
Palavras-chave: Matrizes. Multiplicação. Complexidade
Abstract: Matrices are mathematical structures of great value to many knowledge areas, being
Computing Science one. Among the possible operations on matrices highlight the multiplication,
both for its applicability as the high asymptotic complexity involved in the process. The high coef-
ficient of complexity observed in the traditional method served as motivation for many researchers,
as Volker Strassen, Don Coppersmith and Shmuel Winograd, embark on the search for more efficient
means of resolution. In view of the importance and problems involved in calculating the matrix pro-
duct, this article provides a brief description on the topic, highlighting the major developed methods,
characteristics and constraints.
Keywords: Matrices. Multiplication. Complexity
1 Introdução
A representação de dados na forma de matrizes é algo comum para diversas áreas do conhecimento. Em
especial, a Computação e a Matemática fazem uso intenso destas construções e operações relacionadas para reso-
lução de problemas. Mesmo problemas que originalmente não apresentam uma construção matricial podem ser
resolvidos por meio de matrizes. É o caso, por exemplo, dos sistemas de equações lineares.
Dentre as operações aplicáveis sobre matrizes, a de multiplicação tem especial destaque para a Computação,
sendo considerada uma das operações fundamentais da área. Contudo, além de apresentar-se como uma operação
essencial para a computação simbólica e numérica, a multiplicação de matrizes representa um grande desafio
computacional em termos de complexidade assintótica.
A abordagem tradicional para o cálculo do produto entre matrizes possui complexidade assintótica igual
a O(n3
), um expoente consideravelmente elevado e que implica um grande esforço computacional para efetuar
a operação em matrizes de maior tamanho. Considerando-se a grande aplicabilidade do produto de matrizes,
percebe-se que a elevada complexidade tende a impor severas restrições na resolução de determinados problemas
de maior ordem.
Na tentativa de reduzir o coeficiente de complexidade envolvido no cálculo do produto entre matrizes, di-
versos pesquisadores desenvolveram métodos eficientes de resolução, alternativos ao método tradicional. Alguns
destes trabalhos obtiveram resultados expressivos, alcançado coeficientes de complexidade próximos ao ideal teó-
rico O(n2
). Neste cenário, destacam-se os trabalhos desenvolvidos por Volker Strassen, Shmuel Winograd e Don
Coppersmith.
1Mestrado em Computação Aplicada, UPF, Campus 1 - BR 285 - Passo Fundo (RS) - Brasil
{83473@upf.br}
Revista Brasileira de Computação Aplicada (ISSN 2176-6649), Passo Fundo, v. 5, n. 2, p. xx-xx, jul. 2014 1
2. O presente artigo apresenta uma breve descrição acerca do problema da multiplicação entre matrizes, des-
crevendo os principais aspectos teóricos envolvidos e trabalhos de destaque na busca por métodos de resolução
mais eficientes. Para tal, a Seção 2 apresenta importantes conceitos matemáticos relacionados às matrizes e suas
operações. Na Seção 3, a importância do cálculo do produto entre matrizes e os principais trabalhos relacionados a
métodos de maior eficiência são abordados. Por fim, na Seção 4 traz algumas considerações a respeito dos assuntos
abordados.
2 Matrizes
Uma matriz é um arranjo retangular composto por m linhas e n colunas . Cada elemento que a compõe é
identificado em termos da linha e coluna a qual pertence [1, 2]. Desta forma, dada uma matriz Mm×n qualquer,
onde m = 3 e n = 4, a representação de cada um dos elementos mij é expressa conforme descrito em (1).
M3×4 =
m11 m12 m13 m14
m21 m22 m23 m24
m31 m32 m33 m34
(1)
Quando o número de colunas m for igual ao números de linhas n, a matriz é dita quadrada de ordem n. As
matrizes quadradas têm importantes propriedades, dentre as quais merecem especial destaque a presença de uma
diagonal principal e de uma diagonal secundária. Os elementos que compõem a diagonal principal de uma matriz
M são todos aqueles cujos índices de linha e coluna são iguais ( mij, onde i = j) [3]. Já a diagonal secundária
é definida como todo elemento mij onde i + j = n + 1. A matriz M3 descrita em (2) é um exemplo de matriz
quadrada de ordem 3.
M3 =
12 30 40
13 15 48
14 50 22
(2)
Na matriz M3 (2), a diagonal principal é composta pelos elementos p = {12, 15, 22}. Já a diagonal secun-
dária é definida pelos elementos s = {40, 15, 14}. Desconsiderando-se os elementos não pertencentes a nenhuma
das diagonais, pode-se observar a matriz M3 somente em termos de sua diagonal principal (p) e secundária (s),
conforme apresentado em (3).
Mp =
12 . . . . . .
. . . 15 . . .
. . . . . . 22
Ms =
. . . . . . 40
. . . 15 . . .
14 . . . . . .
(3)
A matriz identidade é um tipo especial de matriz quadrada, caracterizada pela presença de valores 1 em
todos os elementos que compõem a diagonal principal. Por sua vez, todos os demais elementos da matriz identidade
contém valores iguais a zero. A matriz I3×3 (4) é um exemplo de matriz identidade de ordem 3. A principal função
de uma matriz identidade é servir de elemento neutro nas operações de multiplicação [3].
I3 =
1 0 0
0 1 0
0 0 1
(4)
Em termos computacionais, as matrizes são representadas com uso de tipos estruturados de dados, os quais
permitem agregar em uma mesma variável diversos valores com relação estrutural entre si. Os tipos de dados
estruturados são abstraídos pelas linguagens de programação na forma de arranjos e registros. Em vista dos arranjos
caracterizam-se pela presença de elementos do mesmo tipo em todas as posições, eles são as estruturas comumente
utilizadas para representar as matrizes [4].
Revista Brasileira de Computação Aplicada (ISSN 2176-6649), Passo Fundo, v. 5, n. 2, p. xx-xx, jul. 2014 2
3. Desta forma, quando transposta para uma linguagem computacional, uma matriz é expressa como um ar-
ranjo bidimensional, onde os elementos são identificados em relação à posição que ocupam nas dimensões consi-
deradas. O pseudocódigo descrito na sequência apresenta um algoritmo genérico simples, que declara uma matriz
A, quadrada e de ordem 2 (linha 1) e atribui à posição (1, 2) o valor 3 (linha 2). Os índices (1, 2) utilizados na
atribuição podem ser interpretados tanto como (linha, coluna) quanto (coluna, linha), dependendo unicamente
da convenção utilizada.
1. define A[2][2];
2. A[1][2] = 3;
2.1 Operações envolvendo matrizes
Os elementos de uma matriz pertencem a algum sistema numérico, como reais, inteiros ou complexos, por
exemplo. Em vista disso, torna-se possível aplicar operações como soma, subtração e multiplicação em matri-
zes [2]. Dentre as operações aritméticas possíveis envolvendo matrizes, a multiplicação e a soma entre matrizes
merecem especial destaque.
Conceitualmente, para que duas matrizes possam ser multiplicadas é necessário que o número de colunas
da primeira seja igual ao número de linhas da segunda [3]. Desta forma, Ma×b ×Nc×d só é possível quando b = c.
Logo, a matriz resultante do produto de Ma×b × Nc×d é uma matriz Pa×d.
Os elementos pij da matriz Pa×d resultante são obtidos pela soma do produto de cada um dos elementos da
i−ésima linha de M pelo elemento correspondente da j−ésima coluna de N. Assim, a equação matemática que
define a multiplicação entre duas matrizes é expressa como pij =
a
k=1
mik × nkj.
Considerando-se as matrizes M2×2 e N2×3 abaixo definidas, o produto de P = M × N é obtido conforme
segue:
(I) M2×2 =
1 2
3 4
(II) N2×3 =
5 6 7
8 9 10
(III) P2×3 = M2×2 × N2×3 =
1 × 5 + 2 × 8 1 × 6 + 2 × 9 1 × 7 + 2 × 10
3 × 5 + 4 × 8 3 × 6 + 4 × 9 3 × 7 + 4 × 10
(IV) P2×3 =
21 24 27
47 54 61
A multiplicação entre matrizes não é comutativa, ou seja, o produto de A × B é diferente de B × A. Já no
que diz respeito à associatividade, o resultado de A×B ×C é idêntico ao resultado de A×(B × C). Com relação
ao elemento neutro, a multiplicação de uma matriz quadrada A pela matriz identidade I resulta na própria matriz
A. Em vista disso, o elemento neutro do cálculo do produto entre matrizes é uma matriz identidade [1].
A adição é outra operação relevante no contexto das matrizes. Assim como ocorre na multiplicação, deve-se
observar o tamanho das matrizes envolvidas para realizar a operação. Duas matrizes somente podem ser somadas
entre si quando ambas apresentam o mesmo tamanho, ou seja, mesmo número de linhas e de colunas. A matriz
resultante da operação de adição terá os mesmo tamanho que as matrizes originais [3].
Considerando-se duas matrizes quaisquer A e B, ambas com mesmo número de linhas e colunas, a operação
de adição C = A + B é realizada somando-se cada elemento da primeira matriz A pelo elemento correspondente
da segunda matriz B. Assim, cada elemento da matriz resultante C pode ser expresso pela equação cij = aij +bij.
Supondo-se que as matrizes A e B sejam matrizes quadradas de ordem 2, definidas conforme segue, a
adição C = A + B é obtida por:
Revista Brasileira de Computação Aplicada (ISSN 2176-6649), Passo Fundo, v. 5, n. 2, p. xx-xx, jul. 2014 3
4. (I) A2×2 =
1 2
3 4
(II) B2×2 =
5 −6
−8 9
(III) C2×2 = A2×2 + B2×2 =
1 + 5 2 − 6
3 − 8 4 + 9
(IV) C2×2 =
6 −4
−5 13
3 Multiplicação de matrizes e a Computação
A multiplicação de matrizes é uma das operações mais básicas para a computação numérica e simbólica
[5, 7]. Seu uso está ligado à resolução de diversos outros problemas de álgebra linear, computação polinomial,
fatoração polinomial, solução de sistemas polinomiais, transformações geométricas, entre outros [7].
A despeito do seu amplo uso, o cálculo do produto entre matrizes é uma operação que apresenta elevada
complexidade assintótica. Por muito tempo permaneceu a crença de que o algoritmo ótimo para multiplicação
de matrizes teria complexidade O(n3
) e soluções com valores abaixo disso não seriam possíveis. Contudo, essa
barreira foi quebrada quando Volker Strassen provou ser possível multiplicar duas matrizes quadradas com uma
quantidade menor de operações de multiplicação, fazendo uso de uma abordagem de divisão e conquista durante o
processo.
A partir do trabalho de Strassen, outros métodos foram desenvolvidos e permitiram alcançar coeficientes
de complexidade ainda menores, mais próximos da meta teórica O(n2
) [5]. Em sua maioria, os métodos de
otimização do cálculo do produto de matrizes visam eliminar o máximo possível a quantidade de multiplicações
necessárias, substituindo-as por operações de soma ou subtração sempre que possível.
A seguir, os principais algoritmos (ou métodos) de resolução do produto entre matrizes são apresentados
em maiores detalhes.
3.1 Método Tradicional
O algoritmo tradicional para produto de matrizes n×n tem complexidade assintótica igual a O(n3
), execu-
tando (n3
) multiplicações e n2
(n − 1) adições [2]. Até o final da década de 1960, este algoritmo era considerado
ótimo e havia a crença de que a complexidade O(n3
) não poderia ser reduzida [5].
O procedimento tradicional consiste basicamente de três laços aninhados i, j e k. O laço mas externo i
itera sobre as linhas (linha 4), o laço j itera sobre as colunas (linha 5) e o laço mais interno k efetua o somatório
gerando o valor de cada elemento da matriz resultante (linha 6).
O pseudocódigo abaixo apresenta o procedimento tradicional de produto de matrizes.
1. define A[2][2];
2. define B[2][3];
3. define C[2][3];
4. para cada i de 1 a 2 faça:
5. para cada j de 1 a 3 faça:
6. para cada k de 1 a 2 faça:
7. C[i][j] = C[i][j] + A[i][k]*B[k][j];
8. fim para;
9. fim para;
10. fim para;
Revista Brasileira de Computação Aplicada (ISSN 2176-6649), Passo Fundo, v. 5, n. 2, p. xx-xx, jul. 2014 4
5. 3.2 Método de Strassen
O método de Strassen foi desenvolvido pelo matemático alemão Volker Strassen em 1969. Diferentemente
do algoritmo tradicional, a versão de Strassen apresenta complexidade assintótica relativamente menor, alcançando
o valor de O(nlog 7
) no produto de duas matrizes quadradas de ordem n. Ao todo, o método desenvolvido por
Strassen requer 7 n
2
3
multiplicações e (11n − 4) × n2
4 somas/subtrações [11].
O princípio utilizado por Strassen na construção do algoritmo foi o método da divisão e conquista, tendo
por principal meta reduzir o número de multiplicações necessárias durante o processo. Com isso, Strassen provou
ser possível multiplicar duas matrizes quadradas de ordem 2 utilizando 7 multiplicações e 18 somas ou subtrações
[6]. Pelo algoritmo tradicional, a mesma operação faria uso de 8 multiplicações e 4 somas.
Uma restrição importante do algoritmo de Strassen refere-se à ordem das matrizes. Somente pode-se aplicar
este método quando a ordem for uma potência de 2 (21
, 22
, ..., 2n
). Em termos práticos, essa restrição pode
ser facilmente tratada adicionando-se linhas ou colunas com elementos de valor 0 até ser alcançada a ordem
imediatamente posterior que seja uma potência de 2.
Supondo-se o cálculo do produto entre duas matrizes quadradas A e B de ordem 2, e uma terceira matriz C
de mesma ordem resultante do produto A × B, definidas por
C
c11 c12
c21 c22
= A
a11 a12
a21 a22
× B
b11 b12
b21 b22
é possível definir cada um dos elementos resultantes cij nos seguintes termos [6]:
(I) c11 = ((a11 × b11) + (a12 × b21))
(II) c12 = ((a11 × b21) + (a12 × b22))
(III) c21 = ((a21 × b11) + (a22 × b21))
(IV) c22 = ((a21 × b12) + (a22 × b22))
As quatro equações acima representam uma abordagem de divisão e conquista para resolução da multipli-
cação de matrizes. Contudo, conforme apresentam-se, tais equações não oferecem qualquer melhoria em termos
de complexidade assintótica, uma vez que continuam sendo necessárias 8 multiplicações para alcançar o resultado.
Em vista disso, ao construir seu método, Strassen preocupou-se em buscar um conjunto tal de equações que
minimizasse o número de multiplicações envolvidas. Como resultado, ele chegou a um conjunto de sete equações
envolvendo submatrizes [5]. Além de reduzir o número de operações de multiplicações necessárias, as equações
definidas por Strassen realizam a divisão do problema em partes menores, mantendo a abordagem de divisão e
conquista como estratégia de resolução. As equações desenvolvidas estão descritas na sequência.
(I) P1 = (A11 + A22) × (B11 + B22)
(II) P2 = (A21 + A22) × B11
(III) P3 = A11 × (B12 − B22)
(IV) P4 = A22 × (B21 − B11)
(V) P5 = (A11 + A12) × B22
(VI) P6 = (A21 − A11) × (B11 + B12)
(VII) P7 = (A12 − A22) × (B21 + B22)
Revista Brasileira de Computação Aplicada (ISSN 2176-6649), Passo Fundo, v. 5, n. 2, p. xx-xx, jul. 2014 5
6. A última etapa do método de Strassen representa o momento da conquista, ou seja, a etapa em que os sete
resultados parciais obtidos pelas equações definidas anteriormente são unidos para obtenção do resultado final.
Para tal, cada um dos elementos resultantes cij é expresso nos termos das quatro equações descritas a seguir.
(I) C11 = P1 + P4 − P5 + P7
(II) C12 = P3 + P5
(III) C21 = P2 + P4
(IV) C22 = P1 + P3 − P2 + P6
Considerando-se as matrizes A3
1 2 3
4 5 6
7 8 9
e B3
1 4 7
2 5 8
3 6 9
, o produto A × B utilizando o método
de Strassen é obtido por meio das seguintes etapas:
(I) Certificar-se que a ordem das matrizes é uma potência de 2. Caso não seja, deve-se acrescentar linhas e
colunas com elementos 0 até que a condição seja satisfeita. No caso do produto A3 × B3 será necessário
acrescentar uma linha e uma coluna em cada uma das matrizes.
A4
1 2 3 0
4 5 6 0
7 8 9 0
0 0 0 0
B4
1 4 7 0
2 5 8 0
3 6 9 0
0 0 0 0
(II) Dividir a ordem de ambas as matrizes por dois. Como resultado, serão criadas quatro submatrizes de cada
uma das matrizes originais.
A11
1 2
4 5
A12
3 0
6 0
A21
7 8
0 0
A22
9 0
0 0
B11
1 4
2 5
B12
7 0
8 0
B21
3 6
0 0
B22
9 0
0 0
(III) Com base nas submatrizes, calcula-se P1 = (A11 + A22) × (B11 + B22).
P1 =
1 2
4 5
+
9 0
0 0
×
1 4
2 5
+
9 0
0 0
→
104 50
50 41
(IV) Com base nas submatrizes, calcula-se P2 = (A21 + A22) × B11.
P2 =
7 8
0 0
+
9 0
0 0
×
1 4
2 5
→
32 104
0 0
(V) Com base nas submatrizes, calcula-se P3 = A11 × (B12 − B22).
P3 =
7 8
0 0
+
9 0
0 0
×
1 4
2 5
→
32 104
0 0
(VI) Com base nas submatrizes, calcula-se P4 = A22 × (B21 − B11).
P4 =
1 2
4 5
×
7 0
8 0
−
9 0
0 0
→
14 0
32 0
Revista Brasileira de Computação Aplicada (ISSN 2176-6649), Passo Fundo, v. 5, n. 2, p. xx-xx, jul. 2014 6
8. 3.3 Método de Winograd
Em 1987, Shmuel Winograd desenvolveu um método para resolução do produto de matrizes que realizava
três somas a menos que o algoritmo de Strassen, trazendo uma pequena contribuição no tempo de execução total do
algoritmo [11]. Em termos de complexidade assintótica, contudo, a variante de Winograd não reduziu o coeficiente
de complexidade obtido por Strassen. Ao todo, a variante criada por Winograd requer 7 n
2
3
multiplicações e
19n3
8 − n2
somas/subtrações [11].
Se comparado ao método desenvolvido por Strassen, a abordagem de Winograd requer um número maior
de passos para realizar o cálculo do produto entre duas matrizes quadradas. No total, são necessárias 22 equações
para se chegar ao resultado final [11].
O cálculo do produto entre duas matrizes quadradas, expresso por
C
c11 c12
c21 c22
= A
a11 a12
a21 a22
× B
b11 b12
b21 b22
,
utilizando o método desenvolvido por Winograd na resolução, requer a execução dos passos descritos na sequência
[10]. No que diz respeito à ordem das matrizes a serem multiplicadas, as mesmas regras aplicadas ao método de
Strassen também são aplicáveis no método de Winograd.
(I) S1 = A21 + A22
(II) S2 = S1 − A11
(III) S3 = A11 − A21
(IV) S4 = A12 − S2
(V) T1 = B12 − B11
(VI) T2 = B22 − T1
(VII) T3 = B22 − B12
(VIII) T4 = B21 − T2
(IX) P1 = A11 × B11
(X) P2 = A12 × B21
(XI) P3 = S1 × T1
(XII) P4 = S2 × T2
(XIII) P5 = S3 × T3
(XIV) P6 = S4 × B22
(XV) P7 = A22 × T4
(XVI) U1 = P1 + P2
(XVII) U2 = P1 + P4
(XVIII) U3 = U2 + P5
(XIX) U4 = U3 + P7
(XX) U5 = U3 + P3
(XXI) U6 = U2 + P3
(XXII) U7 = U6 + P6
(XXIII) C11 = U1
(XXIV) C12 = U7
(XXV) C21 = U4
(XXVI) C22 = U5
3.4 Método Coppersmith-Winograd
O algoritmo Coppersmith-Winograd (CW) foi criado pelos americanos Don Coppersmith e Shmuel Wi-
nograd em 1987 [8]. Utilizando como base conceitual os trabalhos antecessores, Coppersmith e Winograd cons-
truíram um algoritmo que alcançou complexidade assintótica O(n2.376
), sendo o primeiro algoritmo na história a
atingir coeficiente de complexidade inferior a 2.5 [5, 9].
Por mais de duas décadas, o algoritmo CW permaneceu com o título do mais eficiente algoritmo conhecido
para o cálculo do produto entre matrizes. Contudo, sua contribuição foi muito mais teórica do que prática, visto
que não é aplicável para problemas de tamanho comum [9].
3.5 Evolução dos métodos e considerações
A abordagem desenvolvida por Strassen abriu caminho para o desenvolvimento de vários outros métodos.
Além dos trabalhos mais conhecidos, como os de Strassen, Coppersmith e Winograd, outros pesquisadores tiveram
importante colaboração na busca por um expoente de complexidade cada vez mais próximo do ideal teórico O(n2
)
para o problema do produto de matrizes.
Revista Brasileira de Computação Aplicada (ISSN 2176-6649), Passo Fundo, v. 5, n. 2, p. xx-xx, jul. 2014 8
9. Na Tabela 1 apresentam-se os principais marcos das pesquisas por métodos de menor complexidade para
multiplicação de matrizes [7, 5]. Uma importante e recente contribuição ocorreu em 2012, quando Virginia Vas-
sileska Williams, em seu artigo intitulado “Multiplying matrices faster than Coppersmith-Winograd”, provou ter
desenvolvido uma abordagem para multiplicação de matrizes com complexidade assintótica O(n2.3729
), alcan-
çando um expoente de complexidade inferior ao método CW. Por meio do seu método, Williams quebrou um
período de mais de 20 anos de hegemonia do método CW como o mais eficiente algoritmo conhecido para o
cálculo do produto entre matrizes.
Tabela 1: Evolução dos coeficientes de complexidade para o problema do cálculo do produto entre matrizes
Ano Autor(es) Complexidade
1969 Strassen log2 8 ≈ 2.807
1979 Bini, Capovani, Romani e Lotti’s 3 log12 10 ≈ 2.779
1981 Schönhage log6 5 ≈ 2.694
1986 Strassen (laser method) 2.48
1989 Coppersmith e Winograd 2.376
2012 Virginia Vassilevska Williams 2.3729
Apesar da considerável redução no expoente de complexidade obtida pelos métodos não-tradicionais, a
abordagem tradicional continua ainda sendo amplamente utilizada. Se considerado o método desenvolvido por
Strassen, por exemplo, os seguintes fatores não o tornam uma boa escolha para todos os casos [2]:
• O fator oculto no tempo de execução do método de Strassen é maior do que o fator constante encontrado no
método tradicional.
• Quando as matrizes são esparsas (com grande quantidade de elementos iguais a zero), os métodos específicos
para este tipo de matriz são os mais adequados.
• O método de Strassen é numericamente mais instável que o método tradicional devido a maior probabilidade
de erros de arredondamento.
• As submatrizes necessárias nos passos intermediários do método de Strassen consomem espaço.
As considerações feitas para o método de Strassen aplicam-se também à variante criada por Winograd, visto
que ambos compartilham a mesma construção matemática. Quanto aos demais métodos desenvolvidos a partir do
trabalho de Strassen, percebe-se muito mais contribuições teóricas do que práticas em seu uso. O método de
Coppersmith-Winograd, por exemplo, é mais eficiente que o método de Strassen quando as matrizes consideradas
apresentam tamanho absurdamente grande, na casa de milhares de bilhões, em razão do elevado valor da constante
oculta de complexidade [7].
Considerando-se unicamente o número de somas e multiplicações realizadas pelos métodos tradicional, de
Strassen e de Winograd para matrizes com ordem variando de 21
a 28
, o total de operações necessárias para a
multiplicação de matrizes em cada um dos casos é apresentado na Tabela 2. Pelos números obtidos fica claro que
a medida que o tamanho da matriz cresce, a diferença no número de multiplicações necessárias entre a abordagem
tradicional e as demais se acentua. De modo inverso, a quantidade de operações de soma no método tradicional é
sempre consideravelmente menor que a quantidade necessária nos demais.
Revista Brasileira de Computação Aplicada (ISSN 2176-6649), Passo Fundo, v. 5, n. 2, p. xx-xx, jul. 2014 9
10. Tabela 2: Comparação entre os métodos em relação ao número de operações de somas e multiplicações
necessárias.
Tam. (n) Tradicional Strassen Winograd
Multiplicações Somas Multiplicações Somas Multiplicações Somas
2 8 4 7 18 7 15
4 64 48 56 160 56 136
8 512 448 448 1.344 448 1.152
16 4.096 3.840 3.584 11.008 3.584 9.472
32 32.768 31.744 28.672 89.088 28.672 76.800
64 262.144 258.048 229.376 716.800 229.376 618.496
128 2.097.152 2.080.768 1.835.008 5.750.784 1.835.008 4.964.352
256 16.777.216 16.711.680 14.680.064 46.071.808 14.680.064 39.780.352
4 Considerações Finais
O cálculo do produto entre matrizes é umas das operações mais básicas tanto para a matemática quanto para
a computação. Em vista da sua importância, bem como da sua complexidade computacional inerente, a busca por
melhores métodos de resolução têm sido o desafio de muitos estudiosos da área desde a década de 1960.
No caminho que entremeia a maior complexidade O(n3
) e a complexidade ideal O(n2
), destaca-se o traba-
lho do matemático Volker Strassen, em 1969. Além de ser o primeiro a provar a existência de uma abordagem mais
eficiente que a tradicional, Strassen criou um arcabouço teórico amplamente utilizado em pesquisas posteriores.
Em 1987, cerca de 18 anos após a descoberta de Strassen, os americanos Don Coppersmith e Shmuel
Winograd desenvolveram o método que viria a ser o mais eficiente conhecido para o cálculo do produto entre
matrizes por mais de duas décadas. Esta marca veio a ser superada somente em 2012, com o trabalho publicado
por Virginia Vassileska Williams, intitulado “Multiplying matrices faster than coppersmith-winograd”.
Percebe-se tanto no trabalho de Strassen quanto nos demais certas características em comum. Uma delas é a
decomposição das matrizes a serem multiplicadas em blocos menores. Por meio destes blocos busca-se reduzir ao
máximo o número de operações de multiplicação necessária, substituindo-as sempre que possível por operações de
soma e substração. Como operações de soma e subtração tem menor complexidade que operações de multiplicação,
a troca de uma pela outra permite reduzir a complexidade final do problema. Em vista da divisão em blocos
menores e posterior obtenção dos resultados por meio da junção dos resultados parciais, observa-se que boa parte
dos métodos eficientes para multiplicação de matrizes fazem uso da técnica de divisão e conquista.
Assim como ocorre na resolução de outros problemas, o método mais adequado para o cálculo do pro-
duto entre matrizes depende do contexto. Desconsiderando-se aqueles de cunho mais teórico, como o método
Coppersmith-Winograd, por exemplo, a escolha pelo melhor método deve levar em consideração, principalmente,
o tamanho das matrizes a serem multiplicadas. A aplicação do método de Strassen em matrizes muito pequenas,
por exemplo, talvez não seja mais adequada, visto que o método tradicional de resolução seria de boa medida.
Neste sentido, a principal questão está em dimensionar numericamente a percepção empírica do que é “pequeno”
e “grande” para facilitar a escolha por um ou outro método.
Embora tenham havido grandes avanços na construção de abordagens para multiplicação de matrizes mais
eficientes, o método tradicional continua sendo uma ótima escolha, não devendo ser desprezado ou desconsiderado
somente pela sua maior complexidade. É preciso levar em consideração que, comparado aos demais, o método
tradicional é de simples implementação e extremamente econômico no uso de espaço em memória, visto que não
faz uso de variáveis temporárias.
Revista Brasileira de Computação Aplicada (ISSN 2176-6649), Passo Fundo, v. 5, n. 2, p. xx-xx, jul. 2014 10
11. Referências
[1] Encyclopedia of Mathmatics (online). Disponível em: <http://www.encyclopediaofmath.org/index.php?title=
Matrix&oldid=30641>. Acesso em: 24 abr. 2014.
[2] CORMEN, T. H. et al. Algoritmos: Teoria e Prática. Rio de Janeiro: Editora Campus Ltda, 2002.
[3] SANTOS, R. J. et al. Matrizes, Vetores e Geometria Analítica. Belo Horizonte. Imprensa Universitária da
Universidade Federal de Minas Gerais, 2012.
[4] EDELWEISS, N. Estruturas de Dados. Bookman, 2011.
[5] WILLIAMS, V. V. Multiplying matrices faster than Coppersmith-Winograd. Proceedings of the 44th sympo-
sium on Theory of Computing - STOC ’12, ACM Press, 2012.
[6] Design and Analysis of Algorithms: Lecture 12. Ohio University. Disponível em: <http://oucsace.cs.ohiou.
edu/~razvan/courses/cs4040/lecture12.pdf>. Acesso em: 3 jun. 2014.
[7] ISLAM, N. Optimization Techniques For Matrix Multiplication. Dissertação (Mestrado em Ciência da Com-
putação) — University of Western Ontario, Ontario, 2009.
[8] ROBINSON, S. Toward an optimal algorithm for matrix multiplication. Disponível em: <http://www.siam.
org/pdf/news/174.pdf>. Acesso em: 14 jun. 2014.
[9] P. D. Alberto. Adaptive Winograd’s Matrix Multiplications. ACM Transactions on Mathematical Software,
vol. V, 2009.
[10] WANG, K. Linear Algebra System, 2007. Disponível em: <http://www.cs.bath.ac.uk/~mdv/courses/
CM30082/projects.bho/2006-7/Wang-K-dissertation-2006-7.pdf>. Acesso em: 14 jun. 2014.
[11] MARQUEZAN et al. Análise de Complexidade e Desempenho de Algoritmos para Multiplicação de Matri-
zes. Escola Regional de Alto Desempenho – ERAD. São Leopoldo, RS, Brasil. 2002.
Revista Brasileira de Computação Aplicada (ISSN 2176-6649), Passo Fundo, v. 5, n. 2, p. xx-xx, jul. 2014 11