Related Articles

Related Articles

Find GCD between the sum of two given integers raised to the power of N and their difference
  • Last Updated : 15 Jan, 2021

Given three positive integers, P, Q and N, the task is to find the GCD of (PN + QN) and (P – Q) under modulo 109 + 7.

Examples:

Input: p = 10, q = 6, n = 5
Output: 4
Explanation: pn + qn = 105 + 65 = 107776  and p – q = 4. GCD of 107776 and 4 is 4.

Input: p = 7, q = 2 and n = 5
Output: 1
Explanation: pn + qn = 75 + 25  = 16839 and p – q = 5. GCD of 16839 and 5 is 1.

Approach: Since the number (pn + qn) can be extremely large, such a huge number cannot be stored in any data type and thus GCD cannot be calculated using the Euclidean algorithm. Therefore, modular arithmetic can be used to find the answer. 



Follow the below steps to solve this problem:

  • To find the GCD of a big number and a small number, find the divisors of the smaller number in O(√p-q).
  • These numbers are the potential GCD candidates.
  • Now, check if any of these potential GCDs divides the larger number. The largest number which divides both the numbers is the final answer.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program for the above approach
 
#include <bits/stdc++.h>
#define mod 1000000007
using namespace std;
 
// Function to find the value of (a ^ n) % d
long long int power(long long a, long long n,
                    long long int d)
{
 
    // Stores the value
    // of (a ^ n) % d
    long long int res = 1;
 
    // Calculate the value
    // of (a ^ n) % d
    while (n) {
 
        // If n is odd
        if (n % 2) {
 
            // Update res
            res = ((res % d) * (a % d)) % d;
        }
 
        // Update a
        a = ((a % d) * (a % d)) % d;
 
        // Update n
        n /= 2;
    }
 
    return res;
}
 
// Function to find the GCD of (p ^ n + q ^ n)
// and p - q mod d
long long int gcd(long long p, long long q,
                  long long n)
{
 
    // If p and q are equal
    if (p == q) {
        return (power(p, n, mod)
                + power(q, n, mod))
               % mod;
    }
 
    // Stores GCD of (p ^ n + q ^ n)
    // and (p - q) mod d
    long long int candidate = 1;
 
    // Stores the value of (p-q)
    long long int num = p - q;
 
    // Stores square root of num
    long long int sq = sqrt(num);
 
    // Find the divisors of num.
    for (long long i = 1; i <= sq; ++i) {
 
        // If i divides num
        if (num % i == 0) {
 
            // Stores power of (p ^ n) mod i
            long long int X = power(p, n, i);
 
            // Stores power of (q ^ n) mod i
            long long int Y = power(q, n, i);
 
            // Stores power of (p ^ n + q ^ n) mod i
            long long int temp = (X + Y) % i;
 
            // If (p^n + q^n) is divisible by i
            if (temp == 0) {
 
                // Calculate the largest divisor.
                candidate = max(candidate, i);
            }
 
            // If i divides num, (num/i) also divides
            // num. Hence, calculate temp.
            temp = (power(p, n, num / i)
                    + power(q, n, num / i))
                   % (num / i);
 
            // If (p^n + q^n) is divisible
            // by (num/i)
            if (temp == 0) {
 
                // Calculate the largest divisor.
                candidate = max(candidate, num / i);
            }
        }
    }
 
    return candidate % mod;
}
 
