12

I have perused a lot of code on this topic, but most of them produce the numbers that are prime all the way up to the input number. However, I need code which only checks whether the given input number is prime.

Here is what I was able to write, but it does not work:

void primenumber(int number)
{
    if(number%2!=0)
      cout<<"Number is prime:"<<endl;
    else 
      cout<<"number is NOt prime"<<endl;
}

I would appreciate if someone could give me advice on how to make this work properly.

Update

I modified it to check on all the numbers in a for loop.

void primenumber(int number)
{
    for(int i=1; i<number; i++)
    {
       if(number%i!=0)
          cout<<"Number is prime:"<<endl;
       else 
          cout<<"number is NOt prime"<<endl;
    }  
}
zachjs
  • 1,738
  • 1
  • 11
  • 22
carla
  • 169
  • 1
  • 2
  • 7
  • 2
    All your code does is report if the number is divisible by 2. What general approach would you use to detect primes? Let's start with that, and craft it into executable code. – Michael Petrotta Dec 12 '10 at 22:13
  • 8
    Have you thought about what it means for a number to be prime? Write it out in pseudocode then turn it into real code. – Cameron Skinner Dec 12 '10 at 22:14
  • possible duplicate of [deciding if a number is perfect or prime](http://stackoverflow.com/questions/4424002/deciding-if-a-number-is-perfect-or-prime) – H H Dec 12 '10 at 22:21
  • There is no question being asked here. There is even a function shown that (supposedly, I didn't check if it's correct) calculates if a number is prime. So what's the point? – mkrieger1 Apr 19 '22 at 08:52

25 Answers25

43
bool isPrime(int number){

    if(number < 2) return false;
    if(number == 2) return true;
    if(number % 2 == 0) return false;
    for(int i=3; (i*i)<=number; i+=2){
        if(number % i == 0 ) return false;
    }
    return true;

}
Toomtarm Kung
  • 594
  • 2
  • 7
  • 11
40

My own IsPrime() function, written and based on the deterministic variant of the famous Rabin-Miller algorithm, combined with optimized step brute forcing, giving you one of the fastest prime testing functions out there.

__int64 power(int a, int n, int mod)
{
 __int64 power=a,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,u,i;
 __int64 prev,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.*/
}

To use, copy and paste the code into the top of your program. Call it, and it returns a BOOL value, either true or false.

if(IsPrime(number))
{
    cout << "It's prime";
}

else
{
    cout<<"It's composite";
}

If you get a problem compiling with "__int64", replace that with "long". It compiles fine under VS2008 and VS2010.

How it works: There are three parts to the function. Part checks to see if it is one of the rare exceptions (negative numbers, 1), and intercepts the running of the program.

Part two starts if the number is smaller than 1373653, which is the theoretically number where the Rabin Miller algorithm will beat my optimized brute force function. Then comes two levels of Rabin Miller, designed to minimize the number of witnesses needed. As most numbers that you'll be testing are under 4 billion, the probabilistic Rabin-Miller algorithm can be made deterministic by checking witnesses 2, 7, and 61. If you need to go over the 4 billion cap, you will need a large number library, and apply a modulus or bit shift modification to the power() function.

If you insist on a brute force method, here is just my optimized brute force IsPrime() function:

inline bool IsPrime( int number )
{
 if ( ( (!(number & 1)) && number != 2 ) || (number < 2) || (number % 3 == 0 && number != 3) )
  return (false);

 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;
 }
}

How this brute force piece works: All prime numbers (except 2 and 3) can be expressed in the form 6k+1 or 6k-1, where k is a positive whole number. This code uses this fact, and tests all numbers in the form of 6k+1 or 6k-1 less than the square root of the number in question. This piece is integrated into my larger IsPrime() function (the function shown first).

If you need to find all the prime numbers below a number, find all the prime numbers below 1000, look into the Sieve of Eratosthenes. Another favorite of mine.

