Ramanujan Prime
Last Updated :
31 May, 2022
The Nth Ramanujan prime is the least integer Rn for which
where ?(x) is a prime-counting function
Note that the integer Rn is necessarily a prime number: ?(x) – ?(x/2) and, hence, ?(x) must increase by obtaining another prime at x = Rn. Since ?(x) – ?(x/2) can increase by at most 1,
Range of Rn is (2n log(2n), 4n log(4n)).
Ramanujan primes:
2, 11, 17, 29, 41, 47, 59, 67, 71, 97
For a given N, the task is to print first N Ramanujan primes
Examples:
Input : N = 5
Output : 2, 11, 17, 29, 41
Input : N = 10
Output : 2, 11, 17, 29, 41, 47, 59, 67, 71, 97
Approach:
Let us divide our solution into parts,
First, we will use sieve of Eratosthenes to get all the primes less than 10^6
Now we will have to find the value of ?(x), ?(x) is the count of primes which are less than or equal to x. Primes are stored in increasing order. So we can perform a binary search to find all the primes less than x, which can be done in O(log n).
Now we have the range Rn lies between : 2n log(2n) < Rn < 4n log(4n) So, we will take the upper bound and iterate from upper bound to the lower bound until ?(i) – ?(i/2) < n, i+1 is the nth Ramanujan prime.
Below is the implementation of the above approach :
C++
#include <bits/stdc++.h>
using namespace std;
#define MAX 1000000
vector< int > addPrimes()
{
int n = MAX;
bool prime[n + 1];
memset (prime, true , sizeof (prime));
for ( int p = 2; p * p <= n; p++)
{
if (prime[p] == true )
{
for ( int i = p * p; i <= n; i += p)
prime[i] = false ;
}
}
vector< int > ans;
for ( int p = 2; p <= n; p++)
if (prime[p])
ans.push_back(p);
return ans;
}
int pi( int x, vector< int > v)
{
int l = 0, r = v.size() - 1, m, in = -1;
while (l <= r) {
m = (l + r) / 2;
if (v[m] <= x) {
in = m;
l = m + 1;
}
else {
r = m - 1;
}
}
return in + 1;
}
int Ramanujan( int n, vector< int > v)
{
int upperbound = 4 * n * ( log (4 * n) / log (2));
for ( int i = upperbound;; i--) {
if (pi(i, v) - pi(i / 2, v) < n)
return 1 + i;
}
}
void Ramanujan_Numbers( int n)
{
int c = 1;
vector< int > v = addPrimes();
for ( int i = 1; i <= n; i++) {
cout << Ramanujan(i, v);
if (i!=n)
cout << ", " ;
}
}
int main()
{
int n = 10;
Ramanujan_Numbers(n);
return 0;
}
|
Java
import java.util.*;
class GFG
{
static int MAX = 1000000 ;
static Vector<Integer> addPrimes()
{
int n = MAX;
boolean []prime= new boolean [n + 1 ];
Arrays.fill(prime, true );
for ( int p = 2 ; p * p <= n; p++)
{
if (prime[p] == true )
{
for ( int i = p * p; i <= n; i += p)
prime[i] = false ;
}
}
Vector<Integer> ans = new Vector<Integer>();
for ( int p = 2 ; p <= n; p++)
if (prime[p])
ans.add(p);
return ans;
}
static int pi( int x, Vector<Integer> v)
{
int l = 0 , r = v.size() - 1 , m, in = - 1 ;
while (l <= r)
{
m = (l + r) / 2 ;
if (v.get(m) <= x)
{
in = m;
l = m + 1 ;
}
else
{
r = m - 1 ;
}
}
return in + 1 ;
}
static int Ramanujan( int n, Vector<Integer> v)
{
int upperbound = ( int ) ( 4 * n * (Math.log( 4 * n) /
Math.log( 2 )));
for ( int i = upperbound;; i--)
{
if (pi(i, v) - pi(i / 2 , v) < n)
return 1 + i;
}
}
static void Ramanujan_Numbers( int n)
{
int c = 1 ;
Vector<Integer> v = addPrimes();
for ( int i = 1 ; i <= n; i++)
{
System.out.print(Ramanujan(i, v));
if (i != n)
System.out.print( ", " );
}
}
public static void main(String[] args)
{
int n = 10 ;
Ramanujan_Numbers(n);
}
}
|
Python3
from math import log, ceil
MAX = 1000000
def addPrimes():
n = MAX
prime = [ True for i in range (n + 1 )]
for p in range ( 2 , n + 1 ):
if p * p > n:
break
if (prime[p] = = True ):
for i in range ( 2 * p, n + 1 , p):
prime[i] = False
ans = []
for p in range ( 2 , n + 1 ):
if (prime[p]):
ans.append(p)
return ans
def pi(x, v):
l, r = 0 , len (v) - 1
m, i = 0 , - 1
while (l < = r):
m = (l + r) / / 2
if (v[m] < = x):
i = m
l = m + 1
else :
r = m - 1
return i + 1
def Ramanujan(n, v):
upperbound = ceil( 4 * n * (log( 4 * n) / log( 2 )))
for i in range (upperbound, - 1 , - 1 ):
if (pi(i, v) - pi(i / 2 , v) < n):
return 1 + i
def Ramanujan_Numbers(n):
c = 1
v = addPrimes()
for i in range ( 1 , n + 1 ):
print (Ramanujan(i, v), end = "")
if (i ! = n):
print (end = ", " )
n = 10
Ramanujan_Numbers(n)
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static int MAX = 1000000;
static List< int > addPrimes()
{
int n = MAX;
Boolean []prime = new Boolean[n + 1];
for ( int i = 0; i < n + 1; i++)
prime[i] = true ;
for ( int p = 2; p * p <= n; p++)
{
if (prime[p] == true )
{
for ( int i = p * p; i <= n; i += p)
prime[i] = false ;
}
}
List< int > ans = new List< int >();
for ( int p = 2; p <= n; p++)
if (prime[p])
ans.Add(p);
return ans;
}
static int pi( int x, List< int > v)
{
int l = 0, r = v.Count - 1, m, i = -1;
while (l <= r)
{
m = (l + r) / 2;
if (v[m] <= x)
{
i = m;
l = m + 1;
}
else
{
r = m - 1;
}
}
return i + 1;
}
static int Ramanujan( int n, List< int > v)
{
int upperbound = ( int ) (4 * n * (Math.Log(4 * n) /
Math.Log(2)));
for ( int i = upperbound;; i--)
{
if (pi(i, v) - pi(i / 2, v) < n)
return 1 + i;
}
}
static void Ramanujan_Numbers( int n)
{
int c = 1;
List< int > v = addPrimes();
for ( int i = 1; i <= n; i++)
{
Console.Write(Ramanujan(i, v));
if (i != n)
Console.Write( ", " );
}
}
public static void Main(String[] args)
{
int n = 10;
Ramanujan_Numbers(n);
}
}
|
Javascript
<script>
const MAX = 1000000;
function addPrimes()
{
let n = MAX;
let prime = new Array(n + 1).fill( true );
for (let p = 2; p * p <= n; p++)
{
if (prime[p] == true )
{
for (let i = p * p; i <= n; i += p)
prime[i] = false ;
}
}
let ans = [];
for (let p = 2; p <= n; p++)
if (prime[p])
ans.push(p);
return ans;
}
function pi(x, v)
{
let l = 0, r = v.length - 1, m, inn = -1;
while (l <= r) {
m = parseInt((l + r) / 2);
if (v[m] <= x) {
inn = m;
l = m + 1;
}
else {
r = m - 1;
}
}
return inn + 1;
}
function Ramanujan(n, v)
{
let upperbound = 4 * n * parseInt((Math.log(4 * n) / Math.log(2)));
for (let i = upperbound;; i--) {
if (pi(i, v) - pi(parseInt(i / 2), v) < n)
return 1 + i;
}
}
function Ramanujan_Numbers(n)
{
let c = 1;
let v = addPrimes();
for (let i = 1; i <= n; i++) {
document.write(Ramanujan(i, v));
if (i!=n)
document.write( ", " );
}
}
let n = 10;
Ramanujan_Numbers(n);
</script>
|
Output:
2, 11, 17, 29, 41, 47, 59, 67, 71, 97
Time Complexity : O(nlogn)
Auxiliary Space: O(MAX)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...