Advertisement
pneave

C++ function to find prime numbers

Nov 22nd, 2017
193
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.09 KB | None | 0 0
  1. //
  2. // IsPrime.cpp : Determines if an integer value is prime.
  3. //
  4. // g++ -Wall -O2 -std=c++14 -DNDEBUG IsPrime.cpp
  5. //
  6. #include <iostream>
  7.  
  8.  
  9. int64_t power(int a, int n, int mod)
  10. {
  11.   int64_t power  = a;
  12.   int64_t result = 1;
  13.  
  14.   while(n)
  15.   {
  16.    if (n & 1)
  17.      result = (result * power) % mod;
  18.    power = (power * power) % mod;
  19.    n >>= 1;
  20.   }
  21.  
  22.   return result;
  23. }
  24.  
  25. bool witness(int a, int n)
  26. {
  27.   int t;
  28.   int u;
  29.   int i;
  30.   int64_t prev;
  31.   int64_t curr;
  32.  
  33.   u = n / 2;
  34.   t = 1;
  35.  
  36.   while (!(u & 1))
  37.   {
  38.     u /= 2;
  39.     ++t;
  40.   }
  41.  
  42.   prev = power(a, u, n);
  43.   for (i = 1; i <= t; ++i)
  44.   {
  45.     curr = (prev * prev) % n;
  46.     if ((curr == 1) && (prev != 1) && (prev != n - 1))
  47.       return true;
  48.     prev = curr;
  49.   }
  50.  
  51.   if (curr != 1)
  52.     return true;
  53.   return false;
  54. }
  55.  
  56.  
  57. inline bool IsPrime(int number)
  58. {
  59.   if (((!(number & 1)) && number != 2 ) || (number < 2) || (number % 3 == 0 && number != 3))
  60.     return (false);
  61.  
  62.   if (number < 1373653)
  63.   {
  64.     for ( int k = 1; 36 * k * k - 12 * k < number; ++k)
  65.       if ((number % (6 * k + 1) == 0) || (number % (6 * k - 1) == 0))
  66.         return false;
  67.  
  68.     return true;
  69.   }
  70.  
  71.   if (number < 9080191)
  72.   {
  73.     if (witness(31, number)) return false;
  74.     if (witness(73, number)) return false;
  75.     return true;
  76.   }
  77.  
  78.  
  79.   if (witness(2, number))  return false;
  80.   if (witness(7, number))  return false;
  81.   if (witness(61, number)) return false;
  82.   return true;
  83.  
  84.   /*WARNING: Algorithm deterministic only for numbers < 4,759,123,141 (unsigned int's max is 4294967296)
  85.     if n < 1,373,653, it is enough to test a = 2 and 3.
  86.     if n < 9,080,191, it is enough to test a = 31 and 73.
  87.     if n < 4,759,123,141, it is enough to test a = 2, 7, and 61.
  88.     if n < 2,152,302,898,747, it is enough to test a = 2, 3, 5, 7, and 11.
  89.     if n < 3,474,749,660,383, it is enough to test a = 2, 3, 5, 7, 11, and 13.
  90.     if n < 341,550,071,728,321, it is enough to test a = 2, 3, 5, 7, 11, 13, and 17.*/
  91. }
  92.  
  93.  
  94. int main()
  95. {
  96.   for (int i = 0; i < 10000000; i++)
  97.   {
  98.     if (IsPrime(i))
  99.       std::cout << i << std::endl;
  100.   }
  101.  
  102.   return 0;
  103. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement