# 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 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

Approach:

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 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``); ` `    ``} ` `//written by Rushil Jhaveri ` `} `

## 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"``)<

## 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)

Don’t stop now and take your learning to the next level. Learn all the important concepts of Data Structures and Algorithms with the help of the most trusted course: DSA Self Paced. Become industry ready at a student-friendly price.

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.