108 lines
3.3 KiB
Java
108 lines
3.3 KiB
Java
|
/*
|
|||
|
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
|
|||
|
|