GCD of a number raised to some power and another number (original) (raw)
Last Updated : 11 Jul, 2025
Given three numbers a, b, n. Find GCD(an, b).
Examples:
Input : a = 2, b = 3, n = 3 Output : 1 2^3 = 8. GCD of 8 and 3 is 1.
Input : a = 2, b = 4, n = 5 Output : 4
First Approach : Brute Force approach is to first compute a^n, then compute GCD of a^n and b.
C++ `
// CPP program to find GCD of a^n and b. #include <bits/stdc++.h> using namespace std;
typedef long long int ll;
ll gcd(ll a, ll b) { if (a == 0) return b; return gcd(b % a, a); }
// Returns GCD of a^n and b. ll powGCD(ll a, ll n, ll b) { for (int i = 0; i < n; i++) a = a * a;
return gcd(a, b);}
// Driver code int main() { ll a = 10, b = 5, n = 2; cout << powGCD(a, n, b); return 0; }
Java
// Java program to find GCD of a^n and b.
import java.io.*;
class GFG {
static long gcd(long a, long b) { if (a == 0) return b; return gcd(b % a, a); }
// Returns GCD of a^n and b. static long powGCD(long a, long n, long b) { for (int i = 0; i < n; i++) a = a * a;
return gcd(a, b);}
// Driver code public static void main (String[] args) { long a = 10, b = 5, n = 2; System.out.println(powGCD(a, n, b)); } } // This code is contributed by anuj_67..
Python3
Python 3 program to find
GCD of a^n and b.
def gcd(a, b): if (a == 0): return b return gcd(b % a, a)
Returns GCD of a^n and b.
def powGCD(a, n, b): for i in range(0, n + 1, 1): a = a * a
return gcd(a, b)Driver code
if name == 'main': a = 10 b = 5 n = 2 print(powGCD(a, n, b))
This code is contributed
by Surendra_Gangwar
C#
// C# program to find GCD of a^n and b. using System;
class GFG { public static long gcd(long a, long b) { if (a == 0) { return b; } return gcd(b % a, a); }
// Returns GCD of a^n and b. public static long powGCD(long a, long n, long b) { for (int i = 0; i < n; i++) { a = a * a; }
return gcd(a, b);}
// Driver code public static void Main(string[] args) { long a = 10, b = 5, n = 2; Console.WriteLine(powGCD(a, n, b)); } }
// This code is contributed // by Shrikant13
PHP
JavaScript
`
Time Complexity: O(n + log(min(a, b)), where n, a and b represents the given integer.
Auxiliary Space: O(log(min(a, b))), due to the recursive stack space.
But, what if n is very large (say > 10^9). Modular Exponentiation is the way. We know (a*b) % m = ( (a%m) * (b%m) ) % m). We also know gcd(a, b) = gcd(b%a, a) . So instead of computing " pow(a, n), we use modular exponentiation.
C++ `
// C++ program of the above approach #include <bits/stdc++.h> using namespace std;
typedef long long int ll;
/* Calculates modular exponentiation, i.e., (x^y)%p in O(log y) */ ll power(ll x, ll y, ll p) { ll res = 1; // Initialize result
x = x % p; // Update x if it is more than or
// equal to p
while (y > 0) {
// If y is odd, multiply x with result
if (y & 1)
res = (res * x) % p;
// y must be even now
y = y >> 1; // y = y/2
x = (x * x) % p;
}
return res;}
ll gcd(ll a, ll b) { if (a == 0) return b; return gcd(b % a, a); }
// Returns GCD of a^n and b ll powerGCD(ll a, ll b, ll n) { ll e = power(a, n, b); return gcd(e, b); }
// Driver code int main() { ll a = 5, b = 4, n = 2; cout << powerGCD(a, b, n); return 0; }
Java
// Java program of the above approach import java.util.*; class Solution{
/* Calculates modular exponentiation, i.e., (x^y)%p in O(log y) */ static long power(long x, long y, long p) { long res = 1; // Initialize result
x = x % p; // Update x if it is more than or
// equal to p
while (y > 0) {
// If y is odd, multiply x with result
if ((y & 1)!=0)
res = (res * x) % p;
// y must be even now
y = y >> 1; // y = y/2
x = (x * x) % p;
}
return res; }
static long gcd(long a, long b) { if (a == 0) return b; return gcd(b % a, a); }
// Returns GCD of a^n and b static long powerGCD(long a, long b, long n) { long e = power(a, n, b); return gcd(e, b); }
// Driver code public static void main(String args[]) { long a = 5, b = 4, n = 2; System.out.print( powerGCD(a, b, n));
} } //contributed by Arnab Kundu
Python3
Python3 program of the above approach
Calculates modular exponentiation, i.e.,
(x^y)%p in O(log y)
def power( x, y, p):
res = 1 # Initialize result
x = x % p # Update x if it is more than or
# equal to p
while (y > 0) :
# If y is odd, multiply x with result
if (y & 1):
res = (res * x) % p
# y must be even now
y = y >> 1 # y = y/2
x = (x * x) % p
return resdef gcd(a, b):
if (a == 0):
return b
return gcd(b % a, a)Returns GCD of a^n and b
def powerGCD( a, b, n):
e = power(a, n, b)
return gcd(e, b)Driver code
if name == "main":
a = 5
b = 4
n = 2
print (powerGCD(a, b, n))C#
// C# program of the above approach using System; class GFG {
/* Calculates modular exponentiation, i.e., (x^y)%p in O(log y) */ static long power(long x, long y, long p) { long res = 1; // Initialize result
x = x % p; // Update x if it is more
// than or equal to p
while (y > 0)
{
// If y is odd, multiply x
// with result
if ((y & 1) != 0)
res = (res * x) % p;
// y must be even now
y = y >> 1; // y = y/2
x = (x * x) % p;
}
return res; }
static long gcd(long a, long b) { if (a == 0) return b; return gcd(b % a, a); }
// Returns GCD of a^n and b static long powerGCD(long a, long b, long n) { long e = power(a, n, b); return gcd(e, b); }
// Driver code public static void Main() { long a = 5, b = 4, n = 2; Console.Write( powerGCD(a, b, n)); } }
// This code is contributed // by Akanksha Rai
PHP
JavaScript
`
Time Complexity: O(logn + log(min(a, b)), where n, a and b represents the given integer.
Auxiliary Space: O(log(min(a, b))), due to the recursive stack space.