Open In App

GCD of a number raised to some power and another number

Improve
Improve
Improve
Like Article
Like
Save Article
Save
Share
Report issue
Report

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




<?php
// PHP program to find GCD of a^n and b
function gcd($a, $b)
{
    if ($a == 0)
        return $b;
    return gcd($b % $a, $a);
}
 
// Returns GCD of a^n and b.
function powGCD($a, $n, $b)
{
    for ($i = 0; $i < $n; $i++)
        $a = $a * $a;
 
    return gcd($a, $b);
}
 
// Driver code
$a = 10;
$b = 5;
$n = 2;
 
echo powGCD($a, $n, $b);
 
// This code is contributed by ANKITRAI1
?>


Javascript




<script>
// javascript program to find GCD of a^n and b.   
function gcd(a , b)
{
        if (a == 0)
            return b;
        return gcd(b % a, a);
    }
 
    // Returns GCD of a^n and b.
    function powGCD(a , n , b)
    {
        for (i = 0; i < n; i++)
            a = a * a;
 
        return gcd(a, b);
    }
 
    // Driver code
        var a = 10, b = 5, n = 2;
        document.write(powGCD(a, n, b));
 
// This code is contributed by gauravrajput1
</script>


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




<?php
// PHP program of the above approach
// Calculates modular exponentiation,
// i.e.,(x^y)%p in O(log y)
 
function 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;
}
 
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




<script>
 
// Javascript program of the above approach
 
    /*
      Calculates modular exponentiation,
      i.e., (x^y)%p in O(log y)
     */
    function power(x , y , p) {
        var 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;
    }
 
    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) {
        var e = power(a, n, b);
        return gcd(e, b);
    }
 
    // Driver code
     
        var a = 5, b = 4, n = 2;
        document.write(powerGCD(a, b, n));
 
 
// This code contributed by Rajput-Ji
 
</script>


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.



Last Updated : 08 Jun, 2022
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads