Modular exponentiation (Recursive)
Last Updated :
06 Mar, 2023
Given three numbers a, b and c, we need to find (ab) % c
Now 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)) % p
Property 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))%c
Property 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 trick
Note:
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++
#include <bits/stdc++.h>
using namespace std;
int exponentMod( int A, int B, int C)
{
if (A == 0)
return 0;
if (B == 0)
return 1;
long y;
if (B % 2 == 0) {
y = exponentMod(A, B / 2, C);
y = (y * y) % C;
}
else {
y = A % C;
y = (y * exponentMod(A, B - 1, C) % C) % C;
}
return ( int )((y + C) % C);
}
int main()
{
int A = 2, B = 5, C = 13;
cout << "Power is " << exponentMod(A, B, C);
return 0;
}
|
C
#include <stdio.h>
int exponentMod( int A, int B, int C)
{
if (A == 0)
return 0;
if (B == 0)
return 1;
long y;
if (B % 2 == 0) {
y = exponentMod(A, B / 2, C);
y = (y * y) % C;
}
else {
y = A % C;
y = (y * exponentMod(A, B - 1, C) % C) % C;
}
return ( int )((y + C) % C);
}
int main()
{
int A = 2, B = 5, C = 13;
printf ( "Power is %d" , exponentMod(A, B, C));
return 0;
}
|
Java
import java.io.*;
class GFG
{
static int exponentMod( int A,
int B, int C)
{
if (A == 0 )
return 0 ;
if (B == 0 )
return 1 ;
long y;
if (B % 2 == 0 )
{
y = exponentMod(A, B / 2 , C);
y = (y * y) % C;
}
else
{
y = A % C;
y = (y * exponentMod(A, B - 1 ,
C) % C) % C;
}
return ( int )((y + C) % C);
}
public static void main(String args[])
{
int A = 2 , B = 5 , C = 13 ;
System.out.println( "Power is " +
exponentMod(A, B, C));
}
}
|
Python3
def exponentMod(A, B, C):
if (A = = 0 ):
return 0
if (B = = 0 ):
return 1
y = 0
if (B % 2 = = 0 ):
y = exponentMod(A, B / 2 , C)
y = (y * y) % C
else :
y = A % C
y = (y * exponentMod(A, B - 1 ,
C) % C) % C
return ((y + C) % C)
A = 2
B = 5
C = 13
print ( "Power is" , exponentMod(A, B, C))
|
C#
class GFG
{
static int exponentMod( int A, int B, int C)
{
if (A == 0)
return 0;
if (B == 0)
return 1;
long y;
if (B % 2 == 0)
{
y = exponentMod(A, B / 2, C);
y = (y * y) % C;
}
else
{
y = A % C;
y = (y * exponentMod(A, B - 1,
C) % C) % C;
}
return ( int )((y + C) % C);
}
public static void Main()
{
int A = 2, B = 5, C = 13;
System.Console.WriteLine( "Power is " +
exponentMod(A, B, C));
}
}
|
PHP
<?php
function exponentMod( $A , $B , $C )
{
if ( $A == 0)
return 0;
if ( $B == 0)
return 1;
if ( $B % 2 == 0)
{
$y = exponentMod( $A , $B / 2, $C );
$y = ( $y * $y ) % $C ;
}
else
{
$y = $A % $C ;
$y = ( $y * exponentMod( $A , $B - 1,
$C ) % $C ) % $C ;
}
return (( $y + $C ) % $C );
}
$A = 2;
$B = 5;
$C = 13;
echo "Power is " . exponentMod( $A , $B , $C );
?>
|
Javascript
<script>
function exponentMod(A, B, C)
{
if (A == 0)
return 0;
if (B == 0)
return 1;
var y;
if (B % 2 == 0)
{
y = exponentMod(A, B / 2, C);
y = (y * y) % C;
}
else
{
y = A % C;
y = (y * exponentMod(A, B - 1,
C) % C) % C;
}
return parseInt(((y + C) % C));
}
var A = 2, B = 5, C = 13;
document.write( "Power is " +
exponentMod(A, B, C));
</script>
|
Time Complexity : O(logn)
Auxiliary Space: O(logn)
Iterative modular exponentiation.
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...