As an additional note, I would love to see anyone implement the Eliptical Curve Method algorithm, been wanting to see that implemented in C++ for a while now, I lost my implementation of it. Theoretically, it's even faster than the deterministic Rabin Miller algorithm I implemented, although I'm not sure if that's true for numbers under 4 billion.

LostInTheCode
  • 1,724
  • 2
  • 15
  • 22
  • Your function only accepts arguments of type int. If it accepted bigger numbers, it wouldn't work for numbers > 2^32. – gnasher729 Mar 22 '14 at 01:14
13

You need to do some more checking. Right now, you are only checking if the number is divisible by 2. Do the same for 2, 3, 4, 5, 6, ... up to number. Hint: use a loop.

After you resolve this, try looking for optimizations. Hint: You only have to check all numbers up to the square root of the number

Pablo Santa Cruz
  • 176,835
  • 32
  • 241
  • 292
  • 5
    There are then many optimisations. You only need to test up to SQRT(n), since if n can be factored into 2 numbers one of them must be <= SQRT(n). You can skip all even numbers (except 2) since if an even number divides n, then so will 2.... just to get you started. – James Gaunt Dec 12 '10 at 22:17
  • when it gets to optimization - think of the highest number to test. does it have to be 'number' or can it be a bit less? ;) edit: arrrgh, people are fast today ;) – mad Dec 12 '10 at 22:18
  • 1
    Or even better than skipping even numbers, you can skip all numbers that aren't one less or one greater than a multiple of 6. (multiple of 6 + 2 or 4 is divisible by 2 and multiple of 6 + 3 is divisible by 3, leaving only multiples of 6 + 1 or 5) – user470379 Dec 12 '10 at 22:20
  • You can also take it a step further and check numbers based on their value modulo 30, which is still feasible to do as an unrolled loop. Though of course, you get diminishing returns as you go higher...(not checking multiples of 2 cuts the number of checks in half, based off 6 only takes another 1/3rd off that, going to 30 only eliminates another 1/5th...) – Anon. Dec 12 '10 at 22:24
  • I've tried 30, but then the costs at the lower number range ended up making the algorithm slower on average. – LostInTheCode Dec 12 '10 at 23:16
  • Or... you know... you could just use Euler's sieve. – LanguagesNamedAfterCofee Oct 09 '12 at 03:59
5

C++

bool isPrime(int number){
    if (number != 2){
        if (number < 2 || number % 2 == 0) {
            return false;
        }
        for(int i=3; (i*i)<=number; i+=2){
            if(number % i == 0 ){
                return false;
            }
        }
    }
    return true;
}

Javascript

function isPrime(number)
{
    if (number !== 2) {
        if (number < 2 || number % 2 === 0) {
            return false;
        }
        for (var i=3; (i*i)<=number; i+=2)
        {
            if (number % 2 === 0){
                return false;
            }
        }
    }
    return true;
}

Python

def isPrime(number):
    if (number != 2):
        if (number < 2 or number % 2 == 0):
            return False
        i = 3
        while (i*i) <= number:
            if(number % i == 0 ):
                return False;
            i += 2
    return True;
Val Neekman
  • 17,692
  • 14
  • 63
  • 66
5

I would guess taking sqrt and running foreach frpm 2 to sqrt+1 if(input% number!=0) return false; once you reach sqrt+1 you can be sure its prime.

Valentin Kuzub
  • 11,703
  • 7
  • 56
  • 93
3

If you know the range of the inputs (which you do since your function takes an int), you can precompute a table of primes less than or equal to the square root of the max input (2^31-1 in this case), and then test for divisibility by each prime in the table less than or equal to the square root of the number given.

