pneave icon

C++ function to find prime numbers

pneave | PRO | 11/22/17 11:01:29 PM UTC | 0 ⭐ | 321 👁️ | Never ⏰ | []
C++ |

2.09 KB

|

None

|

0 👍

/

0 👎

//
// IsPrime.cpp : Determines if an integer value is prime.
//
// g++ -Wall -O2 -std=c++14 -DNDEBUG IsPrime.cpp
//
#include <iostream>
 
 
int64_t power(int a, int n, int mod)
{
  int64_t power  = a;
  int64_t result = 1;
 
  while(n)
  {
   if (n & 1)
     result = (result * power) % mod;
   power = (power * power) % mod;
   n >>= 1;
  }
 
  return result;
}
 
bool witness(int a, int n)
{
  int t;
  int u;
  int i;
  int64_t prev;
  int64_t curr;
 
  u = n / 2;
  t = 1;
 
  while (!(u & 1))
  {
    u /= 2;
    ++t;
  }
 
  prev = power(a, u, n);
  for (i = 1; i <= t; ++i)
  {
    curr = (prev * prev) % n;
    if ((curr == 1) && (prev != 1) && (prev != n - 1))
      return true;
    prev = curr;
  }
 
  if (curr != 1)
    return true;
  return false;
}
 
 
inline bool IsPrime(int number)
{
  if (((!(number & 1)) && number != 2 ) || (number < 2) || (number % 3 == 0 && number != 3))
    return (false);
 
  if (number < 1373653)
  {
    for ( int k = 1; 36 * k * k - 12 * k < number; ++k)
      if ((number % (6 * k + 1) == 0) || (number % (6 * k - 1) == 0))
        return false;
 
    return true;
  }
 
  if (number < 9080191)
  {
    if (witness(31, number)) return false;
    if (witness(73, number)) return false;
    return true;
  }
 
 
  if (witness(2, number))  return false;
  if (witness(7, number))  return false;
  if (witness(61, number)) return false;
  return true;
 
  /*WARNING: Algorithm deterministic only for numbers < 4,759,123,141 (unsigned int's max is 4294967296)
    if n < 1,373,653, it is enough to test a = 2 and 3.
    if n < 9,080,191, it is enough to test a = 31 and 73.
    if n < 4,759,123,141, it is enough to test a = 2, 7, and 61.
    if n < 2,152,302,898,747, it is enough to test a = 2, 3, 5, 7, and 11.
    if n < 3,474,749,660,383, it is enough to test a = 2, 3, 5, 7, 11, and 13.
    if n < 341,550,071,728,321, it is enough to test a = 2, 3, 5, 7, 11, 13, and 17.*/
}
 
 
int main()
{
  for (int i = 0; i < 10000000; i++)
  {
    if (IsPrime(i))
      std::cout << i << std::endl;
  }
 
  return 0;
}

Comments