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.

C++



filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ 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


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 code to verify Vantieghem's Theorem
def checkVantieghemsTheorem(limit):
      
    prod = 1
    for n in range(2, limit):
          
        # Check if above condition is satisfied
        if n == 2:
            print(2, "is prime")
        if (((prod - n) % ((1 << n) - 1)) == 0):
            print(n, "is prime")
              
        # Product of previous powers of 2
        prod *= ((1 << n) - 1)
      
# Driver code
checkVantieghemsTheorem(10)
  
# This code is contributed by shubhamsingh10

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.

competitive-programming-img




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.



Improved By : SHUBHAMSINGH10