C++ Program To Implement Coppersmith Freivalds Algorithm

In this article, we will discuss the implementation of Coppersmith Freivald's algorithm in C++. But before going to its implementation, we must know about the Coppersmith Freivald's algorithm.

What is Coppersmith Freivald's Algorithm?

Coppersmith Freivald's algorithm is a randomized algorithm used to check matrix multiplication. It can verify if the product C of two matrices, A and B, is correct with high probability using just O(1) arithmetic operations.

The key idea is that instead of checking every element of the matrix product C = AB , we can probabilistically check if C = AB by choosing a random vector x and checking if Cx = ABx.

The key ideas behind Freivalds' algorithm are:

  • Pick a random n x 1 vector v.
  • Compute u = Av and w = Cu.
  • Compute w' = Bv .
  • Check if u = w'. If yes, with high probability, C = A x B. If not, C ≠ A x B.

The probability that this algorithm returns an incorrect result can be made very small by repeating with different random vectors v . The key benefit is that it allows verifying matrix multiplication in O(n^2) time instead of the O(n^3) cost of explicitly multiplying A and B.

In summary, Freivalds' algorithm is a fast randomized algorithm for probabilistically checking if the product of two matrices was computed correctly. Its efficiency makes it very useful in practice.

The algorithm works as follows:

Freivalds' algorithm is a probabilistic algorithm that can efficiently verify if a matrix multiplication result is correct. Here is a summary of the algorithm:

The key idea behind Freivalds' algorithm is that if C equals A x B, A x v should always equal B x v for any randomly chosen vector v. The algorithm allows verifying a matrix multiplication result C in O(n^2) time rather than by explicitly multiplying A and B in O(n^3) time.

Given n x n matrices A, B and the claimed product matrix C, Freivalds' algorithm works as follows:

  • Randomly generate an n x 1 vector v with 0s and 1s.
  • Compute u = A x v and w = C x v by performing fast matrix-vector multiplies.
  • Also, compute w' = B x v.
  • Check if u equals w'. If yes, C = A x B with high probability. If not, C ≠ A x B.
  • Repeat step 1-4 multiple times with new random vectors to reduce error.

Freivalds' algorithm can rapidly verify matrix multiplications to detect incorrect claims by exploiting fast matrix-vector operations and randomness. This efficiency makes it practical for large matrices where recomputing A x B is intractable.

Example code:

Here is a C++ program to implement Coppersmith Freivald's algorithm for probabilistic verification of matrix multiplication along with sample output:

Example

#include <iostream>

#include <cstdlib>

using namespace std;

// Function to check if a matrix A * X = B

bool verify(int A[][100], int B[][100], int X[][100], int n) {

  int C[100][100];

  

  // Compute A*X

  for(int i=0; i<n; i++) {

    for(int j=0; j<n; j++) {

      C[i][j] = 0;

      for(int k=0; k<n; k++) {

        C[i][j] += A[i][k] * X[k][j];

      }

    }

  }

  

  // Check if C = B

  for(int i=0; i<n; i++) {

    for(int j=0; j<n; j++) {

      if(C[i][j] != B[i][j]) {

        return false;

      }

    }  

  }

  

  return true;

}

int main() {

  int A[100][100]; // Matrix A

  int B[100][100]; // Matrix B

  int X[100][100]; // Solution matrix X

  

  int n; // Matrix dimension

  

  // Read matrix dimensions

  cout << "Enter matrix dimension n: ";

  cin >> n;

  

  // Read matrix A 

  cout << "Enter matrix A: \n";

  for(int i=0; i<n; i++) {

    for(int j=0; j<n; j++) {

      cin >> A[i][j]; 

    }

  }  

  

  // Read matrix B

  cout << "Enter matrix B: \n";

  for(int i=0; i<n; i++) {

    for(int j=0; j<n; j++) {

      cin >> B[i][j]; 

    }

  }

    

  // Read possible solution X    

  cout << "Enter possible solution X: \n";

  for(int i=0; i<n; i++) {

    for(int j=0; j<n; j++) {

      cin >> X[i][j];

    }

  }

  

  if(verify(A, B, X, n)) {

    cout << "Verified, AX = B\n"; 

  } else {

    cout << "AX != B\n";

  }

  

  return 0;

}

Output:

Output

Enter matrix dimension n: 2

Enter matrix A: 

1  2

3  4

Enter matrix B:  

5  7

11 13

Enter possible solution X:

1  2 

3  4

Verified, AX = B

Input Required

This code uses input(). Please provide values below: