📜  打印所有Proth素数至N

📅  最后修改于: 2021-05-04 08:34:00             🧑  作者: Mango

给定数字N,任务是检查给定的数字是否为Proth Prime

Proth素数是Proth素数。

前几个Proth素数是–

例子:

Input: 41
Output: 41 is Proth Prime

Input: 19
Output: 19 is not a Proth Prime

方法:
这个想法是使用Eratosthenes的Sieve查找最高达N的素数。然后检查给定的编号是否是Proth Number。如果number是Proth Number也是质数,则给定的数字是Proth Prime。

下面是上述算法的实现:

C++
// C++ implementation of the above approach
#include 
using namespace std;
int prime[1000000];
  
// Calculate all primes upto n.
void SieveOfEratosthenes(int n)
{
    // Initialize all entries it as true.
    // A value in prime[i] will finally
    // false if i is Not a prime, else true.
    for (int i = 1; i <= n + 1; i++)
        prime[i] = true;
  
    prime[1] = false;
  
    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
            // greater than or equal to
            // the square of it numbers
            // which are multiple of p and are
            // less than p^2 are already been marked.
            for (int i = p * p; i <= n; i += p)
                prime[i] = false;
        }
    }
}
  
// Utility function to check power of two
bool isPowerOfTwo(int n)
{
    return (n && !(n & (n - 1)));
}
  
// Function to check if the Given
// number is Proth number or not
bool isProthNumber(int n)
{
  
    int k = 1;
    while (k < (n / k)) {
  
        // check if k divides n or not
        if (n % k == 0) {
  
            // Check if n/k is power of 2 or not
            if (isPowerOfTwo(n / k))
                return true;
        }
  
        // update k to next odd number
        k = k + 2;
    }
  
    // If we reach here means there
    // exists no value of K such
    // that k is odd number and n/k
    // is a power of 2 greater than k
    return false;
}
  
// Function to check whether the given
// number is Proth Prime or Not.
bool isProthPrime(int n)
{
    // Check n for Proth Number
    if (isProthNumber(n - 1)) {
  
        // if number is prime, return true
        if (prime[n])
            return true;
        else
            return false;
    }
    else
        return false;
}
  
// Driver Code
int main()
{
    int n = 41;
  
    // if number is proth number,
    // calculate primes upto n
    SieveOfEratosthenes(n);
  
    for (int i = 1; i <= n; i++)
        // Check n for Proth Prime
        if (isProthPrime(i))
            cout << i << endl;
  
    return 0;
}


Java
// Java implementation of the above approach
import java.util.*;
  
class GFG
{
  
static boolean[] prime = new boolean[1000000];
  
// Calculate all primes upto n.
static void SieveOfEratosthenes(int n)
{
    // Initialize all entries it as true.
    // A value in prime[i] will finally
    // false if i is Not a prime, else true.
    for (int i = 1; i <= n + 1; i++)
        prime[i] = true;
  
    prime[1] = false;
  
    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
            // greater than or equal to
            // the square of it numbers
            // which are multiple of p and are
            // less than p^2 are already been marked.
            for (int i = p * p; i <= n; i += p)
                prime[i] = false;
        }
    }
}
  
// Utility function to check power of two
static boolean isPowerOfTwo(int n)
{
    return (n > 0 && (n & (n - 1)) == 0);
}
  
// Function to check if the Given
// number is Proth number or not
static boolean isProthNumber(int n)
{
  
    int k = 1;
    while (k < (int)(n / k)) 
    {
  
        // check if k divides n or not
        if (n % k == 0)
        {
  
            // Check if n/k is power of 2 or not
            if (isPowerOfTwo((int)(n / k)))
                return true;
        }
  
        // update k to next odd number
        k = k + 2;
    }
  
    // If we reach here means there
    // exists no value of K such
    // that k is odd number and n/k
    // is a power of 2 greater than k
    return false;
}
  
// Function to check whether the given
// number is Proth Prime or Not.
static boolean isProthPrime(int n)
{
    // Check n for Proth Number
    if (isProthNumber(n - 1))
    {
  
        // if number is prime, return true
        if (prime[n])
            return true;
        else
            return false;
    }
    else
        return false;
}
  
// Driver Code
public static void main(String args[])
{
    int n = 41;
  
    // if number is proth number,
    // calculate primes upto n
    SieveOfEratosthenes(n);
  
    for (int i = 1; i <= n; i++)
        // Check n for Proth Prime
        if (isProthPrime(i))
            System.out.println(i);
}
}
  
