Vantieghems Theorem for Primality Test

Vantieghems Theorem is a necessary and sufficient condition for a number to be prime. It states that for a natural number n to be prime, the product of 2^i - 1 where 0 < i < n, is congruent to n~(mod~(2^n - 1)).

In other words, a number n is prime if and only if.

 {\displaystyle \prod _{1\leq i\leq n-1}\left(2^{i}-1\right)\equiv n\mod \left(2^{n}-1\right).}



Examples:

  • For n = 3, final product is (21 – 1) * (22 – 1) = 1*3 = 3. 3 is congruent to 3 mod 7. We get 3 mod 7 from expression 3 * (mod (23 – 1)), therefore 3 is prime.
  • For n = 5, final product is 1*3*7*15 = 315. 315 is congruent to 5(mod 31), therefore 5 is prime.
  • For n = 7, final product is 1*3*7*15*31*63 = 615195. 615195 is congruent to 7(mod 127), therefore 7 is prime.
  • For n = 4, final product 1*3*7 = 21. 21 is not congruent to 4(mod 15), therefore 4 is composite.

Another way to state above theorem is, if (2^n - 1) divides \prod _{1\leq i\leq n-1}\left(2^{i}-1\right) - n, then n is prime.

filter_none

edit
close

play_arrow

link
brightness_4
code

// CPP code to verify Vantieghem's Theorem
#include <bits/stdc++.h>
using namespace std;
  
void checkVantieghemsTheorem(int limit)
{
    long long unsigned prod = 1;
    for (long long unsigned n = 2; n < limit; n++) {
  
        // Check if above condition is satisfied
        if (((prod - n) % ((1LL << n) - 1)) == 0)
            cout << n << " is prime\n";
  
        // product of previous powers of 2
        prod *= ((1LL << n) - 1);
    }
}
  
// Driver code
int main()
{
    checkVantieghemsTheorem(10);
    return 0;
}

chevron_right


Output:

2 is prime
3 is prime
5 is prime
7 is prime

The above code does not work for values of n higher than 11. It causes overflow in prod evaluation.



My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.