1
+ import java .util .Scanner ;
2
+
3
+
4
+ public class Strassen
5
+ {
6
+ // Function to multiply matrices
7
+ public int [][] multiply (int [][] A , int [][] B )
8
+ {
9
+ int n = A .length ;
10
+ int [][] R = new int [n ][n ];
11
+
12
+ /** base case **/
13
+ if (n == 1 )
14
+ R [0 ][0 ] = A [0 ][0 ] * B [0 ][0 ];
15
+ else
16
+ {
17
+ int [][] A11 = new int [n /2 ][n /2 ];
18
+ int [][] A12 = new int [n /2 ][n /2 ];
19
+ int [][] A21 = new int [n /2 ][n /2 ];
20
+ int [][] A22 = new int [n /2 ][n /2 ];
21
+ int [][] B11 = new int [n /2 ][n /2 ];
22
+ int [][] B12 = new int [n /2 ][n /2 ];
23
+ int [][] B21 = new int [n /2 ][n /2 ];
24
+ int [][] B22 = new int [n /2 ][n /2 ];
25
+
26
+ /** Dividing matrix A into 4 halves **/
27
+ split (A , A11 , 0 , 0 );
28
+ split (A , A12 , 0 , n /2 );
29
+ split (A , A21 , n /2 , 0 );
30
+ split (A , A22 , n /2 , n /2 );
31
+
32
+
33
+ /** Dividing matrix B into 4 halves **/
34
+ split (B , B11 , 0 , 0 );
35
+ split (B , B12 , 0 , n /2 );
36
+ split (B , B21 , n /2 , 0 );
37
+ split (B , B22 , n /2 , n /2 );
38
+
39
+ /**
40
+ M1 = (A11 + A22)(B11 + B22)
41
+ M2 = (A21 + A22) B11
42
+ M3 = A11 (B12 - B22)
43
+ M4 = A22 (B21 - B11)
44
+ M5 = (A11 + A12) B22
45
+ M6 = (A21 - A11) (B11 + B12)
46
+ M7 = (A12 - A22) (B21 + B22)
47
+ **/
48
+
49
+ int [][] M1 = multiply (add (A11 , A22 ), add (B11 , B22 ));
50
+ int [][] M2 = multiply (add (A21 , A22 ), B11 );
51
+ int [][] M3 = multiply (A11 , sub (B12 , B22 ));
52
+ int [][] M4 = multiply (A22 , sub (B21 , B11 ));
53
+ int [][] M5 = multiply (add (A11 , A12 ), B22 );
54
+ int [][] M6 = multiply (sub (A21 , A11 ), add (B11 , B12 ));
55
+ int [][] M7 = multiply (sub (A12 , A22 ), add (B21 , B22 ));
56
+
57
+ /**
58
+ C11 = M1 + M4 - M5 + M7
59
+ C12 = M3 + M5
60
+ C21 = M2 + M4
61
+ C22 = M1 - M2 + M3 + M6
62
+ **/
63
+
64
+ int [][] C11 = add (sub (add (M1 , M4 ), M5 ), M7 );
65
+ int [][] C12 = add (M3 , M5 );
66
+ int [][] C21 = add (M2 , M4 );
67
+ int [][] C22 = add (sub (add (M1 , M3 ), M2 ), M6 );
68
+
69
+ /** Joining 4 halves into one result matrix **/
70
+ join (C11 , R , 0 , 0 );
71
+ join (C12 , R , 0 , n /2 );
72
+ join (C21 , R , n /2 , 0 );
73
+ join (C22 , R , n /2 , n /2 );
74
+ }
75
+
76
+ /** Returning the resultant matrix **/
77
+ return R ;
78
+ }
79
+
80
+ /** Funtion to add two matrices **/
81
+ public int [][] add (int [][] A , int [][] B )
82
+ {
83
+ int n = A .length ;
84
+ int [][] C = new int [n ][n ];
85
+ for (int i = 0 ; i < n ; i ++)
86
+ for (int j = 0 ; j < n ; j ++)
87
+ C [i ][j ] = A [i ][j ] + B [i ][j ];
88
+ return C ;
89
+ }
90
+
91
+ /** Funtion to subtract two matrices **/
92
+ public int [][] sub (int [][] A , int [][] B )
93
+ {
94
+ int n = A .length ;
95
+ int [][] C = new int [n ][n ];
96
+ for (int i = 0 ; i < n ; i ++)
97
+ for (int j = 0 ; j < n ; j ++)
98
+ C [i ][j ] = A [i ][j ] - B [i ][j ];
99
+ return C ;
100
+ }
101
+
102
+ /** Funtion to split parent matrix into child matrices **/
103
+ public void split (int [][] P , int [][] C , int iB , int jB )
104
+ {
105
+ for (int i1 = 0 , i2 = iB ; i1 < C .length ; i1 ++, i2 ++)
106
+ for (int j1 = 0 , j2 = jB ; j1 < C .length ; j1 ++, j2 ++)
107
+ C [i1 ][j1 ] = P [i2 ][j2 ];
108
+ }
109
+
110
+ /** Funtion to join child matrices intp parent matrix **/
111
+ public void join (int [][] C , int [][] P , int iB , int jB )
112
+ {
113
+ for (int i1 = 0 , i2 = iB ; i1 < C .length ; i1 ++, i2 ++)
114
+ for (int j1 = 0 , j2 = jB ; j1 < C .length ; j1 ++, j2 ++)
115
+ P [i2 ][j2 ] = C [i1 ][j1 ];
116
+ }
117
+
118
+ /** Main function **/
119
+ public static void main (String [] args )
120
+ {
121
+ Scanner sc = new Scanner (System .in );
122
+
123
+ /** Making an object of Strassen class **/
124
+ Strassen s = new Strassen ();
125
+
126
+ System .out .println ("Enter the order of matrices (n) :" );
127
+ int N = sc .nextInt ();
128
+
129
+ /** Accepting two 2d matrices **/
130
+ System .out .println ("Enter N*N order matrix 1\n " );
131
+ int [][] A = new int [N ][N ];
132
+ for (int i = 0 ; i < N ; i ++)
133
+ for (int j = 0 ; j < N ; j ++)
134
+ A [i ][j ] = sc .nextInt ();
135
+
136
+ System .out .println ("Enter N*N order matrix 2\n " );
137
+ int [][] B = new int [N ][N ];
138
+ for (int i = 0 ; i < N ; i ++)
139
+ for (int j = 0 ; j < N ; j ++)
140
+ B [i ][j ] = sc .nextInt ();
141
+
142
+ int [][] C = s .multiply (A , B );
143
+
144
+ System .out .println ("\n Product of matrices 1 and 2 is : " );
145
+ for (int i = 0 ; i < N ; i ++)
146
+ {
147
+ for (int j = 0 ; j < N ; j ++)
148
+ System .out .print (C [i ][j ] +" " );
149
+ System .out .println ();
150
+ }
151
+
152
+ }
153
+ }
0 commit comments