user470379
  • 4,879
  • 16
  • 21
  • That could done via the Sieve of Eratosthenes, but if the range is too large, there won't be enough memory for the system to use. And anyways, half of the memory would be wasted, all the even numbers are obviously composite. Guess a map (or a deque? Forgot which is the C++ equivalent of a PHP associative array) would work best, to store all the prime numbers below a number, after you determine the prime numbers using the sieve. If it's not in the array, then it's composite. – LostInTheCode Dec 12 '10 at 23:08
  • @LostInTheCode There are only approximately 4300 or so numbers you would need in the table. Reread what I wrote. I didn't say to create a table saying whether each number from 1 to 2^31 is prime -- I said to store only the prime numbers from 1 to sqrt(2^31) and test the number for divisibility by each of those numbers. – user470379 Dec 13 '10 at 19:36
2

Use mathematics first find square root of number then start loop till the number ends which you get after square rooting. check for each value whether the given number is divisible by the iterating value .if any value divides the given number then it is not a prime number otherwise prime. Here is the code

 bool is_Prime(int n)
 {

   int square_root = sqrt(n); // use math.h
   int toggle = 1;
   for(int i = 2; i <= square_root; i++)
   {
     if(n%i==0)
     { 
        toggle = 0;
        break;
     }
   }

   if(toggle)
     return true;
   else
     return false;

 } 
Dev Kumar
  • 89
  • 1
  • 3
  • 1
    Rather than comparing i to sqrt(n), it may be faster to compare i*i to n. – Filip Frącz Jan 14 '16 at 17:59
  • @FilipFrącz `sqrt(n)` is a one time computation cost. "compare i*i to n" versus `i <= square_root` is a repeated cost, so _faster_ really only applies with small `n`. Note with large primes, `i*i` risks overflow. `i <= n/i` does not. – chux - Reinstate Monica Apr 19 '22 at 09:36
2
bool check_prime(int num) {
    for (int i = num - 1; i > 1; i--) {
        if ((num % i) == 0)
            return false;
    }
    return true;
}

checks for any number if its a prime number

2

This code only checks if the number is divisible by two. For a number to be prime, it must not be evenly divisible by all integers less than itself. This can be naively implemented by checking if it is divisible by all integers less than floor(sqrt(n)) in a loop. If you are interested, there are a number of much faster algorithms in existence.

Michael Koval
  • 8,207
  • 5
  • 42
  • 53
2

If you are lazy, and have a lot of RAM, create a sieve of Eratosthenes which is practically a giant array from which you kicked all numbers that are not prime. From then on every prime "probability" test will be super quick. The upper limit for this solution for fast results is the amount of you RAM. The upper limit for this solution for superslow results is your hard disk's capacity.

karatedog
  • 2,508
  • 19
  • 29
  • working in segments, you only need to store the primes below `sqrt` of your upper limit. The segment array can be further shrinked by using bits, working with odds only, or even 2-3-5-coprimes. – Will Ness Jan 20 '13 at 09:45
  • Putting everything to bits from bytes you gain a 2^3 multiply of your space, which is insignificant if you are hunting for large primes. And if you store 2,3,5,7 and such primes as integers, you have to store those numbers at least as a 32 bit integer, which is a waste. – karatedog Jan 25 '13 at 22:57
  • working *segment* by narrow *segment* ... storing **`sqrt(N)`** `int` primes is worth it. – Will Ness Jan 25 '13 at 23:23
2

I follow same algorithm but different implementation that loop to sqrt(n) with step 2 only odd numbers because I check that if it is divisible by 2 or 2*k it is false. Here is my code

public class PrimeTest {

    public static boolean isPrime(int i) {
        if (i < 2) {
            return false;
        } else if (i % 2 == 0 && i != 2) {
            return false;
        } else {
            for (int j = 3; j <= Math.sqrt(i); j = j + 2) {
                if (i % j == 0) {
                    return false;
                }
            }
            return true;
        }
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        for (int i = 1; i < 100; i++) {
            if (isPrime(i)) {
                System.out.println(i);
            }
        }
    }

}
2

Someone had the following.

bool check_prime(int num) {
for (int i = num - 1; i > 1; i--) {
    if ((num % i) == 0)
        return false;
}
return true;
}

