Strassen Matrix DAA
Strassen Matrix DAA
a0 b0 = a0 b 0
A11 B22 -A12 B22 + A12 B21 + A12 B22 – A22 B21 – A22 B22
= A11 B11 + A12 B21
void matmul(int *A, int *B, int *R, int n) {
if (n == 1) {
(*R) += (*A) * (*B);
} else {
matmul(A, B, R, n/4);
matmul(A, B+(n/4), R+(n/4), n/4);
matmul(A+2*(n/4), B, R+2*(n/4), n/4);
matmul(A+2*(n/4), B+(n/4), R+3*(n/4), n/4);
matmul(A+(n/4), B+2*(n/4), R, n/4);
matmul(A+(n/4), B+3*(n/4), R+(n/4), n/4);
matmul(A+3*(n/4), B+2*(n/4), R+2*(n/4), n/4);
matmul(A+3*(n/4), B+3*(n/4), R+3*(n/4), n/4);
}
Divide matrices in
sub-matrices and
recursively multiply
sub-matrices
Inventor Year Complexity
Classical ― Θ (nᶺ3)
Volker Strassen 1968 Θ (nᶺ2.807)
Victor Pan
( multiply two 70 × 70 matrices using
143,640 multiplications )
1978 Θ (nᶺ2.795)
Don Coppersmith & ShmuelWinograd
( arithmetic progressions )
1990 Θ (nᶺ2.3737)
Andrew Stothers 2010 Θ (nᶺ2.3736)
Virginia Williams 2011 Θ (nᶺ2.3727)