In describing and analyzing Strassens algorithm we assumed t
Solution
 public class matmult
 {
public int[][] strassen(int[][] A, int[][] B)
 {
 int n = A.length;
 int[][] R = new int[n][n];
 /** base case **/
 if (n == 1)
 R[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];
 
 split(A, A11, 0 , 0);
 split(A, A12, 0 , n/2);
 split(A, A21, n/2, 0);
 split(A, A22, n/2, n/2);
 
 split(B, B11, 0 , 0);
 split(B, B12, 0 , n/2);
 split(B, B21, n/2, 0);
 split(B, B22, n/2, n/2);
 
 int [][] M1 = strassen(add(A11, A22), add(B11, B22));
 int [][] M2 = strassen(add(A21, A22), B11);
 int [][] M3 = strassen(A11, sub(B12, B22));
 int [][] M4 = strassen(A22, sub(B21, B11));
 int [][] M5 = strassen(add(A11, A12), B22);
 int [][] M6 = strassen(sub(A21, A11), add(B11, B12));
 int [][] M7 = strassen(sub(A12, A22), add(B21, B22));
 int [][] C11 = add(sub(add(M1, M4), M5), M7);
 int [][] C12 = add(M3, M5);
 int [][] C21 = add(M2, M4);
 int [][] C22 = add(sub(add(M1, M3), M2), M6);
 
 join(C11, R, 0 , 0);
 join(C12, R, 0 , n/2);
 join(C21, R, n/2, 0);
 join(C22, R, n/2, n/2);
 }
 
 return R;
 }
 
 public int[][] sub(int[][] A, int[][] B)
 {
 int n = A.length;
 int[][] C = new int[n][n];
 for (int i = 0; i < n; i++)
 for (int j = 0; j < n; j++)
 C[i][j] = A[i][j] - B[i][j];
 return C;
 }
 
 public int[][] add(int[][] A, int[][] B)
 {
 int n = A.length;
 int[][] C = new int[n][n];
 for (int i = 0; i < n; i++)
 for (int j = 0; j < n; j++)
 C[i][j] = A[i][j] + B[i][j];
 return C;
 }
 
 public void split(int[][] P, int[][] C, int iB, int jB)
 {
 for(int i1 = 0, i2 = iB; i1 < C.length; i1++, i2++)
 for(int j1 = 0, j2 = jB; j1 < C.length; j1++, j2++)
 C[i1][j1] = P[i2][j2];
 }
 
 public void join(int[][] C, int[][] P, int iB, int jB)
 {
 for(int i1 = 0, i2 = iB; i1 < C.length; i1++, i2++)
 for(int j1 = 0, j2 = jB; j1 < C.length; j1++, j2++)
 P[i2][j2] = C[i1][j1];
 }
 
 public int[][] brute_force(int[][] A, int[][] B)
 {
 int mat3[][]=new int[A.length][B.length];
 for(int i=0;i<A.length;i++)
 for(int j=0;j<B.length;j++)
 for(int k=0;k<B.length;k++)
 mat3[i][j]+=A[i][k]*B[k][j];
 return mat3;
}
 public void compare_runtime()
 {
 int A[][],B[][];
 long startTime,endTime;
 System.out.println(\"n | Strassen | Brute-force\");
 System.out.println(\" (in ms) | (in ms) \");
 for(int k=2;k<=2048;k++)
 {
 System.out.print(k+\" \");
 A=new int[k][k];
 B=new int[k][k];
 for(int i=0;i<k;i++)
 for(int j=0;j<k;j++)
 A[i][j]=(int)(Math.random()*100);
   
 startTime = System.currentTimeMillis();
 B=strassen(A,A);
 endTime = System.currentTimeMillis();
 System.out.print((endTime - startTime)+\"\\t\");
   
 startTime = System.currentTimeMillis();
 B=brute_force(A,A);
 endTime = System.currentTimeMillis();
 System.out.print(endTime - startTime);
   
 System.out.println();
 }
 }
   
 public static void main(String args[])
 {
System.out.println(\"The runtime comparison between strassen and brute force approach\ \");
 matmult m=new matmult();
 m.compare_runtime();
 }
 }



