Related Articles

# Implementing Coppersmith Freivald’s Algorithm in Java

• Difficulty Level : Expert
• Last Updated : 12 Jul, 2021

Concept: Coppersmith Freivald’s Algorithm is to check whether the matrix A multiplied by matrix B equals the given matrix C. It is used to verify matrix multiplication. It is verified with the help of an equation which stands A*(B*r)-(C*r)=0, where r is a random column vector consisting of 0/1 only.

Illustration:

```Input:

Enter the dimensions of the matrices:

2

Enter the 1st matrix:

-2 1

0  4

Enter the 2st matrix:

6  5

-7  1

Enter the result matrix:

-19  9

-28  4

Output: Yes, The matrix multiplication is correct.```

### Approach:

Take the size of the matrix as input from the user.

Goal: According to the equation we need to verify matrix A * matrix B = matrix C.

Take inputs of matrix A(n*n) matrix B(n*n) and the resultant matrix C(n*n) as input.

1) Take array r[n] randomly which consists of elements of 0/1 only.

2) Compute matrix B*r, matrix C*r and then matrix A*(matrix B*r) for evaluating the expression matrix A*(matrix B * r) – (matrix C*r)

3) Check if the equation matrix A*(matrix B * r) – (matrix C*r)=0 or not.

4)If it is zero then print “Yes” else print “No”.

Implementation: Input should be taken in the order shown above, else it will lead to wrong results. Below is the example for consideration

## Java

 `// Importing class to create objects``// generating pseudo random numbers``import` `java.util.Random;` `// Importing class to take input from user``import` `java.util.Scanner;` `public` `class` `GFG {``    ``public` `static` `double``[][] multiplyVector(``double``[][] a,``                                            ``double``[][] b,``                                            ``int` `n)``    ``// Method to check the result of the equation.``    ``{``        ``double` `result[][] = ``new` `double``[n][``1``];``        ``for` `(``int` `i = ``0``; i < n; i++) {``            ``for` `(``int` `j = ``0``; j < ``1``; j++) {``                ``for` `(``int` `k = ``0``; k < n; k++) {``                    ``result[i][j]``                        ``= result[i][j] + a[i][k] * b[i][j];``                ``}``            ``}``        ``}``        ``return` `result;``    ``}` `    ``public` `static` `void` `main(String args[])``    ``{``        ``// Driver main method``        ``Scanner input = ``new` `Scanner(System.in);` `        ``System.out.println(``            ``" Enter the dimensions of the matrix"``);``        ``int` `n = input.nextInt();` `        ``// n- size or dimensions of matrix``        ``System.out.println(``"Enter the 1st matrix:"``);` `        ``// Taking input for 1st matrix``        ``double` `a[][] = ``new` `double``[n][n];` `        ``for` `(``int` `i = ``0``; i < n; i++) {``            ``for` `(``int` `j = ``0``; j < n; j++) {``                ``a[i][j] = input.nextDouble();``            ``}``        ``}` `        ``//``        ``System.out.println(``"Enter the 2nd matrix"``);``        ``double` `b[][] = ``new` `double``[n][n];` `        ``// Taking input for second matrix``        ``for` `(``int` `i = ``0``; i < n; i++) {``            ``for` `(``int` `j = ``0``; j < n; j++) {``                ``b[i][j] = input.nextDouble();``            ``}``        ``}` `        ``// Covering up Resultant matrix``        ``System.out.println(``"Enter the resultant matrix"``);``        ``double` `c[][] = ``new` `double``[n][n];``        ``// the resultant matrix``        ``for` `(``int` `i = ``0``; i < n; i++) {``            ``for` `(``int` `j = ``0``; j < n; j++) {``                ``c[i][j] = input.nextDouble();``            ``}``        ``}` `        ``// generating random matrix r consisting of 0/1 only``        ``double``[][] r = ``new` `double``[n][``1``];``        ``Random random = ``new` `Random();``        ``for` `(``int` `i = ``0``; i < n; i++) {``            ``r[i][``0``] = random.nextInt(``2``);``        ``}` `        ``// testing of the standard equation A*(B*r)-(C*r)=0``        ``double` `br[][] = ``new` `double``[n][``1``];``        ``double` `cr[][] = ``new` `double``[n][``1``];``        ``double` `abr[][] = ``new` `double``[n][``1``];``        ``br = multiplyVector(b, r, n);``        ``cr = multiplyVector(c, r, n);``        ``abr = multiplyVector(a, br, n);` `        ``// check for all zeroes in abr``        ``boolean` `flag = ``true``;``        ``// Setting flag wth true` `        ``for` `(``int` `i = ``0``; i < n; i++) {``            ``if` `(abr[i][``0``] == ``0``)``                ``continue``;``            ``else` `                ``// Set flag to false(change flag)``                ``flag = ``false``;``        ``}` `        ``// Boolean comparison resulting in message printing``        ``if` `(flag == ``true``)` `            ``System.out.println(``                ``"Yes,The matrix multiplication is correct"``);``        ``else``            ``System.out.println(``                ``"No,The matrix multiplication is wrong"``);``        ``input.close();``    ``}``}`

Output: Custom input for 2 random matrices of order 2 Time Complexity : O(kN^2) where N is the size of the matrix.

Attention reader! Don’t stop learning now. Get hold of all the important Java Foundation and Collections concepts with the Fundamentals of Java and Java Collections Course at a student-friendly price and become industry ready. To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

My Personal Notes arrow_drop_up