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

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 1 & 5 are 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

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 divisble 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.
```
• Then from Goldbach Conjecture:
```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 composite or semi-prime
• If the number is Not Prime 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:

## CPP

 `#include ` `using` `namespace` `std ; ` ` `  `void` `prime(``long` `n) ` `{ ` `    ``int` `flag = 0; ` ` `  `    ``// checking divisibilty 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"``)<

## Java

 `import` `static` `java.lang.Math.sqrt; ` ` `  `public` `class` `Primmefunc { ` ` `  `    ``public` `static` `void` `prime(``long` `n) ` `    ``{ ` `        ``int` `flag = ``0``; ` ` `  `        ``// checking divisibilty 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``); ` `    ``} ` `} `

## Python3

 `def` `prime(n): ` `    ``flag ``=` `0``; ` ` `  `    ``# checking divisibilty 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 divisibilty 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

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.

Improved By : 29AjayKumar, Rajput-Ji