Modular exponentiation (Recursive)

31 May, 2022
Given three numbers a, b and c, we need to find (ab) % cNow why do “% c” after exponentiation, because ab will be really large even for relatively small values of a, b and that is a problem because the data type of the language that we try to code the problem, will most probably not let us store such a large number.Examples:  
Input : a = 2312 b = 3434 c = 6789
Output : 6343

Input : a = -3 b = 5 c = 89 
Output : 24
Auxiliary Space: O(1) 
The idea is based on below properties.Property 1: (m * n) % p has a very interesting property: (m * n) % p =((m % p) * (n % p)) % pProperty 2: if b is even: (a ^ b) % c = ((a ^ b/2) * (a ^ b/2))%c ? this suggests divide and conquer if b is odd: (a ^ b) % c = (a * (a ^( b-1))%cProperty 3: If we have to return the mod of a negative number x whose absolute value is less than y: then (x + y) % y will do the trickNote: Also as the product of (a ^ b/2) * (a ^ b/2) and a * (a ^( b-1) may cause overflow, hence we must be careful about those scenarios  
C++
C
Java
Python3
C#
PHP
Javascript
// Recursive C++ program to compute modular power#include <bits/stdc++.h>using namespace std; int exponentMod(int A, int B, int C){    // Base cases    if (A == 0)        return 0;    if (B == 0)        return 1;     // If B is even    long y;    if (B % 2 == 0) {        y = exponentMod(A, B / 2, C);        y = (y * y) % C;    }     // If B is odd    else {        y = A % C;        y = (y * exponentMod(A, B - 1, C) % C) % C;    }     return (int)((y + C) % C);} // Driver codeint main(){    int A = 2, B = 5, C = 13;    cout << "Power is " << exponentMod(A, B, C);    return 0;} // This code is contributed by SHUBHAMSINGH10
// Recursive C program to compute modular power#include <stdio.h> int exponentMod(int A, int B, int C){    // Base cases    if (A == 0)        return 0;    if (B == 0)        return 1;     // If B is even    long y;    if (B % 2 == 0) {        y = exponentMod(A, B / 2, C);        y = (y * y) % C;    }     // If B is odd    else {        y = A % C;        y = (y * exponentMod(A, B - 1, C) % C) % C;    }     return (int)((y + C) % C);} // Driver program to test above functionsint main(){   int A = 2, B = 5, C = 13;   printf("Power is %d", exponentMod(A, B, C));   return 0;}
// Recursive Java program// to compute modular powerimport java.io.*; class GFG{static int exponentMod(int A,                       int B, int C){             // Base cases    if (A == 0)        return 0;    if (B == 0)        return 1;         // If B is even    long y;    if (B % 2 == 0)    {        y = exponentMod(A, B / 2, C);        y = (y * y) % C;    }         // If B is odd    else    {        y = A % C;        y = (y * exponentMod(A, B - 1,                             C) % C) % C;    }         return (int)((y + C) % C);} // Driver Codepublic static void main(String args[]){    int A = 2, B = 5, C = 13;    System.out.println("Power is " +                        exponentMod(A, B, C));}} // This code is contributed// by Swetank Modi.
# Recursive Python program# to compute modular powerdef exponentMod(A, B, C):         # Base Cases    if (A == 0):        return 0    if (B == 0):        return 1         # If B is Even    y = 0    if (B % 2 == 0):        y = exponentMod(A, B / 2, C)        y = (y * y) % C         # If B is Odd    else:        y = A % C        y = (y * exponentMod(A, B - 1,                             C) % C) % C    return ((y + C) % C) # Driver CodeA = 2B = 5C = 13print("Power is", exponentMod(A, B, C))     # This code is contributed# by Swetank Modi.
// Recursive C# program// to compute modular powerclass GFG{static int exponentMod(int A, int B, int C){             // Base cases    if (A == 0)        return 0;    if (B == 0)        return 1;         // If B is even    long y;    if (B % 2 == 0)    {        y = exponentMod(A, B / 2, C);        y = (y * y) % C;    }         // If B is odd    else    {        y = A % C;        y = (y * exponentMod(A, B - 1,                             C) % C) % C;    }         return (int)((y + C) % C);} // Driver Codepublic static void Main(){    int A = 2, B = 5, C = 13;    System.Console.WriteLine("Power is " +                    exponentMod(A, B, C));}} // This code is contributed// by mits
<?php// Recursive PHP program to// compute modular powerfunction exponentMod($A, $B, $C){    // Base cases    if ($A == 0)        return 0;    if ($B == 0)        return 1;         // If B is even    if ($B % 2 == 0)    {        $y = exponentMod($A, $B / 2, $C);        $y = ($y * $y) % $C;    }         // If B is odd    else    {        $y = $A % $C;        $y = ($y * exponentMod($A, $B - 1,                               $C) % $C) % $C;    }         return (($y + $C) % $C);}  // Driver Code$A = 2;$B = 5;$C = 13;echo "Power is " . exponentMod($A, $B, $C); // This code is contributed// by Swetank Modi.?>
<script> // Recursive Javascript program// to compute modular power // Function to check if a given// quadilateral is valid or notfunction exponentMod(A, B, C){         // Base cases    if (A == 0)        return 0;    if (B == 0)        return 1;         // If B is even    var y;    if (B % 2 == 0)    {        y = exponentMod(A, B / 2, C);        y = (y * y) % C;    }         // If B is odd    else    {        y = A % C;        y = (y * exponentMod(A, B - 1,                             C) % C) % C;    }         return parseInt(((y + C) % C));} // Driver codevar A = 2, B = 5, C = 13;document.write("Power is " +               exponentMod(A, B, C));     // This code is contributed by Khushboogoyal499 </script>
Power is 6
 
Time Complexity : O(logn)
Auxiliary Space: O(logn)
Iterative modular exponentiation. 
swetankmodi
Mithun Kumar
SHUBHAMSINGH10
khushboogoyal499
rishavnitro
Modular Arithmetic
Divide and Conquer
Mathematical
Recursion
Mathematical
Recursion
Divide and Conquer
Modular Arithmetic
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.