This mostly worked. I just tested it in Visual Studio 2017. It would say that anything less than 2 was also prime (so 1, 0, -1, etc.)

Here is a slight modification to correct this.

bool check_prime(int number)
{
    if (number > 1)
    {
        for (int i = number - 1; i > 1; i--)
        {
            if ((number % i) == 0)
                return false;
        }
        return true;
    }
    return false;
}
mkrieger1
  • 19,194
  • 5
  • 54
  • 65
Joe C
  • 21
  • 1
  • Starting from `number - 1` and working down is functionally correct yet inefficient. A possible factor is much more likely a small value than a large one. All factor tests above the square root of `number` and less than `number` fail: `(number % i) == 0` is never true there. With large `number`, this is expensive to test with no benefit. – chux - Reinstate Monica Apr 19 '22 at 09:29
1

Count by 6 for better speed:

bool isPrime(int n)
{
    if(n==1) return false;
    if(n==2 || n==3) return true;
    if(n%2==0 || n%3==0) return false;

    for(int i=5; i*i<=n; i=i+6)
        if(n%i==0 || n%(i+2)==0)
            return false;

    return true;          
}
General Grievance
  • 4,555
  • 31
  • 31
  • 45
0

If n is 2, it's prime.

If n is 1, it's not prime.

If n is even, it's not prime.

If n is odd, bigger than 2, we must check all odd numbers 3..sqrt(n)+1, if any of this numbers can divide n, n is not prime, else, n is prime.

For better performance i recommend sieve of eratosthenes.

Here is the code sample:

bool is_prime(int n)
{
  if (n == 2) return true;
  if (n == 1 || n % 2 == 0) return false;

  for (int i = 3; i*i < n+1; i += 2) {
      if (n % i == 0) return false;
  }

  return true;
}
izanbf1803
  • 51
  • 5
0

I came up with this:

int counter = 0;

bool checkPrime(int x) {
   for (int y = x; y > 0; y--){
      if (x%y == 0) {
         counter++;
      }
   }
   if (counter == 2) {
      counter = 0; //resets counter for next input
      return true; //if its only divisible by two numbers (itself and one) its a prime
   }
   else counter = 0;
        return false;
}
Pang
  • 9,564
  • 146
  • 81
  • 122
0

There are several different approches to this problem.
The "Naive" Method: Try all (odd) numbers up to (the root of) the number.
Improved "Naive" Method: Only try every 6n ± 1.
Probabilistic tests: Miller-Rabin, Solovay-Strasse, etc.

Which approach suits you depends and what you are doing with the prime.
You should atleast read up on Primality Testing.

Sani Huttunen
  • 23,620
  • 6
  • 72
  • 79
  • One of my favorite pastimes, reading on Primality Testing. Always has been my favorite subject in Number Theory. Oh, and you left out Deterministic tests. ECM and AKS seems to be leading that category. – LostInTheCode Dec 12 '10 at 22:59
  • Yes I didn't list all types of tests. I left that as an excercise for the reader. ;) – Sani Huttunen Dec 13 '10 at 15:50
  • A test for every 6n+1 numbers will skip over many primes. Many primes are only 4 or 2 less than the next highest prime. (See the Wikipedia articles on twin primes and cousin primes.) – RichS Jul 31 '17 at 06:41
  • @RichS: You need to read my answer again... I dont state that you should only test for `6n + 1` numbers... I state you should test every `6n ± 1`... that is `6n + 1` AND `6n - 1`... This has been proven to be correct... – Sani Huttunen Jul 31 '17 at 14:12
  • If there is a proof that 6n +/- 1 works, can you post a link to that proof? – RichS Jul 31 '17 at 16:47
  • You can prove this yourself... but to clarify, you can read this for example: http://primes.utm.edu/notes/faq/six.html – Sani Huttunen Jul 31 '17 at 18:37
  • Now I know what you meant. I thought you were suggesting something else when I first read it. – RichS Jul 31 '17 at 23:36
