Mersenne Prime
Last Updated :
29 Dec, 2022
Mersenne Prime is a prime number that is one less than a power of two. In other words, any prime is Mersenne Prime if it is of the form 2k-1 where k is an integer greater than or equal to 2. First few Mersenne Primes are 3, 7, 31 and 127.
The task is print all Mersenne Primes smaller than an input positive integer n.
Examples:
Input: 10
Output: 3 7
3 and 7 are prime numbers smaller than or
equal to 10 and are of the form 2k-1
Input: 100
Output: 3 7 31
The idea is to generate all the primes less than or equal to the given number n using Sieve of Eratosthenes. Once we have generated all such primes, we iterate through all numbers of the form 2k-1 and check if they are primes or not.
Below is the implementation of the idea.
C++
#include<bits/stdc++.h>
using namespace std;
void SieveOfEratosthenes( int n, bool prime[])
{
for ( int i=0; i<=n; i++)
prime[i] = true ;
for ( int p=2; p*p<=n; p++)
{
if (prime[p] == true )
{
for ( int i=p*2; i<=n; i += p)
prime[i] = false ;
}
}
}
void mersennePrimes( int n)
{
bool prime[n+1];
SieveOfEratosthenes(n,prime);
for ( int k=2; ((1<<k)-1) <= n; k++)
{
long long num = (1<<k) - 1;
if (prime[num])
cout << num << " " ;
}
}
int main()
{
int n = 31;
cout << "Mersenne prime numbers smaller "
<< "than or equal to " << n << endl;
mersennePrimes(n);
return 0;
}
|
Java
import java.io.*;
class GFG {
static void SieveOfEratosthenes( int n,
boolean prime[])
{
for ( int i = 0 ; i <= n; i++)
prime[i] = true ;
for ( int p = 2 ; p * p <= n; p++)
{
if (prime[p] == true )
{
for ( int i = p * 2 ; i <= n; i += p)
prime[i] = false ;
}
}
}
static void mersennePrimes( int n)
{
boolean prime[]= new boolean [n + 1 ];
SieveOfEratosthenes(n, prime);
for ( int k = 2 ; (( 1 << k) - 1 ) <= n; k++)
{
long num = ( 1 << k) - 1 ;
if (prime[( int )(num)])
System.out.print(num + " " );
}
}
public static void main(String args[])
{
int n = 31 ;
System.out.println( "Mersenne prime" +
"numbers smaller than" +
"or equal to " +n);
mersennePrimes(n);
}
}
|
Python3
def SieveOfEratosthenes(n, prime):
for i in range ( 0 , n + 1 ) :
prime[i] = True
p = 2
while (p * p < = n):
if (prime[p] = = True ) :
for i in range (p * 2 , n + 1 , p):
prime[i] = False
p + = 1
def mersennePrimes(n) :
prime = [ 0 ] * (n + 1 )
SieveOfEratosthenes(n, prime)
k = 2
while ((( 1 << k) - 1 ) < = n ):
num = ( 1 << k) - 1
if (prime[num]) :
print (num, end = " " )
k + = 1
n = 31
print ( "Mersenne prime numbers smaller" ,
"than or equal to " , n )
mersennePrimes(n)
|
C#
using System;
class GFG {
static void SieveOfEratosthenes( int n,
bool []prime)
{
for ( int i = 0; i <= n; i++)
prime[i] = true ;
for ( int p = 2; p * p <= n; p++)
{
if (prime[p] == true )
{
for ( int i = p * 2; i <= n; i += p)
prime[i] = false ;
}
}
}
static void mersennePrimes( int n)
{
bool []prime = new bool [n + 1];
SieveOfEratosthenes(n, prime);
for ( int k = 2; (( 1 << k) - 1) <= n; k++)
{
long num = ( 1 << k) - 1;
if (prime[( int )(num)])
Console.Write(num + " " );
}
}
public static void Main()
{
int n = 31;
Console.WriteLine( "Mersenne prime numbers"
+ " smaller than or equal to " + n);
mersennePrimes(n);
}
}
|
PHP
<?php
function SieveOf( $n )
{
$prime = array ( $n + 1);
for ( $i = 0; $i <= $n ; $i ++)
$prime [ $i ] = true;
for ( $p = 2; $p * $p <= $n ; $p ++)
{
if ( $prime [ $p ] == true)
{
for ( $i = $p * 2; $i <= $n ; $i += $p )
$prime [ $i ] = false;
}
}
return $prime ;
}
function mersennePrimes( $n )
{
$prime = SieveOf( $n );
for ( $k = 2; ((1 << $k ) - 1) <= $n ; $k ++)
{
$num = (1 << $k ) - 1;
if ( $prime [ $num ])
echo $num . " " ;
}
}
$n = 31;
echo "Mersenne prime numbers smaller " .
"than or equal to $n " .
mersennePrimes( $n );
?>
|
Javascript
<script>
function SieveOfEratosthenes( n,
prime)
{
for (let i = 0; i <= n; i++)
prime[i] = true ;
for (let p = 2; p * p <= n; p++)
{
if (prime[p] == true )
{
for (let i = p * 2; i <= n; i += p)
prime[i] = false ;
}
}
}
function mersennePrimes(n)
{
let prime=[];
SieveOfEratosthenes(n, prime);
for (let k = 2; (( 1 << k) - 1) <= n; k++)
{
let num = ( 1 << k) - 1;
if (prime[(num)])
document.write(num + " " );
}
}
let n = 31;
document.write( "Mersenne prime" +
"numbers smaller than" +
"or equal to " +n + "<br/>" );
mersennePrimes(n);
</script>
|
Output:
Mersenne prime numbers smaller than or equal to 31
3 7 31
Time Complexity : O (n*log(logn))
Space Complexity : O(N)
References:
https://en.wikipedia.org/wiki/Mersenne_prime
Share your thoughts in the comments
Please Login to comment...