Find Prime number just less than and just greater each element of given Array
Given an integer array A[] of size N, the task is to find the prime numbers just less and just greater than A[i] (for all 0<=i<N).
Examples:
Input: A={17, 28}, N=2
Output:
13 19
23 29
Explanation:
13 is the prime number just less than 17.
19 is the prime number just greater than 17.
23 is the prime number just less than 28.
29 is the prime number just greater than 28.
Input: A={126, 64, 2896, 156}, N=4
Output:
113 127
61 67
2887 2897
151 157
Naive Approach:
Observation: The Maximal Primal Gap for numbers less than 109 is 292.
The Naive Approach would be to check for primality by checking if a number has any factor other than 1 and itself. Follow the steps below to solve the problem:
Traverse the array A, and for each current index i, do the following:
- Iterate from A[i]-1 in the descending order, and for each current index j, do the following:
- Check if j is prime or not by checking if it has any factor other than 1 and itself.
- If j is prime, print j and terminate the inner loop. This gives the prime number just less than A[i].
- Iterate from A[i]+1 in the ascending order, and for each current index j, do the following:
- Check if j is prime or not by checking if it has any factor other than 1 and itself.
- If j is prime, print j and terminate the inner loop. This gives the prime number just less than A[i],
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
bool isPrime( int X)
{
for ( int i = 2; i * i <= X; i++)
if (X % i == 0)
return false ;
return true ;
}
void printPrimes( int A[], int N)
{
for ( int i = 0; i < N; i++) {
for ( int j = A[i] - 1;; j--) {
if (isPrime(j)) {
cout << j << " " ;
break ;
}
}
for ( int j = A[i] + 1;; j++) {
if (isPrime(j)) {
cout << j << " " ;
break ;
}
}
cout << endl;
}
}
int main()
{
int A[] = { 17, 28 };
int N = sizeof (A) / sizeof (A[0]);
printPrimes(A, N);
return 0;
}
|
Java
import java.io.*;
class GFG{
static boolean isPrime( int X)
{
for ( int i = 2 ; i * i <= X; i++)
if (X % i == 0 )
return false ;
return true ;
}
static void printPrimes( int A[], int N)
{
for ( int i = 0 ; i < N; i++)
{
for ( int j = A[i] - 1 ;; j--)
{
if (isPrime(j))
{
System.out.print(j + " " );
break ;
}
}
for ( int j = A[i] + 1 ;; j++)
{
if (isPrime(j))
{
System.out.print( j + " " );
break ;
}
}
System.out.println();
}
}
public static void main(String[] args)
{
int A[] = { 17 , 28 };
int N = A.length;
printPrimes(A, N);
}
}
|
Python3
from math import sqrt
def isPrime(X):
for i in range ( 2 , int (sqrt(X)) + 1 , 1 ):
if (X % i = = 0 ):
return False
return True
def printPrimes(A, N):
for i in range (N):
j = A[i] - 1
while ( 1 ):
if (isPrime(j)):
print (j, end = " " )
break
j - = 1
j = A[i] + 1
while ( 1 ):
if (isPrime(j)):
print (j, end = " " )
break
j + = 1
print ( "\n" , end = "")
if __name__ = = '__main__' :
A = [ 17 , 28 ]
N = len (A)
printPrimes(A, N)
|
C#
using System;
class GFG{
static bool isPrime( int X)
{
for ( int i = 2; i * i <= X; i++)
if (X % i == 0)
return false ;
return true ;
}
static void printPrimes( int [] A, int N)
{
for ( int i = 0; i < N; i++)
{
for ( int j = A[i] - 1;; j--)
{
if (isPrime(j))
{
Console.Write(j + " " );
break ;
}
}
for ( int j = A[i] + 1;; j++)
{
if (isPrime(j))
{
Console.Write(j + " " );
break ;
}
}
Console.WriteLine();
}
}
public static void Main()
{
int []A = { 17, 28 };
int N = A.Length;
printPrimes(A, N);
}
}
|
Javascript
<script>
function isPrime(X) {
for (let i = 2; i * i <= X; i++)
if (X % i == 0)
return false ;
return true ;
}
function printPrimes(A, N)
{
for (let i = 0; i < N; i++)
{
for (let j = A[i] - 1; ; j--)
{
if (isPrime(j)) {
document.write(j + " " );
break ;
}
}
for (let j = A[i] + 1; ; j++)
{
if (isPrime(j)) {
document.write(j + " " );
break ;
}
}
document.write( "<br>" );
}
}
let A = [17, 28];
let N = A.length;
printPrimes(A, N);
</script>
|
Time Complexity: O(N*G*√M), where G is the maximal primal gap and M is the largest element in A.
Auxiliary Space: O(1)
Efficient Approach 1: Instead of checking for individual numbers, all primes numbers can be recalculated using the Sieve of Eratosthenes.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
const int M = 1e6;
bool isPrime[M];
void SieveOfEratosthenes()
{
memset (isPrime, true , sizeof (isPrime));
for ( int i = 2; i * i <= M; i++) {
if (isPrime[i]) {
for ( int j = i * i; j < M; j += i)
isPrime[j] = false ;
}
}
}
void printPrimes( int A[], int N)
{
SieveOfEratosthenes();
for ( int i = 0; i < N; i++) {
for ( int j = A[i] - 1;; j--) {
if (isPrime[j]) {
cout << j << " " ;
break ;
}
}
for ( int j = A[i] + 1;; j++) {
if (isPrime[j]) {
cout << j << " " ;
break ;
}
}
cout << endl;
}
}
int main()
{
int A[] = { 17, 28 };
int N = sizeof (A) / sizeof (A[0]);
printPrimes(A, N);
return 0;
}
|
Java
import java.util.*;
class GFG{
static int M = 1000000 ;
static boolean isPrime[] = new boolean [M];
static void SieveOfEratosthenes()
{
Arrays.fill(isPrime, true );
for ( int i = 2 ; i * i <= M; i++)
{
if (isPrime[i])
{
for ( int j = i * i; j < M; j += i)
isPrime[j] = false ;
}
}
}
static void printPrimes( int A[], int N)
{
SieveOfEratosthenes();
for ( int i = 0 ; i < N; i++)
{
for ( int j = A[i] - 1 ;; j--)
{
if (isPrime[j])
{
System.out.print( j + " " );
break ;
}
}
for ( int j = A[i] + 1 ;; j++)
{
if (isPrime[j])
{
System.out.print(j + " " );
break ;
}
}
System.out.println();
}
}
public static void main(String[] args)
{
int A[] = { 17 , 28 };
int N = A.length;
printPrimes(A, N);
}
}
|
Python3
M = 1000000
isPrime = [ True ] * M
def SieveOfEratosthenes():
i = 2
while ( 1 ):
if ((i * i) > M):
break
if (isPrime[i]):
j = i * i
while (j < M):
isPrime[j] = False
j + = i
i + = 1
def printPrimes(A, N):
SieveOfEratosthenes()
for i in range (N):
j = A[i] - 1
while ( 1 ):
if (isPrime[j]):
print (j, end = " " )
break
j - = 1
j = A[i] + 1
while ( 1 ):
if (isPrime[j]):
print (j, end = "\n" )
break
j + = 1
A = [ 17 , 28 ]
N = len (A)
printPrimes(A, N)
|
C#
using System;
class GFG {
static int M = 1000000;
static bool [] isPrime = new bool [M];
static void SieveOfEratosthenes()
{
Array.Fill(isPrime, true );
for ( int i = 2; i * i <= M; i++) {
if (isPrime[i]) {
for ( int j = i * i; j < M; j += i)
isPrime[j] = false ;
}
}
}
static void printPrimes( int [] A, int N)
{
SieveOfEratosthenes();
for ( int i = 0; i < N; i++) {
for ( int j = A[i] - 1;; j--) {
if (isPrime[j]) {
Console.Write(j + " " );
break ;
}
}
for ( int j = A[i] + 1;; j++) {
if (isPrime[j]) {
Console.Write(j + " " );
break ;
}
}
Console.WriteLine();
}
}
public static void Main()
{
int [] A = { 17, 28 };
int N = A.Length;
printPrimes(A, N);
}
}
|
Javascript
<script>
const M = 1000000;
let isPrime = new Array(M).fill( true );
function SieveOfEratosthenes()
{
for (let i = 2; i * i <= M; i++) {
if (isPrime[i]) {
for (let j = i * i; j < M; j += i)
isPrime[j] = false ;
}
}
}
function printPrimes(A, N)
{
SieveOfEratosthenes();
for (let i = 0; i < N; i++) {
for (let j = A[i] - 1;; j--) {
if (isPrime[j]) {
document.write(j + " " );
break ;
}
}
for (let j = A[i] + 1;; j++) {
if (isPrime[j]) {
document.write(j + " " );
break ;
}
}
document.write( "<br>" );
}
}
let A = [ 17, 28 ];
let N = A.length;
printPrimes(A, N);
</script>
|
Time Complexity: O(N*G+MLog(Log(M))), where G is the maximal primal gap and M is the largest element in A.
Auxiliary Space: O(M)
Efficient Approach 2: The Millar-Rabin primality test can be used.
C++
#include <bits/stdc++.h>
using namespace std;
int power( int x, unsigned int y, int p)
{
int res = 1;
x = x % p;
while (y > 0) {
if (y & 1)
res = (res * x) % p;
y = y >> 1;
x = (x * x) % p;
}
return res;
}
bool miillerTest( int d, int n)
{
int a = 2 + rand () % (n - 4);
int x = power(a, d, n);
if (x == 1 || x == n - 1)
return true ;
while (d != n - 1) {
x = (x * x) % n;
d *= 2;
if (x == 1)
return false ;
if (x == n - 1)
return true ;
}
return false ;
}
bool isPrime( int n)
{
int k = 4;
if (n <= 1 || n == 4)
return false ;
if (n <= 3)
return true ;
int d = n - 1;
while (d % 2 == 0)
d /= 2;
for ( int i = 0; i < k; i++)
if (!miillerTest(d, n))
return false ;
return true ;
}
void printPrimes( int A[], int N)
{
for ( int i = 0; i < N; i++) {
for ( int j = A[i] - 1;; j--) {
if (isPrime(j)) {
cout << j << " " ;
break ;
}
}
for ( int j = A[i] + 1;; j++) {
if (isPrime(j)) {
cout << j << " " ;
break ;
}
}
cout << endl;
}
}
int main()
{
int A[] = { 17, 28 };
int N = sizeof (A) / sizeof (A[0]);
printPrimes(A, N);
return 0;
}
|
Java
import java.util.*;
class GFG
{
static int power( int x, int y, int p)
{
int res = 1 ;
x = x % p;
while (y > 0 )
{
if (y % 2 == 1 )
res = (res * x) % p;
y = y >> 1 ;
x = (x * x) % p;
}
return res;
}
static boolean miillerTest( int d, int n)
{
int a = 2 + ( int )(Math.random()* 100000 ) % (n - 4 );
int x = power(a, d, n);
if (x == 1 || x == n - 1 )
return true ;
while (d != n - 1 ) {
x = (x * x) % n;
d *= 2 ;
if (x == 1 )
return false ;
if (x == n - 1 )
return true ;
}
return false ;
}
static boolean isPrime( int n)
{
int k = 4 ;
if (n <= 1 || n == 4 )
return false ;
if (n <= 3 )
return true ;
int d = n - 1 ;
while (d % 2 == 0 )
d /= 2 ;
for ( int i = 0 ; i < k; i++)
if (!miillerTest(d, n))
return false ;
return true ;
}
static void printPrimes( int A[], int N)
{
for ( int i = 0 ; i < N; i++)
{
for ( int j = A[i] - 1 ;; j--)
{
if (isPrime(j)) {
System.out.print(j+ " " );
break ;
}
}
for ( int j = A[i] + 1 ;; j++)
{
if (isPrime(j)) {
System.out.print(j+ " " );
break ;
}
}
System.out.println();
}
}
public static void main(String[] args)
{
int A[] = { 17 , 28 };
int N = A.length;
printPrimes(A, N);
}
}
|
Python3
import random, math
def power(x, y, p):
res = 1
x = x % p
y = int (y)
while y > 0 :
if y & 1 :
res = (res * x) % p
y = y >> 1
x = (x * x) % p
return res
def miiller_test(d, n):
a = 2 + math.floor(random.randint( 0 , 1000 ) % (n - 4 ))
x = power(a, d, n)
if x = = 1 or x = = n - 1 :
return True
while d ! = n - 1 :
x = (x * x) % n
d * = 2
if x = = 1 :
return False
if x = = n - 1 :
return True
return False
def is_prime(n):
k = 4
if n < = 1 or n = = 4 :
return False
if n < = 3 :
return True
d = n - 1
while d % 2 = = 0 :
d / = 2
for i in range (k):
if miiller_test(d, n) = = False :
return False
return True
def print_primes(A, N):
for i in range (N):
ans = []
j = A[i] - 1
while True :
if is_prime(j) ! = 0 :
ans.append(j)
break
j - = 1
j = A[i] + 1
while True :
if is_prime(j) ! = 0 :
ans.append(j)
break
j + = 1
print (ans)
A = [ 17 , 28 ]
N = len (A)
print_primes(A, N)
|
C#
using System;
class GFG
{
static int power( int x, int y, int p)
{
int res = 1;
x = x % p;
while (y > 0)
{
if (y %2==1)
res = (res * x) % p;
y = y >> 1;
x = (x * x) % p;
}
return res;
}
static bool miillerTest( int d, int n)
{
Random rnd = new Random();
int a = 2 + ( int )(rnd.NextDouble()*100000) % (n - 4);
int x = power(a, d, n);
if (x == 1 || x == n - 1)
return true ;
while (d != n - 1) {
x = (x * x) % n;
d *= 2;
if (x == 1)
return false ;
if (x == n - 1)
return true ;
}
return false ;
}
static bool isPrime( int n)
{
int k = 4;
if (n <= 1 || n == 4)
return false ;
if (n <= 3)
return true ;
int d = n - 1;
while (d % 2 == 0)
d /= 2;
for ( int i = 0; i < k; i++)
if (!miillerTest(d, n))
return false ;
return true ;
}
static void printPrimes( int [] A, int N)
{
for ( int i = 0; i < N; i++)
{
for ( int j = A[i] - 1;; j--)
{
if (isPrime(j)) {
Console.Write(j+ " " );
break ;
}
}
for ( int j = A[i] + 1;; j++)
{
if (isPrime(j)) {
Console.Write(j+ " " );
break ;
}
}
Console.WriteLine();
}
}
public static void Main()
{
int [] A = { 17, 28 };
int N = A.Length;
printPrimes(A, N);
}
}
|
Javascript
function power(x, y, p)
{
let res = 1;
x = x % p;
while (y > 0) {
if (y & 1)
res = (res * x) % p;
y = y >> 1;
x = (x * x) % p;
}
return res;
}
function miillerTest( d, n)
{
let a = 2 + Math.floor(Math.random() * 10000 + 1)% (n - 4);
let x = power(a, d, n);
if (x == 1 || x == n - 1)
return true ;
while (d != n - 1) {
x = (x * x) % n;
d *= 2;
if (x == 1)
return false ;
if (x == n - 1)
return true ;
}
return false ;
}
function isPrime(n)
{
let k = 4;
if (n <= 1 || n == 4)
return false ;
if (n <= 3)
return true ;
let d = n - 1;
while (d % 2 == 0)
d /= 2;
for (let i = 0; i < k; i++)
if (miillerTest(d, n) == false )
return false ;
return true ;
}
function printPrimes( A, N)
{
for (let i = 0; i < N; i++)
{
let ans=[];
for (let j = A[i] - 1;; j--)
{
if (isPrime(j) != 0) {
ans.push(j);
break ;
}
}
for (let j = A[i] + 1;; j++)
{
if (isPrime(j) != 0)
{
ans.push(j);
break ;
}
}
console.log(ans);
}
}
let A = [ 17, 28 ];
let N =A.length;
printPrimes(A, N);
|
Time Complexity: O(N*G*KLog3M), where G is the maximal primal gap and M is the largest element in A. Here, K=4
Auxiliary Space: O(1)
Last Updated :
01 Feb, 2023
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...