Check if a number is Prime, Semi-Prime or Composite for very large numbers
Last Updated :
22 Sep, 2022
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:
- 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:
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 ;
if ((n + 1 ) % 6 != 0 && (n - 1 ) % 6 != 0 ) {
System.out.println( "Not Prime" );
}
else {
double s = sqrt(n);
if ((s * s) == n) {
System.out.println( "Semi-Prime" );
}
else {
long f = ( long )s;
long l = ( long )((f * f));
for ( long i = f + 1 ; i < l; i++) {
long p = i - ( long )(sqrt((i * i) - (n)));
long q = n / p;
if (p < 2 || q < 2 ) {
break ;
}
if ((p * q) == n) {
flag = 1 ;
break ;
}
else {
flag = 2 ;
}
}
if (flag == 1 ) {
System.out.println( "Semi-Prime" );
}
else if (flag == 2 ) {
System.out.println( "Prime" );
}
}
}
}
public static void main(String[] args)
{
prime( 8179 );
prime( 7894561 );
prime( 90000000 );
prime( 841 );
prime( 22553 );
prime( 1187 );
}
}
|
CPP
#include<bits/stdc++.h>
using namespace std ;
void prime( long n)
{
int flag = 0;
if ((n + 1) % 6 != 0 && (n - 1) % 6 != 0)
{
cout << ( "Not Prime" ) << endl;
}
else
{
double s = sqrt (n);
if ((s * s) == n)
{
cout<<( "Semi-Prime" )<<endl;
}
else
{
long f = ( long )s;
long l = ( long )((f * f));
for ( long i = f + 1; i < l; i++)
{
long p = i - ( long )( sqrt ((i * i) - (n)));
long q = n / p;
if (p < 2 || q < 2)
{
break ;
}
if ((p * q) == n)
{
flag = 1;
break ;
}
else
{
flag = 2;
}
}
if (flag == 1)
{
cout<<( "Semi-Prime" )<<endl;
}
else if (flag == 2)
{
cout<<( "Prime" )<<endl;
}
}
}
}
int main()
{
prime(8179);
prime(7894561);
prime(90000000);
prime(841);
prime(22553);
prime(1187);
}
|
Python3
def prime(n):
flag = 0 ;
if ((n + 1 ) % 6 ! = 0 and (n - 1 ) % 6 ! = 0 ):
print ( "Not Prime" );
else :
s = pow (n, 1 / 2 );
if ((s * s) = = n):
print ( "Semi-Prime" );
else :
f = int (s);
l = int (f * f);
for i in range (f + 1 , l):
p = i - ( pow (((i * i) - (n)), 1 / 2 ));
q = n / / p;
if (p < 2 or q < 2 ):
break ;
if ((p * q) = = n):
flag = 1 ;
break ;
else :
flag = 2 ;
if (flag = = 1 ):
print ( "Semi-Prime" );
elif (flag = = 2 ):
print ( "Prime" );
if __name__ = = '__main__' :
prime( 8179 );
prime( 7894561 );
prime( 90000000 );
prime( 841 );
prime( 22553 );
prime( 1187 );
|
C#
using System;
public class Primmefunc
{
public static void prime( long n)
{
int flag = 0;
if ((n + 1) % 6 != 0 && (n - 1) % 6 != 0)
{
Console.WriteLine( "Not Prime" );
}
else
{
double s = Math.Sqrt(n);
if ((s * s) == n)
{
Console.WriteLine( "Semi-Prime" );
}
else
{
long f = ( long )s;
long l = ( long )((f * f));
for ( long i = f + 1; i < l; i++)
{
long p = i - ( long )(Math.Sqrt((i * i) - (n)));
long q = n / p;
if (p < 2 || q < 2)
{
break ;
}
if ((p * q) == n)
{
flag = 1;
break ;
}
else
{
flag = 2;
}
}
if (flag == 1)
{
Console.WriteLine( "Semi-Prime" );
}
else if (flag == 2)
{
Console.WriteLine( "Prime" );
}
}
}
}
public static void Main(String[] args)
{
prime(8179);
prime(7894561);
prime(90000000);
prime(841);
prime(22553);
prime(1187);
}
}
|
Javascript
<script>
function prime(n)
{
var flag = 0;
if ((n + 1) % 6 != 0 && (n - 1) % 6 != 0) {
document.write( "Not Prime<br>" );
}
else {
var s = parseInt(Math.sqrt(n));
if ((s * s) == n) {
document.write( "Semi-Prime<br>" );
}
else {
var f = s;
var l = ((f * f));
for ( var i = f + 1; i < l; i++) {
var p = i - parseInt(Math.sqrt((i * i) - (n)));
var q = parseInt(n / p);
if (p < 2 || q < 2) {
break ;
}
if ((p * q) == n) {
flag = 1;
break ;
}
else {
flag = 2;
}
}
if (flag == 1) {
document.write( "Semi-Prime<br>" );
}
else if (flag == 2) {
document.write( "Prime<br>" );
}
}
}
}
prime(8179);
prime(7894561);
prime(90000000);
prime(841);
prime(22553);
prime(1187);
</script>
|
Output:
Prime
Semi-Prime
Not Prime
Semi-Prime
Semi-Prime
Prime
Time Complexity: O(N)
Auxiliary space: O(1)
Share your thoughts in the comments
Please Login to comment...