Check if a number is Primorial Prime or not
Given a positive number N, the task is to check if N is a primorial prime number or not. Print ‘YES’ if N is a primorial prime number otherwise print ‘NO.
Primorial Prime: In Mathematics, A Primorial prime is a prime number of the form pn# + 1 or pn# – 1 , where pn# is the primorial of pn i.e the product of first n prime numbers.
Examples:
Input : N = 5 Output : YES 5 is Primorial prime of the form pn - 1 for n=2, Primorial is 2*3 = 6 and 6-1 =5. Input : N = 31 Output : YES 31 is Primorial prime of the form pn + 1 for n=3, Primorial is 2*3*5 = 30 and 30+1 = 31.
The First few Primorial primes are:
2, 3, 5, 7, 29, 31, 211, 2309, 2311, 30029
Prerequisite:
Approach:
- Generate all prime number in the range using Sieve of Eratosthenes.
- Check if n is prime or not, If n is not prime Then print No
- Else, starting from first prime (i.e 2 ) start multiplying next prime number and keep checking if product + 1 = n or product – 1 = n or not
- If either product+1=n or product-1=n, then n is a Primorial Prime Otherwise not.
Below is the implementation of above approach:
C++
// CPP program to check Primorial Prime #include <bits/stdc++.h> using namespace std; #define MAX 10000 vector< int > arr; bool prime[MAX]; // Function to generate prime numbers void SieveOfEratosthenes() { // Create a boolean array "prime[0..n]" and initialize // make all entries of boolean array 'prime' // as true. A value in prime[i] will // finally be false if i is Not a prime, else true. memset (prime, true , sizeof (prime)); for ( int p = 2; p * p < MAX; 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 < MAX; i += p) prime[i] = false ; } } // store all prime numbers // to vector 'arr' for ( int p = 2; p < MAX; p++) if (prime[p]) arr.push_back(p); } // Function to check the number for Primorial prime bool isPrimorialPrime( long n) { // If n is not prime Number // return false if (!prime[n]) return false ; long long product = 1; int i = 0; while (product < n) { // Multiply next prime number // and check if product + 1 = n or Product-1 =n // holds or not product = product * arr[i]; if (product + 1 == n || product - 1 == n) return true ; i++; } return false ; } // Driver code int main() { SieveOfEratosthenes(); long n = 31; // Check if n is Primorial Prime if (isPrimorialPrime(n)) cout << "YES\n" ; else cout << "NO\n" ; return 0; } |
Java
// Java program to check Primorial prime import java.util.*; class GFG { static final int MAX = 1000000 ; static Vector<Integer> arr = new Vector<Integer>(); static boolean [] prime = new boolean [MAX]; // Function to get the prime numbers static void SieveOfEratosthenes() { // make all entries of boolean array 'prime' // as true. A value in prime[i] will // finally be false if i is Not a prime, else true. for ( int i = 0 ; i < MAX; i++) prime[i] = true ; for ( int p = 2 ; p * p < MAX; 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 < MAX; i += p) prime[i] = false ; } } // store all prime numbers // to vector 'arr' for ( int p = 2 ; p < MAX; p++) if (prime[p]) arr.add(p); } // Function to check the number for Primorial prime static boolean isPrimorialPrime( int n) { // If n is not prime // Then return false if (!prime[n]) return false ; long product = 1 ; int i = 0 ; while (product < n) { // Multiply next prime number // and check if product + 1 = n or product -1=n // holds or not product = product * arr.get(i); if (product + 1 == n || product - 1 == n) return true ; i++; } return false ; } // Driver Code public static void main(String[] args) { SieveOfEratosthenes(); int n = 31 ; if (isPrimorialPrime(n)) System.out.println( "YES" ); else System.out.println( "NO" ); } } |
Python 3
# Python3 Program to check Primorial Prime # from math lib import sqrt method from math import sqrt MAX = 100000 # Create a boolean array "prime[0..n]" # and initialize make all entries of # boolean array 'prime' as true. # A value in prime[i] will finally be # false if i is Not a prime, else true. prime = [ True ] * MAX arr = [] # Utility function to generate # prime numbers def SieveOfEratosthenes() : for p in range ( 2 , int (sqrt( MAX )) + 1 ) : # 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 , MAX , p) : prime[i] = False # store all prime numbers # to list 'arr' for p in range ( 2 , MAX ) : if prime[p] : arr.append(p) # Function to check the number # for Primorial prime def isPrimorialPrime(n) : # If n is not prime Number # return false if not prime[n] : return False product, i = 1 , 0 # Multiply next prime number # and check if product + 1 = n # or Product-1 = n holds or not while product < n : product * = arr[i] if product + 1 = = n or product - 1 = = n : return True i + = 1 return False # Driver code if __name__ = = "__main__" : SieveOfEratosthenes() n = 31 # Check if n is Primorial Prime if (isPrimorialPrime(n)) : print ( "YES" ) else : print ( "NO" ) # This code is contributed by ANKITRAI1 |
C#
// c# program to check Primorial prime using System; using System.Collections.Generic; public class GFG { public const int MAX = 1000000; public static List< int > arr = new List< int >(); public static bool [] prime = new bool [MAX]; // Function to get the prime numbers public static void SieveOfEratosthenes() { // make all entries of boolean array 'prime' // as true. A value in prime[i] will // finally be false if i is Not a prime, else true. for ( int i = 0; i < MAX; i++) { prime[i] = true ; } for ( int p = 2; p * p < MAX; 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 < MAX; i += p) { prime[i] = false ; } } } // store all prime numbers // to vector 'arr' for ( int p = 2; p < MAX; p++) { if (prime[p]) { arr.Add(p); } } } // Function to check the number for Primorial prime public static bool isPrimorialPrime( int n) { // If n is not prime // Then return false if (!prime[n]) { return false ; } long product = 1; int i = 0; while (product < n) { // Multiply next prime number // and check if product + 1 = n or product -1=n // holds or not product = product * arr[i]; if (product + 1 == n || product - 1 == n) { return true ; } i++; } return false ; } // Driver Code public static void Main( string [] args) { SieveOfEratosthenes(); int n = 31; if (isPrimorialPrime(n)) { Console.WriteLine( "YES" ); } else { Console.WriteLine( "NO" ); } } } // This code is contributed by Shrikant13 |
PHP
<?php // PHP Program to check Primorial Prime $MAX = 100000; // Create a boolean array "prime[0..n]" // and initialize make all entries of // boolean array 'prime' as true. // A value in prime[i] will finally be // false if i is Not a prime, else true. $prime = array_fill (0, $MAX , true); $arr = array (); // Utility function to generate // prime numbers function SieveOfEratosthenes() { global $MAX , $prime , $arr ; for ( $p = 2; $p <= (int)(sqrt( $MAX )); $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 < $MAX ; $i += $p ) $prime [ $i ] = false; } // store all prime numbers // to list 'arr' for ( $p = 2; $p < $MAX ; $p ++) if ( $prime [ $p ]) array_push ( $arr , $p ); } // Function to check the number // for Primorial prime function isPrimorialPrime( $n ) { global $MAX , $prime , $arr ; // If n is not prime Number // return false if (! $prime [ $n ]) return false; $product = 1; $i = 0; // Multiply next prime number // and check if product + 1 = n // or Product-1 = n holds or not while ( $product < $n ) { $product *= $arr [ $i ]; if ( $product + 1 == $n || $product - 1 == $n ) return true; $i += 1; } return false; } // Driver code SieveOfEratosthenes(); $n = 31; // Check if n is Primorial Prime if (isPrimorialPrime( $n )) print ( "YES" ); else print ( "NO" ); // This code is contributed by mits |
Javascript
<script> // Javascript program to check Primorial Prime var MAX = 10000; var arr = []; var prime = Array(MAX).fill( true ); // Function to generate prime numbers function SieveOfEratosthenes() { // Create a boolean array "prime[0..n]" and initialize // make all entries of boolean array 'prime' // as true. A value in prime[i] will // finally be false if i is Not a prime, else true. for ( var p = 2; p * p < MAX; p++) { // If prime[p] is not changed, then it is a prime if (prime[p] == true ) { // Update all multiples of p for ( var i = p * 2; i < MAX; i += p) prime[i] = false ; } } // store all prime numbers // to vector 'arr' for ( var p = 2; p < MAX; p++) if (prime[p]) arr.push(p); } // Function to check the number for Primorial prime function isPrimorialPrime(n) { // If n is not prime Number // return false if (!prime[n]) return false ; var product = 1; var i = 0; while (product < n) { // Multiply next prime number // and check if product + 1 = n or Product-1 =n // holds or not product = product * arr[i]; if (product + 1 == n || product - 1 == n) return true ; i++; } return false ; } // Driver code SieveOfEratosthenes(); var n = 31; // Check if n is Primorial Prime if (isPrimorialPrime(n)) document.write( "YES" ); else document.write( "NO" ); </script> |
Output:
YES
Time Complexity: O(n + MAX3/2)
Auxiliary Space: O(MAX)
Please Login to comment...