Given three numbers a, b and m where 1<=a, m<=10^6. Given very large 'b' containing up to 10^6 digits and m is a prime number, the task is to find (a^b)%m.
Examples:
Input: a = 2, b = 3, m = 17
Output: 8
2 ^ 3 % 17 = 8Input: a = 3, b = 100000000000000000000000000, m = 1000000007
Output: 835987331
Approach: According to Fermat’s little theorem,
a^(p-1) mod p = 1, When p is prime.
From this, as of the problem, M is prime, express A^B mod M as follows:
A^B mod M = ( A^(M-1) * A^(M-1) *.......* A^(M-1) * A^(x) ) mod M
Where x is B mod M-1 and A ^ (M-1) continues B/(M-1) times
Now, from Fermat’s Little Theorem,
A ^ (M-1) mod M = 1.
Hence,
A^B mod M = ( 1 * 1 * ....... * 1 * A^(x) ) mod M
Hence mod B with M-1 to reduce the number to a smaller one and then use power() method to compute (a^b)%m.
Below is the implementation of the above approach:
C++
// C++ program to find // (a^b)%m for b very large. #include <bits/stdc++.h> #define ll long long int using namespace std; // Function to find power ll power(ll x, ll y, ll p) { ll res = 1; // Initialize result // Update x if it is more than or // equal to p x = x % p; while (y > 0) { // If y is odd, multiply x with the 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; } // Driver Code int main() { ll a = 3; // String input as b is very large string b = "100000000000000000000000000" ; ll remainderB = 0; ll MOD = 1000000007; // Reduce the number B to a small number // using Fermat Little for ( int i = 0; i < b.length(); i++) remainderB = (remainderB * 10 + b[i] - '0' ) % (MOD - 1); cout << power(a, remainderB, MOD) << endl; return 0; } |
Java
// Java program to find // (a^b)%m for b very large. import java.io.*; class GFG { // Function to find power static long power( long x, long y, long p) { long res = 1 ; // Initialize result // Update x if it is more // than or equal to p x = x % p; while (y > 0 ) { // If y is odd, multiply // x with the 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; } // Driver Code public static void main (String[] args) { long a = 3 ; // String input as // b is very large String b = "100000000000000000000000000" ; long remainderB = 0 ; long MOD = 1000000007 ; // Reduce the number B to a small // number using Fermat Little for ( int i = 0 ; i < b.length(); i++) remainderB = (remainderB * 10 + b.charAt(i) - '0' ) % (MOD - 1 ); System.out.println(power(a, remainderB, MOD)); } } // This code is contributed by anuj_67. |
Python3
# Python3 program to find # (a^b)%m for b very large. # Function to find power def power(x, y, p): res = 1 ; # Initialize result # Update x if it is # more than or equal to p x = x % p; while (y > 0 ): # If y is odd, multiply # x with the 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; # Driver Code a = 3 ; # String input as b # is very large b = "100000000000000000000000000" ; remainderB = 0 ; MOD = 1000000007 ; # Reduce the number B # to a small number # using Fermat Little for i in range ( len (b)): remainderB = ((remainderB * 10 + ord (b[i]) - 48 ) % (MOD - 1 )); print (power(a, remainderB, MOD)); # This code is contributed by mits |
C#
// C# program to find // (a^b)%m for b very large. using System; class GFG { // Function to find power static long power( long x, long y, long p) { // Initialize result long res = 1; // Update x if it is more // than or equal to p x = x % p; while (y > 0) { // If y is odd, multiply // x with the 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; } // Driver Code public static void Main () { long a = 3; // String input as // b is very large string b = "100000000000000000000000000" ; long remainderB = 0; long MOD = 1000000007; // Reduce the number B to // a small number using // Fermat Little for ( int i = 0; i < b.Length; i++) remainderB = (remainderB * 10 + b[i] - '0' ) % (MOD - 1); Console.WriteLine(power(a, remainderB, MOD)); } } // This code is contributed by anuj_67. |
PHP
<?php // PHP program to find // (a^b)%m for b very large. // Function to find power function power( $x , $y , $p ) { $res = 1; // Initialize result // Update x if it is // more than or equal to p $x = $x % $p ; while ( $y > 0) { // If y is odd, multiply // x with the 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 ; } // Driver Code $a = 3; // String input as b // is very large $b = "100000000000000000000000000" ; $remainderB = 0; $MOD = 1000000007; // Reduce the number B // to a small number // using Fermat Little for ( $i = 0; $i < strlen ( $b ); $i ++) $remainderB = ( $remainderB * 10 + $b [ $i ] - '0' ) % ( $MOD - 1); echo power( $a , $remainderB , $MOD ); // This code is contributed by mits ?> |
835987331