Check if a number can be expressed as x^y (x raised to power y) - GeeksforGeeks
Given a positive integer n, find if it can be expressed as xy where y > 1 and x > 0. x and y both are integers.
Check if the number is even or odd, initialize X with 2 or 3 based on that, and then increment X by 2. It will directly reduce the calculations to half.
Also, better approach is to find the prime factors of N, and then use them to find all the X such that X^Y=N.
if(a<b){
int t=a;a=b;b=t;
}
if(b==0)
return a;
return gcd(b,a%b);
}
int test_if_power(int n){
bool flag=true;
int t=n;
int curr_gcd=INT_MAX;
// if n==1 then it can't be expresses as x^y for y>1
if(n==1)
flag=false;
if(n%2==0){
int p=0;
while(n%2==0)
{
n=n/2;
p++;
}
// find the power of 2 in the prime factorization of n
if(p==1)
flag=false;
if(curr_gcd==INT_MAX)
curr_gcd=p;
}
for(int i=3;i<=sqrt(n);i+=2){
if(n%i==0){
int p=0;
while(n%i==0){
n/=i;
p++;
}
// if for any prime factor p the power is 1 then n can not be expressed as x^y
if(p==1)
flag=false;
// if i is the first prime factor of p then set the gcd to power of i;
if(curr_gcd==INT_MAX)
curr_gcd=p;
else
curr_gcd=gcd(p,curr_gcd);
//find the gcd of curr_gcd and the power of prime factor i;
}
}
if(n>2){
flag=false;
}
if(!flag){
// return in case flag is false or curr_gc is 1;
return 0;
}
if(curr_gcd!=1)
cout<<t<<" ";
}
Check if a number can be expressed as x raised to power y
Given a positive integer, find if it can be expressed by integers x and y as x^y where
y > 1 and x > 0.
Example:
Consider the number: 125
Since 125 can be written as x^y where x = 5, y = 3, so return true.
Consider the number: 120
As 120 cannot be expressed as x^y for any integers x > 0 and y > 1, so return false.
http://www.ideserve.co.in/learn/check-if-a-number-can-be-expressed-as-x-raised-to-power-y-set-2
Instead of repeated divisions as given in previous method, we can apply mathematical formula as described:
Given a number a, we have to find integers x and y, such that:
a = x^y
If we take log on both sides, we get:
log a = log (x^y)
log a = y log x
y = log a / log x
Hence, we have to find an integer x for which RHS gives an integer y.
Algorithm:
1: Starting with i = 2, if (log a / log i) is an integer then return true.
2: Else increment i by 1 till i < √a.
3: If no such i is found, return false.
Read full article from Check if a number can be expressed as x^y (x raised to power y) - GeeksforGeeks
Given a positive integer n, find if it can be expressed as xy where y > 1 and x > 0. x and y both are integers.
Check if the number is even or odd, initialize X with 2 or 3 based on that, and then increment X by 2. It will directly reduce the calculations to half.
Also, better approach is to find the prime factors of N, and then use them to find all the X such that X^Y=N.
An alternative approach to the problem could be finding the prime factorization of number n,
i.e. say the prime factorization of n= p1^x1*p2^x2*.......*pk^xk ,
then the number could only be expressed as x^y if and only if gcd(x1,x2,....,xk)!=1;
i.e. if the gcd is 1 or number is prime then it can't be expressed as x^y .
Moreover the time complexity of finding prime factorization is O(sqrt(n)) and gcd is log(n).Finding prime factorization could be improved using some sieve like erasthothenes.
int gcd(int a,int b){if(a<b){
int t=a;a=b;b=t;
}
if(b==0)
return a;
return gcd(b,a%b);
}
int test_if_power(int n){
bool flag=true;
int t=n;
int curr_gcd=INT_MAX;
// if n==1 then it can't be expresses as x^y for y>1
if(n==1)
flag=false;
if(n%2==0){
int p=0;
while(n%2==0)
{
n=n/2;
p++;
}
// find the power of 2 in the prime factorization of n
if(p==1)
flag=false;
if(curr_gcd==INT_MAX)
curr_gcd=p;
}
for(int i=3;i<=sqrt(n);i+=2){
if(n%i==0){
int p=0;
while(n%i==0){
n/=i;
p++;
}
// if for any prime factor p the power is 1 then n can not be expressed as x^y
if(p==1)
flag=false;
// if i is the first prime factor of p then set the gcd to power of i;
if(curr_gcd==INT_MAX)
curr_gcd=p;
else
curr_gcd=gcd(p,curr_gcd);
//find the gcd of curr_gcd and the power of prime factor i;
}
}
if(n>2){
flag=false;
}
if(!flag){
// return in case flag is false or curr_gc is 1;
return 0;
}
if(curr_gcd!=1)
cout<<t<<" ";
}
One optimization in above solution is to avoid call to pow() by multiplying p with x one by one.
bool
isPower(unsigned
int
n)
{
// Base case
if
(n <= 1)
return
true
;
// Try all numbers from 2 to sqrt(n) as base
for
(
int
x=2; x<=
sqrt
(n); x++)
{
unsigned p = x;
// Keep multiplying p with x while is smaller
// than or equal to x
while
(p <= n)
{
p *= x;
if
(p == n)
return
true
;
}
}
return
false
;
}
The idea is simple try all numbers x starting from 2 to square root of n (given number). For every x, try x^y where y starts from 2 and increases one by one until either x^y becomes n or greater than n.
// Returns true if n can be written as x^y
bool
isPower(unsigned n)
{
if
(n==1)
return
true
;
// Try all numbers from 2 to sqrt(n) as base
for
(
int
x=2; x<=
sqrt
(n); x++)
{
unsigned y = 2;
unsigned p =
pow
(x, y);
// Keep increasing y while power 'p' is smaller
// than n.
while
(p<=n && p>0)
{
if
(p==n)
return
true
;
y++;
p =
pow
(x, y);
}
}
return
false
;
}
Given a positive integer, find if it can be expressed by integers x and y as x^y where
y > 1 and x > 0.
Example:
Consider the number: 125
Since 125 can be written as x^y where x = 5, y = 3, so return true.
Consider the number: 120
As 120 cannot be expressed as x^y for any integers x > 0 and y > 1, so return false.
public static boolean isPower(int a) {
int factor = 2;
while
(factor <= Math.sqrt(a)) {
int number = a;
while
(number % factor == 0) {
number /= factor;
}
if
(number == 1) {
return
true
;
}
else
{
factor++;
}
}
return
false
;
}
Instead of repeated divisions as given in previous method, we can apply mathematical formula as described:
Given a number a, we have to find integers x and y, such that:
a = x^y
If we take log on both sides, we get:
log a = log (x^y)
log a = y log x
y = log a / log x
Hence, we have to find an integer x for which RHS gives an integer y.
Algorithm:
1: Starting with i = 2, if (log a / log i) is an integer then return true.
2: Else increment i by 1 till i < √a.
3: If no such i is found, return false.
public static boolean isPowerMath(int a) {
if
(a == 1)
return
true
;
for
(int i = 2; i <= Math.sqrt(a); i++) {
double value = Math.log(a) / Math.log(i);
if
((value - (int) value) < 0.000000001) {
return
true
;
}
}
return
false
;
}