Nearest prime less than given number n
Last Updated :
21 Mar, 2023
You are given a number n ( 3 <= n < 10^6 ) and you have to find nearest prime less than n?
Examples:
Input : n = 10
Output: 7
Input : n = 17
Output: 13
Input : n = 30
Output: 29
A simple solution for this problem is to iterate from n-1 to 2, and for every number, check if it is a prime. If prime, then return it and break the loop. This solution looks fine if there is only one query. But not efficient if there are multiple queries for different values of n.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int prime( int n)
{
if (n & 1)
n -= 2;
else
n--;
int i, j;
for (i = n; i >= 2; i -= 2) {
if (i % 2 == 0)
continue ;
for (j = 3; j <= sqrt (i); j += 2) {
if (i % j == 0)
break ;
}
if (j > sqrt (i))
return i;
}
return 2;
}
int main()
{
int n = 17;
cout << prime(n);
return 0;
}
|
C
#include <math.h>
#include <stdio.h>
int prime( int n)
{
if (n & 1)
n -= 2;
else
n--;
int i, j;
for (i = n; i >= 2; i -= 2) {
if (i % 2 == 0)
continue ;
for (j = 3; j <= sqrt (i); j += 2) {
if (i % j == 0)
break ;
}
if (j > sqrt (i))
return i;
}
return 2;
}
int main()
{
int n = 17;
printf ( "%d" , prime(n));
return 0;
}
|
Java
import java.io.*;
class GFG {
static int prime( int n)
{
if (n % 2 != 0 )
n -= 2 ;
else
n--;
int i, j;
for (i = n; i >= 2 ; i -= 2 ) {
if (i % 2 == 0 )
continue ;
for (j = 3 ; j <= Math.sqrt(i); j += 2 ) {
if (i % j == 0 )
break ;
}
if (j > Math.sqrt(i))
return i;
}
return 2 ;
}
public static void main(String[] args)
{
int n = 17 ;
System.out.print(prime(n));
}
}
|
Python3
from math import floor, sqrt
def prime(n):
if (n & 1 ):
n - = 2
else :
n - = 1
i,j = 0 , 3
for i in range (n, 2 , - 2 ):
if (i % 2 = = 0 ):
continue
while (j < = floor(sqrt(i)) + 1 ):
if (i % j = = 0 ):
break
j + = 2
if (j > floor(sqrt(i))):
return i
return 2
n = 17
print (prime(n))
|
C#
using System;
class GFG
{
static int prime( int n)
{
if (n % 2 != 0)
n -= 2;
else
n--;
int i, j;
for (i = n; i >= 2; i -= 2) {
if (i % 2 == 0)
continue ;
for (j = 3; j <= Math.Sqrt(i); j += 2) {
if (i % j == 0)
break ;
}
if (j > Math.Sqrt(i))
return i;
}
return 2;
}
public static void Main()
{
int n = 17;
Console.Write(prime(n));
}
}
|
Javascript
<script>
function prime(n)
{
if (n & 1)
n -= 2;
else
n--;
let i, j;
for (i = n; i >= 2; i -= 2)
{
if (i % 2 == 0)
continue ;
for (j = 3; j <= Math.sqrt(i); j += 2)
{
if (i % j == 0)
break ;
}
if (j > Math.sqrt(i))
return i;
}
return 2;
}
let n = 17;
document.write(prime(n));
</script>
|
Time complexity: O(n log n + log n) = O(n log n)
Space complexity: O(1)
An efficient solution for this problem is to generate all primes less than 10^6 using Sieve of Sundaram and store then in a array in increasing order. Now apply modified binary search to search nearest prime less than n.
C++
#include<bits/stdc++.h>
#define MAX 1000000
using namespace std;
vector< int > primes;
void Sieve()
{
int n = MAX;
int nNew = sqrt (n);
int marked[n/2+500] = {0};
for ( int i=1; i<=(nNew-1)/2; i++)
for ( int j=(i*(i+1))<<1; j<=n/2; j=j+2*i+1)
marked[j] = 1;
primes.push_back(2);
for ( int i=1; i<=n/2; i++)
if (marked[i] == 0)
primes.push_back(2*i + 1);
}
int binarySearch( int left, int right, int n)
{
if (left<=right)
{
int mid = (left + right)/2;
if (mid == 0 || mid == primes.size()-1)
return primes[mid];
if (primes[mid] == n)
return primes[mid-1];
if (primes[mid] < n && primes[mid+1] > n)
return primes[mid];
if (n < primes[mid])
return binarySearch(left, mid-1, n);
else
return binarySearch(mid+1, right, n);
}
return 0;
}
int main()
{
Sieve();
int n = 17;
cout << binarySearch(0, primes.size()-1, n);
return 0;
}
|
Java
import java.util.*;
class GFG
{
static int MAX= 1000000 ;
static ArrayList<Integer> primes = new ArrayList<Integer>();
static void Sieve()
{
int n = MAX;
int nNew = ( int )Math.sqrt(n);
int [] marked = new int [n / 2 + 500 ];
for ( int i = 1 ; i <= (nNew - 1 ) / 2 ; i++)
for ( int j = (i * (i + 1 )) << 1 ;
j <= n / 2 ; j = j + 2 * i + 1 )
marked[j] = 1 ;
primes.add( 2 );
for ( int i = 1 ; i <= n / 2 ; i++)
if (marked[i] == 0 )
primes.add( 2 * i + 1 );
}
static int binarySearch( int left, int right, int n)
{
if (left <= right)
{
int mid = (left + right) / 2 ;
if (mid == 0 || mid == primes.size() - 1 )
return primes.get(mid);
if (primes.get(mid) == n)
return primes.get(mid - 1 );
if (primes.get(mid) < n && primes.get(mid + 1 ) > n)
return primes.get(mid);
if (n < primes.get(mid))
return binarySearch(left, mid - 1 , n);
else
return binarySearch(mid + 1 , right, n);
}
return 0 ;
}
public static void main (String[] args)
{
Sieve();
int n = 17 ;
System.out.println(binarySearch( 0 ,
primes.size() - 1 , n));
}
}
|
Python3
import math
MAX = 10000 ;
primes = [];
def Sieve():
n = MAX ;
nNew = int (math.sqrt(n));
marked = [ 0 ] * ( int (n / 2 + 500 ));
for i in range ( 1 , int ((nNew - 1 ) / 2 ) + 1 ):
for j in range (((i * (i + 1 )) << 1 ),
( int (n / 2 ) + 1 ), ( 2 * i + 1 )):
marked[j] = 1 ;
primes.append( 2 );
for i in range ( 1 , int (n / 2 ) + 1 ):
if (marked[i] = = 0 ):
primes.append( 2 * i + 1 );
def binarySearch(left, right, n):
if (left < = right):
mid = int ((left + right) / 2 );
if (mid = = 0 or mid = = len (primes) - 1 ):
return primes[mid];
if (primes[mid] = = n):
return primes[mid - 1 ];
if (primes[mid] < n and primes[mid + 1 ] > n):
return primes[mid];
if (n < primes[mid]):
return binarySearch(left, mid - 1 , n);
else :
return binarySearch(mid + 1 , right, n);
return 0 ;
Sieve();
n = 17 ;
print (binarySearch( 0 , len (primes) - 1 , n));
|
C#
using System;
using System.Collections;
class GFG
{
static int MAX = 1000000;
static ArrayList primes = new ArrayList();
static void Sieve()
{
int n = MAX;
int nNew = ( int )Math.Sqrt(n);
int [] marked = new int [n / 2 + 500];
for ( int i = 1; i <= (nNew - 1) / 2; i++)
for ( int j = (i * (i + 1)) << 1;
j <= n / 2; j = j + 2 * i + 1)
marked[j] = 1;
primes.Add(2);
for ( int i = 1; i <= n / 2; i++)
if (marked[i] == 0)
primes.Add(2 * i + 1);
}
static int binarySearch( int left, int right, int n)
{
if (left <= right)
{
int mid = (left + right) / 2;
if (mid == 0 || mid == primes.Count - 1)
return ( int )primes[mid];
if (( int )primes[mid] == n)
return ( int )primes[mid - 1];
if (( int )primes[mid] < n &&
( int )primes[mid + 1] > n)
return ( int )primes[mid];
if (n < ( int )primes[mid])
return binarySearch(left, mid - 1, n);
else
return binarySearch(mid + 1, right, n);
}
return 0;
}
static void Main()
{
Sieve();
int n = 17;
Console.WriteLine(binarySearch(0,
primes.Count - 1, n));
}
}
|
PHP
<?php
$MAX = 10000;
$primes = array ();
function Sieve()
{
global $MAX , $primes ;
$n = $MAX ;
$nNew = (int)(sqrt( $n ));
$marked = array_fill (0, (int)( $n / 2 + 500), 0);
for ( $i = 1; $i <= ( $nNew - 1) / 2; $i ++)
for ( $j = ( $i * ( $i + 1)) << 1;
$j <= $n / 2; $j = $j + 2 * $i + 1)
$marked [ $j ] = 1;
array_push ( $primes , 2);
for ( $i = 1; $i <= $n / 2; $i ++)
if ( $marked [ $i ] == 0)
array_push ( $primes , 2 * $i + 1);
}
function binarySearch( $left , $right , $n )
{
global $primes ;
if ( $left <= $right )
{
$mid = (int)(( $left + $right ) / 2);
if ( $mid == 0 || $mid == count ( $primes ) - 1)
return $primes [ $mid ];
if ( $primes [ $mid ] == $n )
return $primes [ $mid - 1];
if ( $primes [ $mid ] < $n && $primes [ $mid + 1] > $n )
return $primes [ $mid ];
if ( $n < $primes [ $mid ])
return binarySearch( $left , $mid - 1, $n );
else
return binarySearch( $mid + 1, $right , $n );
}
return 0;
}
Sieve();
$n = 17;
echo binarySearch(0, count ( $primes ) - 1, $n );
?>
|
Javascript
<script>
var primes = [];
var MAX = 1000000;
function Sieve()
{
let n = MAX;
let nNew = parseInt(Math.sqrt(n));
var marked = new Array(n / 2 + 500).fill(0);
for (let i = 1; i <= parseInt((nNew - 1) / 2); i++)
for (let j = (i * (i + 1)) << 1; j <= parseInt(n / 2); j = j + 2 * i + 1)
marked[j] = 1;
primes.push(2);
for (let i = 1; i <= parseInt(n / 2); i++)
if (marked[i] == 0)
primes.push(2 * i + 1);
}
function binarySearch(left, right, n) {
if (left <= right) {
let mid = parseInt((left + right) / 2);
if (mid == 0 || mid == primes.length - 1)
return primes[mid];
if (primes[mid] == n)
return primes[mid - 1];
if (primes[mid] < n && primes[mid + 1] > n)
return primes[mid];
if (n < primes[mid])
return binarySearch(left, mid - 1, n);
else
return binarySearch(mid + 1, right, n);
}
return 0;
}
Sieve();
let n = 17;
document.write(binarySearch(0, primes.length - 1, n));
</script>
|
Time complexity: O(n log n)
Space complexity: O(n)
Another Approach (Trial Division method) :
Start checking for prime numbers by dividing the given number n by all numbers less than n. The first prime number you encounter will be the nearest prime number less than n.
Algorithm:
- Initialize a variable called “prime” to 0.
- Starting from n-1, iterate through all numbers less than n in decreasing order.
- For each number i, perform the following steps:
a. Initialize a variable called “is_prime” to true.
b. Starting from 2, iterate through all numbers less than i in increasing order.
c. For each number j, check if j divides i without leaving a remainder. If j does divide i, set “is_prime” to false and break out of the loop.
d. If “is_prime” is still true after checking all possible divisors, set “prime” to i and break out of the loop.
- Return “prime” as the nearest prime less than n.
Below is the implementation of the above approach:
C++
#include <iostream>
#include <cmath>
using namespace std;
bool is_prime( int n) {
if (n <= 1) {
return false ;
}
for ( int i = 2; i <= sqrt (n); i++) {
if (n % i == 0) {
return false ;
}
}
return true ;
}
int nearest_prime( int n) {
int prime = 0;
for ( int i = n-1; i >= 2; i--) {
if (is_prime(i)) {
prime = i;
break ;
}
}
return prime;
}
int main() {
int n = 17;
int prime = nearest_prime(n);
if (prime == 0) {
cout << "There is no prime less than " << n << endl;
}
else {
cout << prime << endl;
}
return 0;
}
|
Java
import java.util.*;
public class GFG {
public static boolean isPrime( int n)
{
if (n <= 1 ) {
return false ;
}
for ( int i = 2 ; i <= Math.sqrt(n); i++) {
if (n % i == 0 ) {
return false ;
}
}
return true ;
}
public static int nearestPrime( int n)
{
int prime = 0 ;
for ( int i = n - 1 ; i >= 2 ; i--) {
if (isPrime(i)) {
prime = i;
break ;
}
}
return prime;
}
public static void main(String[] args)
{
int n = 17 ;
int prime = nearestPrime(n);
if (prime == 0 ) {
System.out.println(
"There is no prime less than " + n);
}
else {
System.out.println(prime);
}
}
}
|
Python3
import math
def is_prime(n):
if n < = 1 :
return False
for i in range ( 2 , int (math.sqrt(n)) + 1 ):
if n % i = = 0 :
return False
return True
def nearest_prime(n):
prime = 0
for i in range (n - 1 , 1 , - 1 ):
if is_prime(i):
prime = i
break
return prime
if __name__ = = '__main__' :
n = 17
prime = nearest_prime(n)
if prime = = 0 :
print (f "There is no prime less than {n}" )
else :
print (prime)
|
C#
using System;
public class GFG {
static bool IsPrime( int n)
{
if (n <= 1) {
return false ;
}
for ( int i = 2; i <= Math.Sqrt(n); i++) {
if (n % i == 0) {
return false ;
}
}
return true ;
}
static int NearestPrime( int n)
{
int prime = 0;
for ( int i = n - 1; i >= 2; i--) {
if (IsPrime(i)) {
prime = i;
break ;
}
}
return prime;
}
static public void Main()
{
int n = 17;
int prime = NearestPrime(n);
if (prime == 0) {
Console.WriteLine( "There is no prime less than "
+ n);
}
else {
Console.WriteLine(prime);
}
}
}
|
Javascript
function isPrime(n) {
if (n <= 1) {
return false ;
}
for (let i = 2; i <= Math.sqrt(n); i++) {
if (n % i === 0) {
return false ;
}
}
return true ;
}
function nearestPrime(n) {
let prime = 0;
for (let i = n - 1; i >= 2; i--) {
if (isPrime(i)) {
prime = i;
break ;
}
}
return prime;
}
let n = 17;
let prime = nearestPrime(n);
if (prime === 0) {
console.log( "There is no prime less than " + n);
} else {
console.log(prime);
}
|
Time Complexity: O(N* sqrt(N))
Auxiliary Space: O(1)
If you have another approach to solve this problem then please share in comments.
Share your thoughts in the comments
Please Login to comment...