Skip to content
Related Articles

Related Articles

Improve Article

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][1] 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
Recommended Articles
Page :