Strassen's algorithm
In linear algebra, the Strassen algorithm, named after Volker Strassen, is an algorithm for matrix multiplication. It is faster than the standard matrix multiplication algorithm and is useful in practice for large matrices, but would be slower than the fastest known algorithms for extremely large matrices.
Julia
The multiplication is denoted by * <lang Julia> function Strassen(A::Matrix, B::Matrix)
n = size(A, 1) if n == 1 return A * B end @views A11 = A[1:n/2, 1:n/2] @views A12 = A[1:n/2, n/2+1:n] @views A21 = A[n/2+1:n, 1:n/2] @views A11 = A[n/2+1:n, n/2+1:n] @views B11 = B[1:n/2, 1:n/2] @views B12 = B[1:n/2, n/2+1:n] @views B21 = B[n/2+1:n, 1:n/2] @views B11 = B[n/2+1:n, n/2+1:n]
P1 = Strassen(A12 - A22, B21 + B22) P2 = Strassen(A11 + A22, B11 + B22) P3 = Strassen(A11 - A21, B11 + B12) P4 = Strassen(A11 + A12, B22) P5 = Strassen(A11, B12 - B22) P6 = Strassen(A22, B21 - B11) P7 = Strassen(A21 + A22, B11)
C11 = P1 + P2 - P4 + P6 C12 = P4 + P5 C21 = P6 + P7 C22 = P2 - P3 + P5 - P7
return [C11 C12; C21 C22]
end