Saturday, December 13, 2025
HomeLanguagesJavaImplementing Coppersmith Freivald’s Algorithm in Java

Implementing Coppersmith Freivald’s Algorithm in Java

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 2nd 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 with 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.

 

RELATED ARTICLES

Most Popular

Dominic
32447 POSTS0 COMMENTS
Milvus
105 POSTS0 COMMENTS
Nango Kala
6816 POSTS0 COMMENTS
Nicole Veronica
11952 POSTS0 COMMENTS
Nokonwaba Nkukhwana
12031 POSTS0 COMMENTS
Shaida Kate Naidoo
6951 POSTS0 COMMENTS
Ted Musemwa
7202 POSTS0 COMMENTS
Thapelo Manthata
6898 POSTS0 COMMENTS
Umr Jansen
6882 POSTS0 COMMENTS