# GCD of a number raised to some power and another number

Last Updated : 08 Jun, 2022

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

 ``

Output:

`5`

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 ` `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` `res` ` `  ` `  `def` `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

 ` 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``; ` `} `   `function` `gcd (``\$a``, ``\$b``) ` `{ ` `    ``if` `(``\$a` `== 0) ` `        ``return` `\$b``; ` `    ``return` `gcd(``\$b` `% ``\$a``, ``\$a``); ` `} `   `// Returns GCD of a^n and b ` `function` `powerGCD(``\$a``, ``\$b``, ``\$n``) ` `{ ` `    ``\$e` `= power(``\$a``, ``\$n``, ``\$b``); ` `    ``return` `gcd(``\$e``, ``\$b``); ` `} `   `// Driver code ` `\$a` `= 5;` `\$b` `= 4;` `\$n` `= 2; ` `echo` `powerGCD(``\$a``, ``\$b``, ``\$n``); `   `// This code is contributed by Sachin.` `?>`

## Javascript

 ``

Output:

`1`

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.

Previous
Next