// This code is contributed by
// Surendra_Gangwar


Python3
# Python3 implementation of the
# above approach
import math as mt
  
prime = [0 for i in range(1000000)]
  
# Calculate all primes upto n.
def SieveOfEratosthenes(n):
      
    # Initialize all entries it as true.
    # A value in prime[i] will finally
    # false if i is Not a prime, else true.
    for i in range(1, n + 2):
        prime[i] = True
  
    prime[1] = False
  
    for p in range(2, mt.ceil(n**(0.5))):
  
        # If prime[p] is not changed,
        # then it is a prime
        if (prime[p] == True):
  
            # Update all multiples of p
            # greater than or equal to
            # the square of it numbers
            # which are multiple of p and are
            # less than p^2 are already been marked.
            for i in range(p * p, n + 1, p):
                prime[i] = False
  
# Utility function to check power of two
def isPowerOfTwo(n):
    return (n and (n & (n - 1)) == False)
  
# Function to check if the Given
# number is Proth number or not
def isProthNumber(n):
      
    k = 1
    while (k < (n // k)):
  
        # check if k divides n or not
        if (n % k == 0):
  
            # Check if n/k is power of 2 or not
            if (isPowerOfTwo(n // k)):
                return True
          
        # update k to next odd number
        k = k + 2
      
    # If we reach here means there
    # exists no value of K such
    # that k is odd number and n/k
    # is a power of 2 greater than k
    return False
  
# Function to check whether the given
# number is Proth Prime or Not.
def isProthPrime(n):
  
    # Check n for Proth Number
    if (isProthNumber(n - 1)): 
  
        # if number is prime, return true
        if (prime[n]):
            return True
        else:
            return False
      
    else:
        return False
  
# Driver Code
n = 41
  
# if number is proth number,
# calculate primes upto n
SieveOfEratosthenes(n)
  
for i in range(1, n + 1):
      
    # Check n for Proth Prime
    if isProthPrime(i) == True:
        print(i)
          
# This code is contributed by 
# Mohit kumar 29


C#
// C# implementation of the above approach
using System;
  
class GFG
{
  
static Boolean[] prime = new Boolean[1000000];
  
// Calculate all primes upto n.
static void SieveOfEratosthenes(int n)
{
    // Initialize all entries it as true.
    // A value in prime[i] will finally
    // false if i is Not a prime, else true.
    for (int i = 1; i <= n + 1; i++)
        prime[i] = true;
  
    prime[1] = false;
  
    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
            // greater than or equal to
            // the square of it numbers
            // which are multiple of p and are
            // less than p^2 are already been marked.
            for (int i = p * p; i <= n; i += p)
                prime[i] = false;
        }
    }
}
  
// Utility function to check power of two
static Boolean isPowerOfTwo(int n)
{
    return (n > 0 && (n & (n - 1)) == 0);
}
  
// Function to check if the Given
// number is Proth number or not
static Boolean isProthNumber(int n)
{
  
    int k = 1;
    while (k < (int)(n / k)) 
    {
  
        // check if k divides n or not
        if (n % k == 0)
        {
  
            // Check if n/k is power of 2 or not
            if (isPowerOfTwo((int)(n / k)))
                return true;
        }
  
        // update k to next odd number
        k = k + 2;
    }
  
    // If we reach here means there
    // exists no value of K such
    // that k is odd number and n/k
    // is a power of 2 greater than k
    return false;
}
  
// Function to check whether the given
// number is Proth Prime or Not.
static Boolean isProthPrime(int n)
{
    // Check n for Proth Number
    if (isProthNumber(n - 1))
    {
  
        // if number is prime, return true
        if (prime[n])
            return true;
        else
            return false;
    }
    else
        return false;
}
  
// Driver Code
static public void Main(String []args)
{
    int n = 41;
  
    // if number is proth number,
    // calculate primes upto n
    SieveOfEratosthenes(n);
  
    for (int i = 1; i <= n; i++)
      
        // Check n for Proth Prime
        if (isProthPrime(i))
            Console.WriteLine(i);
}
}
  
// This code is contributed by Arnab Kundu


PHP


输出:
3
5
13
17
41

时间复杂度: O(n * log(log(n)))

参考:

  • https://zh.wikipedia.org/wiki/Proth_number#Proth_primes
  • https://www.geeksforgeeks.org/program-to-check-whether-a-number-is-proth-number-or-not/