public class Strassen1MatrixMultiplication implements IntMatrixMultiplication { public String getName () { return "Strassen(dynamic)"; } public int[][] mult (int[][] c, int[][] a, int[][] b) { return strassenMatrixMultiplication(a, b); } public int [][] strassenMatrixMultiplication(int [][] A, int [][] B) { int n = A.length; int [][] result = new int[n][n]; if(n == 1) { result[0][0] = A[0][0] * B[0][0]; } else { int [][] A11 = new int[n/2][n/2]; int [][] A12 = new int[n/2][n/2]; int [][] A21 = new int[n/2][n/2]; int [][] A22 = new int[n/2][n/2]; int [][] B11 = new int[n/2][n/2]; int [][] B12 = new int[n/2][n/2]; int [][] B21 = new int[n/2][n/2]; int [][] B22 = new int[n/2][n/2]; divideArray(A, A11, 0 , 0); divideArray(A, A12, 0 , n/2); divideArray(A, A21, n/2, 0); divideArray(A, A22, n/2, n/2); divideArray(B, B11, 0 , 0); divideArray(B, B12, 0 , n/2); divideArray(B, B21, n/2, 0); divideArray(B, B22, n/2, n/2); int [][] P1 = strassenMatrixMultiplication(addMatrices(A11, A22), addMatrices(B11, B22)); int [][] P2 = strassenMatrixMultiplication(addMatrices(A21, A22), B11); int [][] P3 = strassenMatrixMultiplication(A11, subtractMatrices(B12, B22)); int [][] P4 = strassenMatrixMultiplication(A22, subtractMatrices(B21, B11)); int [][] P5 = strassenMatrixMultiplication(addMatrices(A11, A12), B22); int [][] P6 = strassenMatrixMultiplication(subtractMatrices(A21, A11), addMatrices(B11, B12)); int [][] P7 = strassenMatrixMultiplication(subtractMatrices(A12, A22), addMatrices(B21, B22)); int [][] C11 = addMatrices(subtractMatrices(addMatrices(P1, P4), P5), P7); int [][] C12 = addMatrices(P3, P5); int [][] C21 = addMatrices(P2, P4); int [][] C22 = addMatrices(subtractMatrices(addMatrices(P1, P3), P2), P6); copySubArray(C11, result, 0 , 0); copySubArray(C12, result, 0 , n/2); copySubArray(C21, result, n/2, 0); copySubArray(C22, result, n/2, n/2); } return result; } public int [][] addMatrices(int [][] A, int [][] B) { int n = A.length; int [][] result = new int[n][n]; for(int i=0; i