File tree Expand file tree Collapse file tree
main/java/com/thealgorithms/matrix
test/java/com/thealgorithms/matrix Expand file tree Collapse file tree Original file line number Diff line number Diff line change 1+ /**
2+ * Randomized algorithm to verify if A * B = C without computing full multiplication.
3+ * Returns true if probably correct, false if definitely incorrect.
4+ * Uses Freivalds' algorithm.
5+ */
6+
7+ package com .thealgorithms .matrix ;
8+
9+ public class RandomizedMatrixVerifier {
10+
11+ public static boolean verify (int [][] A , int [][] B , int [][] C ) {
12+ int n = A .length ;
13+ int [] r = new int [n ];
14+
15+ // Generate random vector r
16+ for (int i = 0 ; i < n ; i ++) {
17+ r [i ] = (int ) (Math .random () * 10 ); // keep it simple
18+ }
19+
20+ // Compute B * r
21+ int [] Br = new int [n ];
22+ for (int i = 0 ; i < n ; i ++) {
23+ Br [i ] = 0 ;
24+ for (int j = 0 ; j < n ; j ++) {
25+ Br [i ] += B [i ][j ] * r [j ];
26+ }
27+ }
28+
29+ // Compute A * (B * r)
30+ int [] ABr = new int [n ];
31+ for (int i = 0 ; i < n ; i ++) {
32+ ABr [i ] = 0 ;
33+ for (int j = 0 ; j < n ; j ++) {
34+ ABr [i ] += A [i ][j ] * Br [j ];
35+ }
36+ }
37+
38+ // Compute C * r
39+ int [] Cr = new int [n ];
40+ for (int i = 0 ; i < n ; i ++) {
41+ Cr [i ] = 0 ;
42+ for (int j = 0 ; j < n ; j ++) {
43+ Cr [i ] += C [i ][j ] * r [j ];
44+ }
45+ }
46+
47+ // Compare ABr and Cr
48+ for (int i = 0 ; i < n ; i ++) {
49+ if (ABr [i ] != Cr [i ]) return false ;
50+ }
51+
52+ return true ; // probably correct
53+ }
54+ }
Original file line number Diff line number Diff line change 1+ package com .thealgorithms .matrix ;
2+
3+ import static org .junit .jupiter .api .Assertions .*;
4+ import org .junit .jupiter .api .Test ;
5+
6+ public class RandomizedMatrixVerifierTest {
7+
8+ @ Test
9+ public void testCorrectMultiplication () {
10+ int [][] A = {
11+ {1 , 2 },
12+ {3 , 4 }
13+ };
14+ int [][] B = {
15+ {5 , 6 },
16+ {7 , 8 }
17+ };
18+ int [][] C = {
19+ {19 , 22 },
20+ {43 , 50 }
21+ };
22+
23+ // Run multiple times to reduce chance of false positive
24+ boolean result = true ;
25+ for (int i = 0 ; i < 5 ; i ++) {
26+ if (!RandomizedMatrixVerifier .verify (A , B , C )) {
27+ result = false ;
28+ break ;
29+ }
30+ }
31+ assertTrue (result , "Verification should return true for correct C = A * B" );
32+ }
33+
34+ @ Test
35+ public void testIncorrectMultiplication () {
36+ int [][] A = {
37+ {1 , 2 },
38+ {3 , 4 }
39+ };
40+ int [][] B = {
41+ {5 , 6 },
42+ {7 , 8 }
43+ };
44+ int [][] wrongC = {
45+ {19 , 22 },
46+ {43 , 51 } // incorrect value
47+ };
48+
49+ // Even with randomness, wrong matrix should fail at least once in 5 tries
50+ boolean result = true ;
51+ for (int i = 0 ; i < 5 ; i ++) {
52+ if (!RandomizedMatrixVerifier .verify (A , B , wrongC )) {
53+ result = false ;
54+ break ;
55+ }
56+ }
57+ assertFalse (result , "Verification should return false for incorrect C" );
58+ }
59+ }
You can’t perform that action at this time.
0 commit comments