Print all Proth primes up to N

Given a number N, the task is to check whether the given number is Proth Prime or not.

A Proth prime is a Proth Number which is prime.

The first few Proth primes are –



3, 5, 13, 17, 41, 97, 113, 193, 241, 257, 353, 449, 577, 641, 673, 769, 929, 1153, 1217, …..

Examples:

Input: 41
Output: 41 is Proth Prime

Input: 19
Output: 19 is not a Proth Prime

Approach:
The idea is to find primes upto N using Sieve of Eratosthenes. Then check whether the given number is Proth Number or not. If number is a Proth Number and is also a prime number, then given number is Proth Prime.

Below is the implementation of the above algorithm:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of the above approach
#include <bits/stdc++.h>
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;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# 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

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP implementation of the above approach 
$GLOBALS['prime'] = array();
  
// Calculate all primes upto n. 
function 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 = 1; $i <= $n + 1; $i++) 
        $GLOBALS['prime'][$i] = true; 
  
    $GLOBALS['prime'][1] = false; 
  
    for ($p = 2; $p * $p <= $n; $p++) 
    
  
        // If prime[p] is not changed, 
        // then it is a prime 
        if ($GLOBALS['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 = $p * $p; $i <= $n; $i += $p
                $GLOBALS['prime'][$i] = false; 
        
    
  
// Utility function to check power of two 
function isPowerOfTwo($n
    return ($n && !($n & ($n - 1))); 
  
// Function to check if the Given 
// number is Proth number or not 
function 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. 
function isProthPrime($n
    // Check n for Proth Number 
    if (isProthNumber($n - 1)) 
    
  
        // if number is prime, return true 
        if ($GLOBALS['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 = 1; $i <= $n; $i++) 
  
    // Check n for Proth Prime 
    if (isProthPrime($i) == true) 
        echo $i, "\n";
  
// This code is contributed by Ryuga
?>

chevron_right


Output:

3
5
13
17
41

Time Complexity: O(n*log(log(n)))

References:



My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.