Check if the number is a Prime power number
Last Updated :
29 Dec, 2022
Given an integer N, the task is to check if the number is a Prime power number. If yes, then print the number along with its power which is equal to N. Else print -1.
A prime power is a positive integer power of a single prime number.
For example: 7 = 71, 9 = 32 and 32 = 25 are prime powers, while 6 = 2 × 3, 12 = 22 × 3 and 36 = 62 = 22 × 32 are not. (The number 1 is not counted as a prime power.)
Note: If there is no such prime number, print -1.
Examples:
Input: N = 49
Output: 72
Explanation:
N can be represented as a power of prime number 7.
N = 49 = 72
Input: N = 100
Output: -1
Explanation:
N cannot be represented as a power of any prime number.
Approach: The idea is to use the Sieve of Eratosthenes to find all the prime numbers. Then, Iterate over all the prime numbers and check that if any prime number divides the given number N, if yes then divide it until it becomes 1 or not divisible by that prime number. Finally, check that the number is equal to 1, If yes then return the prime number otherwise given number cannot be expressed as a prime number raised to some power.
Below is the implementation of the above approach:
C++
#include<bits/stdc++.h>
using namespace std;
bool is_prime[1000001];
vector< int > primes;
void SieveOfEratosthenes( int n)
{
int p = 2;
for ( int i = 0; i < n; i++)
is_prime[i] = true ;
while (p * p <= n)
{
if (is_prime[p] == true )
{
for ( int i = p * p; i < n + 1; i += p)
{
is_prime[i] = false ;
}
}
p += 1;
}
for ( int i = 2; i < n + 1; i++)
{
if (is_prime[i])
primes.push_back(i);
}
}
pair< int , int > power_of_prime( int n)
{
for ( auto i : primes)
{
if (n % i == 0)
{
int c = 0;
while (n % i == 0)
{
n /= i;
c += 1;
}
if (n == 1)
return {i, c};
else
return {-1, 1};
}
}
}
int main()
{
int n = 49;
SieveOfEratosthenes( int ( sqrt (n)) + 1);
pair< int , int > p = power_of_prime(n);
if (p.first > 1)
cout << p.first << " ^ "
<< p.second << endl;
else
cout << -1 << endl;
}
|
Java
import java.io.*;
import java.util.*;
import java.lang.Math;
class GFG{
static ArrayList<Integer> primes = new ArrayList<Integer>();
public static void sieveOfEratosthenes( int n)
{
boolean prime[] = new boolean [n + 1 ];
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 ;
}
}
for ( int i = 2 ; i <= n; i++)
{
if (prime[i] == true )
primes.add(i);
}
}
public static int [] power_of_prime( int n)
{
for ( int ii = 0 ; ii < primes.size(); ii++)
{
int i = primes.get(ii);
if (n % i == 0 )
{
int c = 0 ;
while (n % i == 0 )
{
n /= i;
c += 1 ;
}
if (n == 1 )
return new int []{i, c};
else
return new int []{- 1 , 1 };
}
}
return new int []{- 1 , 1 };
}
public static void main(String args[])
{
int n = 49 ;
int sq = ( int )(Math.sqrt(n));
sieveOfEratosthenes(sq + 1 );
int arr[] = power_of_prime(n);
if (arr[ 0 ] > 1 )
System.out.println(arr[ 0 ] + " ^ " + arr[ 1 ]);
else
System.out.println( "-1" );
}
}
|
Python3
from math import *
is_prime = [ True for i in range ( 10 * * 6 + 1 )]
primes = []
def SieveOfEratosthenes(n):
p = 2
while (p * p < = n):
if (is_prime[p] = = True ):
for i in range (p * p, n + 1 , p):
is_prime[i] = False
p + = 1
for i in range ( 2 , n + 1 ):
if is_prime[i]:
primes.append(i)
def power_of_prime(n):
for i in primes:
if n % i = = 0 :
c = 0
while n % i = = 0 :
n / / = i
c + = 1
if n = = 1 :
return (i, c)
else :
return ( - 1 , 1 )
if __name__ = = "__main__" :
n = 49
SieveOfEratosthenes( int (sqrt(n)) + 1 )
num, power = power_of_prime(n)
if num > 1 :
print (num, "^" , power)
else :
print ( - 1 )
|
C#
using System;
using System.Collections;
class GFG{
static ArrayList primes = new ArrayList();
public static void sieveOfEratosthenes( int n)
{
bool []prime = new bool [n + 1];
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 ;
}
}
for ( int i = 2; i <= n; i++)
{
if (prime[i] == true )
primes.Add(i);
}
}
public static int [] power_of_prime( int n)
{
for ( int ii = 0; ii < primes.Count; ii++)
{
int i = ( int )primes[ii];
if (n % i == 0)
{
int c = 0;
while (n % i == 0)
{
n /= i;
c += 1;
}
if (n == 1)
return new int []{i, c};
else
return new int []{-1, 1};
}
}
return new int []{-1, 1};
}
public static void Main( string []args)
{
int n = 49;
int sq = ( int )(Math.Sqrt(n));
sieveOfEratosthenes(sq + 1);
int []arr = power_of_prime(n);
if (arr[0] > 1)
Console.Write(arr[0] + " ^ " +
arr[1]);
else
Console.Write( "-1" );
}
}
|
Javascript
<script>
let primes = [];
function sieveOfEratosthenes(n)
{
let prime = Array.from({length: n+1}, (_, i) => 0);
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 ;
}
}
for (let i = 2; i <= n; i++)
{
if (prime[i] == true )
primes.push(i);
}
}
function power_of_prime(n)
{
for (let ii = 0; ii < primes.length; ii++)
{
let i = primes[ii];
if (n % i == 0)
{
let c = 0;
while (n % i == 0)
{
n /= i;
c += 1;
}
if (n == 1)
return [i, c];
else
return [-1, 1];
}
}
return [-1, 1];
}
let n = 49;
let sq = (Math.sqrt(n));
sieveOfEratosthenes(sq + 1);
let arr = power_of_prime(n);
if (arr[0] > 1)
document.write(arr[0] + " ^ " +
arr[1]);
else
document.write( "-1" );
</script>
|
Time Complexity: O(√n*log(log(√n)))+n)
Auxiliary Space: O(m) where m=1000001
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...