0

This is a quick efficient one:

bool isPrimeNumber(int n) {
    int divider = 2;
    while (n % divider != 0) {
        divider++;
    }
    if (n == divider) {
        return true;
    }
    else {
        return false;
    }
}

It will start finding a divisible number of n, starting by 2. As soon as it finds one, if that number is equal to n then it's prime, otherwise it's not.

0
//simple function to determine if a number is a prime number
//to state if it is a prime number

#include <iostream>

using namespace std;

int isPrime(int x); //functioned defined after int main()

int main() {
  int y;
  cout << "enter value" << endl;

  cin >> y;

  isPrime(y);

  return 0;

} //end of main function

//-------------function

int isPrime(int x) {
  int counter = 0;
  cout << "factors of " << x << " are " << "\n\n"; //print factors of the number

  for (int i = 0; i <= x; i++)
  {
    for (int j = 0; j <= x; j++)
    {
      if (i * j == x) //check if the number has multiples;
      {
        cout << i << " ,  "; //output provided for the reader to see the
        // muliples
        ++counter; //counts the number of factors
      }
    }
  }
  cout << "\n\n";

  if (counter > 2) {
    cout << "value is not a prime number" << "\n\n";
  }

  if (counter <= 2) {
    cout << "value is a prime number" << endl;
  }
}
General Grievance
  • 4,555
  • 31
  • 31
  • 45
  • 1
    This is not a real answer. While this may, or may not, solve the issue described in the OP, you need to add more context and explanation on what caused the original issue and how your solution fixes it. – GMB Dec 10 '18 at 23:37
  • The function returns nothing and will fault. – General Grievance Sep 30 '21 at 15:14
0

Here is a C++ code to determine that a given number is prime:

bool isPrime(int num)
{
    if(num < 2) return false;
    for(int i = 2; i <= sqrt(num); i++)
        if(num % i == 0) return false;
    return true;
}

PS Don't forget to include math.h library to use sqrt function

epix
  • 133
  • 1
  • 9
0

Here is a simple program to check whether a number is prime or not:

#include <iostream>  
using namespace std;  
int main()  
{  
  int n, i, m=0, flag=0;  
  cout << "Enter the Number to check Prime: ";  
  cin >> n;  
  m=n/2;  
  for(i = 2; i <= m; i++)  
  {  
      if(n % i == 0)  
      {  
          cout<<"Number is not Prime."<<endl;  
          flag=1;  
          break;  
      }  
  }  
  if (flag==0)  
      cout << "Number is Prime."<<endl;  
  return 0;  
}
Ivan Shatsky
  • 13,267
  • 2
  • 21
  • 37
0

well crafted, share it with you:

bool isPrime(int num) {
    if (num == 2) return true;
    if (num < 2) return false;
    if (num % 2 == 0) return false;
    
    for (int i = num - 1; i > 1; i--) {
        if (num % i == 0) return false;
    }
    
    return true;
}
Amir2mi
  • 896
  • 9
  • 13
0

There are many potential optimization in prime number testing.

Yet many answers here, not only are worse the O(sqrt(n)), they suffer from undefined behavior (UB) and incorrect functionality.

A simple prime test:

