Skip to content
Related Articles

Related Articles

Save Article
Improve Article
Save Article
Like Article

Check if a number is Prime, Semi-Prime or Composite for very large numbers

  • Difficulty Level : Hard
  • Last Updated : 18 Oct, 2021

Given a very large number N (> 150), the task is to check whether this number is Prime, Semi-Prime or Composite.
Example: 

Input: N = 90000000 
Output: Not Prime 
Explanation: 
we have (N-1)%6 = 89999999%6 = 1 and 
(N+1)%6 = 90000001%6 = 5 
Since n-1 and n+1 is not divisible by 6 
Therefore N = 90000000 is Not Prime
Input: N = 7894561 
Output: Semi-Prime 
Explanation: 
Here N = 7894561 = 71*111191 
Since 71 & 111191 are prime, therefore 7894561 is Semi Prime 
 

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.

Approach: 



  • It can be observed that if n is a Prime Number then n+1 or n-1 will be divisible by 6
  • If a number n exists such that neither n+1 nor n-1 is divisible by 6 then n is not a prime number
  • If a number n exists such that either n+1 or n-1 is divisible by 6 then n is either a prime or a semiprime number
  • To differentiate between prime and semi-prime, the following method is used: 
    • If N is semi prime then, 
N = p*q  ....................(1)
where p & q are primes.
p + q must be even
i.e, p + q = 2*n for any positive integer n
  • Therefore solving for p & q will give 
p = n - sqrt(n2 - N)
q = n + sqrt(n2 - N)
  • Let n2 – N be perfect square, Then 
n2 - N = m2, .................(2)
for any positive integer m 
  • Solving Equations (1) & (2) we get 
m = (q-p)/2
n = (p+q)/2
  • Now if equation (1) & (2) meets at some point, then there exists a pair (p, q) such that the number N is semiprime otherwise N is prime.
  • Equation(2) forms Pythagorean Triplet 
     

  • The solution expected varies on the graph 
     

Pseudo code: 

  • Input a number N and if N – 1 and N + 1 is not divisible by 6 then the number N is Not Prime. else it is prime or semi-prime
  • If n-1 or n+1 is divisible by 6 then iterate in the range(sqrt(N) + 1, N) and find a pair (p, q) such that p*q = N by below formula: 
p = i - sqrt(i*i - N)
q = n/p
where i = index in range(sqrt(N) + 1, N)
  • If p*q = N then the number N is semi prime, else it is prime

Below is the implementation of the above approach: 
 

Java




import static java.lang.Math.sqrt;
 
public class Primmefunc {
 
    public static void prime(long n)
    {
        int flag = 0;
 
        // checking divisibility by 6
        if ((n + 1) % 6 != 0 && (n - 1) % 6 != 0) {
            System.out.println("Not Prime");
        }
        else {
 
            // breakout if number is perfect square
            double s = sqrt(n);
            if ((s * s) == n) {
                System.out.println("Semi-Prime");
            }
            else {
                long f = (long)s;
                long l = (long)((f * f));
 
                // Iterating over to get the
                // closest average value
                for (long i = f + 1; i < l; i++) {
 
                    // 1st Factor
                    long p = i - (long)(sqrt((i * i) - (n)));
 
                    // 2nd Factor
                    long q = n / p;
 
                    // To avoid Convergence
                    if (p < 2 || q < 2) {
                        break;
                    }
 
                    // checking semi-prime condition
                    if ((p * q) == n) {
                        flag = 1;
                        break;
                    }
 
                    // If convergence found
                    // then number is semi-prime
                    else {
 
                        // convergence not found
                        // then number is prime
                        flag = 2;
                    }
                }
 
                if (flag == 1) {
                    System.out.println("Semi-Prime");
                }
                else if (flag == 2) {
 
                    System.out.println("Prime");
                }
            }
        }
    }
 
    public static void main(String[] args)
    {
        // Driver code
        // Entered number should be greater
        // than 300 to avoid Convergence of
        // second factor to 1
        prime(8179);
        prime(7894561);
        prime(90000000);
        prime(841);
        prime(22553);
        prime(1187);
    }
//written by Rushil Jhaveri
}

CPP




#include<bits/stdc++.h>
using namespace std ;
 
