logo

Programa para encontrar todos os números primos de Mersenne até N

Experimente no GfG Practice ' title=

Mersenne Prime é um número primo que é um a menos que uma potência de dois. Em outras palavras, qualquer primo é Mersenne Prime se for da forma 2k-1 onde k é um número inteiro maior ou igual a 2. Os primeiros números primos de Mersenne são 3 7 31 e 127.
A tarefa é imprimir todos os números primos de Mersenne menores que um número inteiro positivo de entrada n.
Exemplos:  
 

    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


 


A ideia é gerar todos os primos menores ou iguais ao número n fornecido usando Peneira de Eratóstenes . Depois de gerarmos todos esses números primos, iteramos todos os números da forma 2k-1 e verifique se são primos ou não.
Abaixo está a implementação da ideia.
 



C++
// Program to generate mersenne primes #include   using namespace std; // Generate all prime numbers less than n. void SieveOfEratosthenes(int n bool prime[]) {  // Initialize all entries of boolean array  // as true. A value in prime[i] will finally  // be false if i is Not a prime else true  // bool prime[n+1];  for (int i=0; i<=n; i++)  prime[i] = true;  for (int p=2; p*p<=n; p++)  {  // If prime[p] is not changed then it  // is a prime  if (prime[p] == true)  {  // Update all multiples of p  for (int i=p*2; i<=n; i += p)  prime[i] = false;  }  } } // Function to generate mersenne primes less // than or equal to n void mersennePrimes(int n) {  // Create a boolean array 'prime[0..n]'  bool prime[n+1];  // Generating primes using Sieve  SieveOfEratosthenes(nprime);  // Generate all numbers of the form 2^k - 1  // and smaller than or equal to n.  for (int k=2; ((1<<k)-1) <= n; k++)  {  long long num = (1<<k) - 1;  // Checking whether number is prime and is  // one less than the power of 2  if (prime[num])  cout << num << ' ';  } } // Driven program int main() {  int n = 31;  cout << 'Mersenne prime numbers smaller '  << 'than or equal to ' << n << endl;  mersennePrimes(n);  return 0; } 
Java
// Program to generate // mersenne primes import java.io.*; class GFG {    // Generate all prime numbers  // less than n.  static void SieveOfEratosthenes(int n  boolean prime[])  {  // Initialize all entries of   // boolean array as true. A   // value in prime[i] will finally  // be false if i is Not a prime   // else true bool prime[n+1];  for (int i = 0; i <= n; i++)  prime[i] = true;    for (int p = 2; p * p <= n; p++)  {  // If prime[p] is not changed  //  then it is a prime  if (prime[p] == true)  {  // Update all multiples of p  for (int i = p * 2; i <= n; i += p)  prime[i] = false;  }  }  }    // Function to generate mersenne  // primes lessthan or equal to n  static void mersennePrimes(int n)  {  // Create a boolean array  // 'prime[0..n]'  boolean prime[]=new boolean[n + 1];    // Generating primes   // using Sieve  SieveOfEratosthenes(n prime);    // Generate all numbers of  // the form 2^k - 1 and   // smaller than or equal to n.  for (int k = 2; (( 1 << k) - 1) <= n; k++)  {  long num = ( 1 << k) - 1;    // Checking whether number is   // prime and is one less than  // the power of 2  if (prime[(int)(num)])  System.out.print(num + ' ');  }  }    // Driven program  public static void main(String args[])  {  int n = 31;  System.out.println('Mersenne prime'+  'numbers smaller than'+  'or equal to '+n);    mersennePrimes(n);  } } // This code is contributed by Nikita Tiwari. 
Python3
# Program to generate mersenne primes  # Generate all prime numbers # less than n.  def SieveOfEratosthenes(n prime): # Initialize all entries of boolean # array as true. A value in prime[i]  # will finally be false if i is Not  # a prime else true bool prime[n+1]  for i in range(0 n + 1) : prime[i] = True p = 2 while(p * p <= n): # If prime[p] is not changed  # then it is a prime  if (prime[p] == True) : # Update all multiples of p  for i in range(p * 2 n + 1 p): prime[i] = False p += 1 # Function to generate mersenne  # primes less than or equal to n  def mersennePrimes(n) : # Create a boolean array  # 'prime[0..n]'  prime = [0] * (n + 1) # Generating primes using Sieve  SieveOfEratosthenes(n prime) # Generate all numbers of the  # form 2^k - 1 and smaller # than or equal to n. k = 2 while(((1 << k) - 1) <= n ): num = (1 << k) - 1 # Checking whether number  # is prime and is one # less than the power of 2  if (prime[num]) : print(num end = ' ' ) k += 1 # Driver Code n = 31 print('Mersenne prime numbers smaller' 'than or equal to '  n ) mersennePrimes(n) # This code is contributed # by Smitha 
C#
// C# Program to generate mersenne primes using System; class GFG {    // Generate all prime numbers less than n.  static void SieveOfEratosthenes(int n  bool []prime)  {    // Initialize all entries of   // boolean array as true. A   // value in prime[i] will finally  // be false if i is Not a prime   // else true bool prime[n+1];  for (int i = 0; i <= n; i++)  prime[i] = true;    for (int p = 2; p * p <= n; p++)  {    // If prime[p] is not changed  // then it is a prime  if (prime[p] == true)  {    // Update all multiples of p  for (int i = p * 2; i <= n; i += p)  prime[i] = false;  }  }  }    // Function to generate mersenne  // primes lessthan or equal to n  static void mersennePrimes(int n)  {    // Create a boolean array  // 'prime[0..n]'  bool []prime = new bool[n + 1];    // Generating primes   // using Sieve  SieveOfEratosthenes(n prime);    // Generate all numbers of  // the form 2^k - 1 and   // smaller than or equal to n.  for (int k = 2; (( 1 << k) - 1) <= n; k++)  {  long num = ( 1 << k) - 1;    // Checking whether number is   // prime and is one less than  // the power of 2  if (prime[(int)(num)])  Console.Write(num + ' ');  }  }    // Driven program  public static void Main()  {  int n = 31;    Console.WriteLine('Mersenne prime numbers'  + ' smaller than or equal to ' + n);    mersennePrimes(n);  } } // This code is contributed by nitin mittal. 
JavaScript
<script> // JavaScript to generate // mersenne primes   // Generate all prime numbers  // less than n.  function SieveOfEratosthenes( n  prime)  {  // Initialize all entries of   // boolean array as true. A   // value in prime[i] will finally  // be false if i is Not a prime   // else true bool prime[n+1];  for (let i = 0; i <= n; i++)  prime[i] = true;    for (let p = 2; p * p <= n; p++)  {  // If prime[p] is not changed  //  then it is a prime  if (prime[p] == true)  {  // Update all multiples of p  for (let i = p * 2; i <= n; i += p)  prime[i] = false;  }  }  }    // Function to generate mersenne  // primes lessthan or equal to n  function mersennePrimes(n)  {  // Create a boolean array  // 'prime[0..n]'  let prime=[];    // Generating primes   // using Sieve  SieveOfEratosthenes(n prime);    // Generate all numbers of  // the form 2^k - 1 and   // smaller than or equal to n.  for (let k = 2; (( 1 << k) - 1) <= n; k++)  {  let num = ( 1 << k) - 1;    // Checking whether number is   // prime and is one less than  // the power of 2  if (prime[(num)])  document.write(num + ' ');  }  } // Driver Code  let n = 31;  document.write('Mersenne prime'+  'numbers smaller than'+  'or equal to '+n + '  
'
); mersennePrimes(n); // This code is contributed by code_hunt. </script>
PHP
 // Program to generate mersenne primes // Generate all prime numbers less than n. function SieveOf($n) { // Initialize all entries of boolean  // array as true. A value in prime[i] // will finally be false if i is Not // a prime else true $prime = array($n + 1); for ($i = 0; $i <= $n; $i++) $prime[$i] = true; for ($p = 2; $p * $p <= $n; $p++) { // If prime[p] is not changed  // then it is a prime if ($prime[$p] == true) { // Update all multiples of p for ($i = $p * 2; $i <= $n; $i += $p) $prime[$i] = false; } } return $prime; } // Function to generate mersenne  // primes less than or equal to n function mersennePrimes($n) { // Create a boolean array 'prime[0..n]' // bool prime[n+1]; // Generating primes using Sieve $prime = SieveOf($n); // Generate all numbers of the  // form 2^k - 1 and smaller  // than or equal to n. for ($k = 2; ((1 << $k) - 1) <= $n; $k++) { $num = (1 << $k) - 1; // Checking whether number is prime  // and is one less than the power of 2 if ($prime[$num]) echo $num . ' '; } } // Driver Code $n = 31; echo 'Mersenne prime numbers smaller ' . 'than or equal to $n ' . mersennePrimes($n); // This code is contributed by mits ?> 

Saída:  
 

Mersenne prime numbers smaller than or equal to 31  
3 7 31

Complexidade de tempo: O (n*log(logn))

Complexidade Espacial: SOBRE)


Referências:  
https://en.wikipedia.org/wiki/Mersenne_prime
 

Criar questionário