// Return true when number is a prime.
bool is_prime(int number) {
  // Take care of even values, it is only a bit test.
  if (number % 2 == 0) {
    return number == 2;
  }

  // Loop from 3 to square root (n)
  for (int test_factor = 3; test_factor <= number / test_factor; test_factor +=
      2) {
    if (number % test_factor == 0) {
      return false;
    }
  }
  return n > 1;
}
  • Do not use test_factor * test_factor <= number. It risks signed integer overflow (UB) for large primes.

  • Good compilers see nearby number/test_factor and number % test_factor and emit code that computes both for the about the time cost of one. If still concerned, consider div().

  • Avoid sqrt(n). Weak floating point libraries do not perform this as exactly as we need for this integer problem, possible returning a value just ever so less than an expected whole number. If still interested in a sqrt(), use lround(sqrt(n)) once before the loop.

  • Avoid sqrt(n) with wide integer types of n. Conversion of n to a double may lose precision. long double may fair no better.

  • Test to insure the prime test code does not behave poorly or incorrectly with 1, 0 or any negative value.

  • Consider bool is_prime(unsigned number) or bool is_prime(uintmax_t number) for extended range.

  • Avoid testing with candidate factors above the square root n and less than n. Such test factors are never factors of n. Not adhering to this makes for slow code.

  • A factor is more likely a small value that an large one. Testing small values first is generally far more efficient for non-primes.

  • Pedantic: Avoid if (number & 1 == 0) {. It is an incorrect test when number < 0 and encoded with rare ones' complement. Use if (number % 2 == 0) { and trust your compiler to emit good code.


More advanced techniques use a list of known/discovered primes and the Sieve of Eratosthenes.

chux - Reinstate Monica
  • 143,097
  • 13
  • 135
  • 256
-1

I Have Use This Idea For Finding If The No. Is Prime or Not:

#include <conio.h> 
#include <iostream>
using namespace std;
int main() {
  int x, a;
  cout << "Enter The No. :";
  cin >> x;
  int prime(unsigned int);
  a = prime(x);
  if (a == 1)
    cout << "It Is A Prime No." << endl;
  else
  if (a == 0)
    cout << "It Is Composite No." << endl;
  getch();
}

int prime(unsigned int x) {
  if (x == 1) {
    cout << "It Is Neither Prime Nor Composite";
    return 2;
  }
  if (x == 2 || x == 3 || x == 5 || x == 7)
    return 1;
  if (x % 2 != 0 && x % 3 != 0 && x % 5 != 0 && x % 7 != 0)
    return 1;
  else
    return 0;
}
SouvikMaji
  • 1,088
  • 3
  • 22
  • 39
-1
#define TRUE 1
#define FALSE -1

int main()
{
/* Local variables declaration */
int num = 0;
int result = 0;

/* Getting number from user for which max prime quadruplet value is 
to be found */
printf("\nEnter the number :");
scanf("%d", &num);

result = Is_Prime( num );

/* Printing the result to standard output */
if (TRUE == result)
    printf("\n%d is a prime number\n", num);
else
    printf("\n%d is not a prime number\n", num);

return 0;
}

int Is_Prime( int num )
{
int i = 0;

/* Checking whether number is negative. If num is negative, making
it positive */
if( 0 > num )
    num = -num;

/* Checking whether number is less than 2 */
if( 2 > num )
    return FALSE;

/* Checking if number is 2 */
if( 2 == num )
    return TRUE;

/* Checking whether number is even. Even numbers
are not prime numbers */
if( 0 == ( num % 2 ))
    return FALSE;

/* Checking whether the number is divisible by a smaller number
1 += 2, is done to skip checking divisibility by even numbers.
Iteration reduced to half */
for( i = 3; i < num; i += 2 )
    if( 0 == ( num % i ))
        /* Number is divisible by some smaller number, 
        hence not a prime number */
        return FALSE;

return TRUE;
}
Will Ness
  • 70,110
  • 9
  • 98
  • 181
Kapil
  • 1
  • You can even reduce iterations using `for( i = 3; (i*i) < num; i += 2 )` Note the `(i*i) < num` compared to your original code based on simply `i < num` Let me know if you update your answer... Cheers – oHo Apr 09 '16 at 09:31
  • Defining custom `TRUE` and `FALSE` values seems really strange to me. – General Grievance Sep 30 '21 at 15:15
-3
if(number%2!=0)
      cout<<"Number is prime:"<<endl;

The code is incredibly false. 33 divided by 2 is 16 with reminder of 1 but it's not a prime number...

JB King
  • 11,860
  • 4
  • 38
  • 49