void prime(long n)
{
    int flag = 0;
 
    // checking divisibility by 6
    if ((n + 1) % 6 != 0 && (n - 1) % 6 != 0)
    {
        cout << ("Not Prime") << endl;
    }
    else
    {
 
        // breakout if number is perfect square
        double s = sqrt(n);
        if ((s * s) == n)
        {
            cout<<("Semi-Prime")<<endl;
        }
        else
        {
            long f = (long)s;
            long l = (long)((f * f));
 
            // Iterating over to get the
            // closest average value
            for (long i = f + 1; i < l; i++)
            {
 
                // 1st Factor
                long p = i - (long)(sqrt((i * i) - (n)));
 
                // 2nd Factor
                long q = n / p;
 
                // To avoid Convergence
                if (p < 2 || q < 2)
                {
                    break;
                }
 
                // checking semi-prime condition
                if ((p * q) == n)
                {
                    flag = 1;
                    break;
                }
 
                // If convergence found
                // then number is semi-prime
                else
                {
 
                    // convergence not found
                    // then number is prime
                    flag = 2;
                }
            }
 
            if (flag == 1)
            {
                cout<<("Semi-Prime")<<endl;
            }
            else if (flag == 2)
            {
 
                cout<<("Prime")<<endl;
            }
        }
    }
}
 
// Driver code
int main()
{
     
    // Entered number should be greater
    // than 300 to avoid Convergence of
    // second factor to 1
    prime(8179);
    prime(7894561);
    prime(90000000);
    prime(841);
    prime(22553);
    prime(1187);
}
 
// This code is contributed by Rajput-Ji

Python3




def prime(n):
    flag = 0;
 
    # checking divisibility by 6
    if ((n + 1) % 6 != 0 and (n - 1) % 6 != 0):
        print("Not Prime");
    else:
 
        # breakout if number is perfect square
        s = pow(n, 1/2);
        if ((s * s) == n):
            print("Semi-Prime");
        else:
            f = int(s);
            l = int(f * f);
 
            # Iterating over to get the
            # closest average value
            for i in range(f + 1, l):
 
                # 1st Factor
                p = i - (pow(((i * i) - (n)), 1/2));
 
                # 2nd Factor
                q = n // p;
 
                # To avoid Convergence
                if (p < 2 or q < 2):
                    break;
                 
                # checking semi-prime condition
                if ((p * q) == n):
                    flag = 1;
                    break;
                 
                # If convergence found
                # then number is semi-prime
                else:
 
                    # convergence not found
                    # then number is prime
                    flag = 2;
                 
            if (flag == 1):
                print("Semi-Prime");
            elif(flag == 2):
 
                print("Prime");
             
# Driver code
if __name__ == '__main__':
 
    # Entered number should be greater
    # than 300 to avoid Convergence of
    # second factor to 1
    prime(8179);
    prime(7894561);
    prime(90000000);
    prime(841);
    prime(22553);
    prime(1187);
 
# This code is contributed by 29AjayKumar

C#




using System;
public class Primmefunc
{
 
    public static void prime(long n)
    {
        int flag = 0;
 
        // checking divisibility by 6
        if ((n + 1) % 6 != 0 && (n - 1) % 6 != 0)
        {
            Console.WriteLine("Not Prime");
        }
        else
        {
 
            // breakout if number is perfect square
            double s = Math.Sqrt(n);
            if ((s * s) == n)
            {
                Console.WriteLine("Semi-Prime");
            }
            else
            {
                long f = (long)s;
                long l = (long)((f * f));
 
                // Iterating over to get the
                // closest average value
                for (long i = f + 1; i < l; i++)
                {
 
                    // 1st Factor
                    long p = i - (long)(Math.Sqrt((i * i) - (n)));
 
                    // 2nd Factor
                    long q = n / p;
 
                    // To avoid Convergence
                    if (p < 2 || q < 2)
                    {
                        break;
                    }
 
                    // checking semi-prime condition
                    if ((p * q) == n)
                    {
                        flag = 1;
                        break;
                    }
 
                    // If convergence found
                    // then number is semi-prime
                    else
                    {
 
                        // convergence not found
                        // then number is prime
                        flag = 2;
                    }
                }
 
                if (flag == 1)
                {
                    Console.WriteLine("Semi-Prime");
                }
                else if (flag == 2)
                {
                    Console.WriteLine("Prime");
                }
            }
        }
    }
 
    // Driver code
    public static void Main(String[] args)
    {
        // Entered number should be greater
        // than 300 to avoid Convergence of
        // second factor to 1
        prime(8179);
        prime(7894561);
        prime(90000000);
        prime(841);
        prime(22553);
        prime(1187);
    }
}
 
// This code is contributed by 29AjayKumar
Output: 
Prime
Semi-Prime
Not Prime
Semi-Prime
Semi-Prime
Prime

 

Time Complexity: O(N) 
 




My Personal Notes arrow_drop_up
Recommended Articles
Page :