// Driver Code
int main()
{
 
    // Given p, q and n
    long long int p, q, n;
    p = 10;
    q = 6;
    n = 5;
 
    // Function Call
    cout << gcd(p, q, n);
 
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program for the above approach
import java.util.*;
class GFG
{
static int mod = 1000000007;
       
// Function to find the value of (a ^ n) % d
static int power(int a, int n, int d)
{
 
    // Stores the value
    // of (a ^ n) % d
    int res = 1;
 
    // Calculate the value
    // of (a ^ n) % d
    while (n != 0) {
 
        // If n is odd
        if ((n % 2) !=0) {
 
            // Update res
            res = ((res % d) * (a % d)) % d;
        }
 
        // Update a
        a = ((a % d) * (a % d)) % d;
 
        // Update n
        n /= 2;
    }
 
    return res;
}
 
// Function to find the GCD of (p ^ n + q ^ n)
// and p - q mod d
static int gcd(int p, int q, int n)
{
 
    // If p and q are equal
    if (p == q) {
        return (power(p, n, mod)
                + power(q, n, mod))
               % mod;
    }
 
    // Stores GCD of (p ^ n + q ^ n)
    // and (p - q) mod d
    int candidate = 1;
 
    // Stores the value of (p-q)
    int num = p - q;
 
    // Stores square root of num
    int sq = (int)Math.sqrt(num);
 
    // Find the divisors of num.
    for (int  i = 1; i <= sq; ++i) {
 
        // If i divides num
        if (num % i == 0) {
 
            // Stores power of (p ^ n) mod i
            int X = power(p, n, i);
 
            // Stores power of (q ^ n) mod i
            int Y = power(q, n, i);
 
            // Stores power of (p ^ n + q ^ n) mod i
            int temp = (X + Y) % i;
 
            // If (p^n + q^n) is divisible by i
            if (temp == 0) {
 
                // Calculate the largest divisor.
                candidate = Math.max(candidate, i);
            }
 
            // If i divides num, (num/i) also divides
            // num. Hence, calculate temp.
            temp = (power(p, n, num / i)
                    + power(q, n, num / i))
                   % (num / i);
 
            // If (p^n + q^n) is divisible
            // by (num/i)
            if (temp == 0) {
 
                // Calculate the largest divisor.
                candidate = Math.max(candidate, num / i);
            }
        }
    }
    return candidate % mod;
}
   
// Driver code
public static void main(String[] args)
{
    // Given p, q and n
    int p, q, n;
    p = 10;
    q = 6;
    n = 5;
 
    // Function Call
    System.out.println(gcd(p, q, n));
}
}
 
// This code is contributed by code_hunt.

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python program for the above approach
import math
mod = 1000000007;
 
# Function to find the value of (a ^ n) % d
def power(a, n, d):
 
    # Stores the value
    # of (a ^ n) % d
    res = 1;
 
    # Calculate the value
    # of (a ^ n) % d
    while (n != 0):
 
        # If n is odd
        if ((n % 2) != 0):
 
            # Update res
            res = ((res % d) * (a % d)) % d;
         
        # Update a
        a = ((a % d) * (a % d)) % d;
 
        # Update n
        n /= 2;
    return res;
 
# Function to find the GCD of (p ^ n + q ^ n)
# and p - q mod d
def gcd(p, q, n):
 
    # If p and q are equal
    if (p == q):
        return (power(p, n, mod) + power(q, n, mod)) % mod;
     
    # Stores GCD of (p ^ n + q ^ n)
    # and (p - q) mod d
    candidate = 1;
 
    # Stores the value of (p-q)
    num = p - q;
 
    # Stores square root of num
    sq = (int)(math.sqrt(num));
 
    # Find the divisors of num.
    for i in range(1, sq):
 
        # If i divides num
        if (num % i == 0):
 
            # Stores power of (p ^ n) mod i
            X = power(p, n, i);
 
            # Stores power of (q ^ n) mod i
            Y = power(q, n, i);
 
            # Stores power of (p ^ n + q ^ n) mod i
            temp = (X + Y) % i;
 
            # If (p^n + q^n) is divisible by i
            if (temp == 0):
 
                # Calculate the largest divisor.
                candidate = max(candidate, i);
             
 
            # If i divides num, (num/i) also divides
            # num. Hence, calculate temp.
            temp = (power(p, n, num / i) + power(q, n, num / i)) % (num / i);
 
            # If (p^n + q^n) is divisible
            # by (num/i)
            if (temp == 0):
 
                # Calculate the largest divisor.
                candidate = max(candidate, num / i);           
    return candidate % mod;
 
# Driver code
if __name__ == '__main__':
 
  # Given p, q and n
    p = 10;
    q = 6;
    n = 5;
 
    # Function Call
    print((int)(gcd(p, q, n)));
 
# This code contributed by aashish1995

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program for the above approach
using System;
 
class GFG
{
    static int mod = 1000000007;
 
    // Function to find the value of (a ^ n) % d
    static int power(int a, int n, int d)
    {
 
        // Stores the value
        // of (a ^ n) % d
        int res = 1;
 
        // Calculate the value
        // of (a ^ n) % d
        while (n != 0)
        {
 
            // If n is odd
            if ((n % 2) != 0)
            {
 
                // Update res
                res = ((res % d) * (a % d)) % d;
            }
 
            // Update a
            a = ((a % d) * (a % d)) % d;
 
            // Update n
            n /= 2;
        }
 
        return res;
    }
 
    // Function to find the GCD of (p ^ n + q ^ n)
    // and p - q mod d
    static int gcd(int p, int q, int n)
    {
 
        // If p and q are equal
        if (p == q)
        {
            return (power(p, n, mod) + power(q, n, mod))
                % mod;
        }
 
        // Stores GCD of (p ^ n + q ^ n)
        // and (p - q) mod d
        int candidate = 1;
 
        // Stores the value of (p-q)
        int num = p - q;
 
        // Stores square root of num
        int sq = (int)Math.Sqrt(num);
 
        // Find the divisors of num.
        for (int i = 1; i <= sq; ++i) {
 
            // If i divides num
            if (num % i == 0) {
 
                // Stores power of (p ^ n) mod i
                int X = power(p, n, i);
 
                // Stores power of (q ^ n) mod i
                int Y = power(q, n, i);
 
                // Stores power of (p ^ n + q ^ n) mod i
                int temp = (X + Y) % i;
 
                // If (p^n + q^n) is divisible by i
                if (temp == 0) {
 
                    // Calculate the largest divisor.
                    candidate = Math.Max(candidate, i);
                }
 
                // If i divides num, (num/i) also divides
                // num. Hence, calculate temp.
                temp = (power(p, n, num / i)
                        + power(q, n, num / i))
                       % (num / i);
 
                // If (p^n + q^n) is divisible
                // by (num/i)
                if (temp == 0) {
 
                    // Calculate the largest divisor.
                    candidate
                        = Math.Max(candidate, num / i);
                }
            }
        }
        return candidate % mod;
    }
 
    // Driver code
    static public void Main()
    {
 
        // Given p, q and n
        int p, q, n;
        p = 10;
        q = 6;
        n = 5;
 
        // Function Call
        Console.WriteLine(gcd(p, q, n));
    }
}
 
// This is contributed by Dharanendra L V

chevron_right


Output: 

4

 

Time Complexity: O(sqrt(p – q))
Auxiliary Space: O(1)

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.




My Personal Notes arrow_drop_up
Recommended Articles
Page :