Click here to Skip to main content
15,891,033 members
Articles / Programming Languages / C
Tip/Trick

Quicker Prime Number Test

Rate me:
Please Sign up or sign in to vote.
4.74/5 (17 votes)
11 Feb 2012CPOL1 min read 38.4K   7   7
Prime Number Testing

Introduction


I've tried to harness C's speed and an efficient algorithm for prime number testing.


Background


What you need to know is 2 facts.



  • If the number can be factored into two numbers, at least one of them should be less than or equal to its square root.
  • Every prime number can be represented by the form 6k+1 or 6k-1.

Explanation


The two facts I just mentioned are converted to code here.


C++
#include <stdio.h>
#include <math.h>
main()
{
  unsigned long int testno;
  unsigned long int i=0;
  unsigned long int testsqrt;
  printf("Enter number for checking : \n");
  scanf("%lu",&testno);
  if(testno==2||testno==3){
  printf("\nPrime");
  getch();
  exit();}
  if(((testno+1)%6==0)||(((testno-1)%6)==0)||(testno%2!=0)||(testno%3!=0))
  {
    testsqrt=ceil(sqrt(testno));
    for(i=5;i<=testsqrt;i++)
    {
      if(i%2==0||i%3==0)
        continue;
      if(testno%i==0)
      {
        printf("\nNot Prime");
        getch();
        exit();
      }
    }
  }
  else
  {
    printf("\nNot Prime");
    getch();
    exit();
  }
  printf("\nPrime");
  getch();
}

First, it checks if the number is 2 or 3 and if it is one of them, it prints that the number is prime.


The line:


C++
if(((testno+1)%6==0)||(((testno-1)%6)==0)||(testno%2!=0)||(testno%3!=0))

filters out a majority of the non-prime numbers.


First, it tests if the number can be represented by the form 6k+1 or 6k-1 and then if it is a multiple of 2 or 3.


If it can be represented in either of the forms(6k+1 or 6k-1), then it proceeds to the checking loop.


If the condition fails, the program exits after printing "Not Prime".


Then, testsqrt stores the square root of testno(the number the user inputs).


The loop counter i starts from 5 (2 and 3 have been already checked. Every multiple of 4 is divisible by 2 which has already been checked too).


Then, the counter is checked if it is even or if it is a multiple of 3. If it is either, then the program proceeds to the next iteration.


Then, the program checks if testno is a multiple of the current number(counter).


If it is, then the program prints "Not Prime".


If no number divides testno, finally, the program prints that the number is prime and exits.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Student
India India
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
GeneralMy 5 Pin
Manish K. Agarwal2-May-13 22:49
Manish K. Agarwal2-May-13 22:49 
QuestionValidity of formula Pin
LWessels21-Aug-12 4:59
LWessels21-Aug-12 4:59 
It is easy to see that the rule is valid when performing the sieve algorithm with the numbers 2 and 3 with lines of length 6. All the primes will be in second and last columns (assuming you start at 0), next to the one that is a multiple of 6.
AnswerRe: Validity of formula Pin
Anshul R25-Sep-12 3:24
Anshul R25-Sep-12 3:24 
GeneralMy vote of 5 Pin
pasztorpisti12-Aug-12 22:59
pasztorpisti12-Aug-12 22:59 
QuestionGood One Pin
Chandrasekharan P7-Mar-12 22:11
Chandrasekharan P7-Mar-12 22:11 
Generalawesome... Pin
kr_harsha16-Feb-12 4:53
kr_harsha16-Feb-12 4:53 
GeneralReason for my vote of 5 I did not knew the 6k 1 or 6k-1 rule... Pin
frobertpixto23-Jan-12 14:01
frobertpixto23-Jan-12 14:01 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.