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.
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!
Last Updated :
06 Mar, 2023
Like Article
Save Article