You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

108 lines
3.3 KiB
Java

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*
This is the java implementation of classic Coppersmith-Freivalds algorithm to check whether
the multiplication of matrix A and B equals the given matrix C. It does it by checking A*(B*r)-(C*r) where r
is any random column vector consisting only 0/1 as its elements. If this value is zero algorithm prints Yes, No otherwise.
*/
//This is a sample program to check whether the matrix c is equal to the multiplication of a and b
//implementation of Coppersmith Freivalds Algorithm
import java.util.Random;
import java.util.Scanner;
public class Coppersmith_Freivalds_Algorithm
{
public static void main(String args[])
{
System.out.println("Enter the dimesion of the matrices: ");
Scanner input = new Scanner(System.in);
int n = input.nextInt();
System.out.println("Enter the 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 2st matrix: ");
double b[][] = new double[n][n];
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
b[i][j] = input.nextDouble();
}
}
System.out.println("Enter the result matrix: ");
double c[][] = new double[n][n];
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
c[i][j] = input.nextDouble();
}
}
//random generation of the r vector containing only 0/1 as its elements
double [][]r = new double[n][1];
Random random = new Random();
for(int i=0; i<n; i++)
{
r[i][0] = random.nextInt(2);
}
//test A * (b*r) - (C*) = 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 zeros in abr
boolean flag = true;
for(int i=0; i<n; i++)
{
if(abr[i][0] == 0)
continue;
else
flag = false;
}
if(flag == true)
System.out.println("Yes");
else
System.out.println("No");
input.close();
}
public static double[][] multiplyVector(double[][] a, double[][] b, int n)
{
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[k][j];
}
}
}
return result;
}
}
/*
Output:
Enter the dimesion of the matrices:
2
Enter the 1st matrix:
2 3
3 4
Enter the 2st matrix:
1 0
1 2
Enter the result matrix:
6 5
8 7