Find (a^b)%m where ‘a’ is very large

• Difficulty Level : Medium
• Last Updated : 26 Jan, 2022

Given three numbers a, b and m where 1<=b,m<=10^6 and ‘a’ may be very large and contains upto 10^6 digits. The task is to find (a^b)%m.

Examples:

Input  : a = 3, b = 2, m = 4
Output : 1
Explanation : (3^2)%4 = 9%4 = 1

Input : a = 987584345091051645734583954832576, b = 3, m = 11
Output: 10

This problem is basically based on modular arithmetic. We can write (a^b) % m as (a%m) * (a%m) * (a%m) * … (a%m), b times. Below is a algorithm to solve this problem :

• Since ‘a’ is very large so read ‘a’ as string.
• Now we try to reduce ‘a’. We take modulo of ‘a’ by m once, i.e; ans = a % m , in this way now ans=a%m lies between integer range 1 to 10^6 i.e; 1 <= a%m <= 10^6.
• Now multiply ans by b-1 times and simultaneously take mod of intermediate multiplication result with m because intermediate multiplication of ans may exceed range of integer and it will produce wrong answer.

C++

 // C++ program to find (a^b) mod m for a large 'a'#includeusing namespace std; // utility function to calculate a%munsigned int aModM(string s, unsigned int mod){    unsigned int number = 0;    for (unsigned int i = 0; i < s.length(); i++)    {        // (s[i]-'0') gives the digit value and form        // the number        number = (number*10 + (s[i] - '0'));        number %= mod;    }    return number;} // Returns find (a^b) % munsigned int ApowBmodM(string &a, unsigned int b,                                  unsigned int m){    // Find a%m    unsigned int ans = aModM(a, m);    unsigned int mul = ans;     // now multiply ans by b-1 times and take    // mod with m    for (unsigned int i=1; i

Java

 // Java program to find (a^b) mod m for a large 'a' public class GFG {         // utility function to calculate a%m    static int aModM(String s, int mod)    {        int number = 0;        for (int i = 0; i < s.length(); i++)        {                         // (s[i]-'0') gives the digit            // value and form the number            number = (number * 10 );            int x = Character.getNumericValue(s.charAt(i));            number = number + x;            number %= mod;        }                 return number;    }     // Returns find (a^b) % m    static int ApowBmodM(String a, int b, int m)    {                 // Find a%m        int ans = aModM(a, m);        int mul = ans;             // now multiply ans by b-1 times        // and take mod with m        for (int i = 1; i < b; i++)            ans = (ans * mul) % m;             return ans;    }     // Driver code    public static void main(String args[])    {        String a = "987584345091051645734583954832576";        int b = 3, m = 11;        System.out.println(ApowBmodM(a, b, m));    }} // This code is contributed by Sam007

Python3

 # Python program to find (a^b) mod m for a large 'a'def aModM(s, mod):    number = 0     # convert string s[i] to integer which gives    # the digit value and form the number    for i in range(len(s)):        number = (number*10 + int(s[i]))        number = number % m     return number # Returns find (a^b) % mdef ApowBmodM(a, b, m):     # Find a%m       ans = aModM(a, m)    mul = ans     # now multiply ans by b-1 times and take    # mod with m    for i in range(1,b):        ans = (ans*mul) % m             return ans  # Driver program to run the casea = "987584345091051645734583954832576"b, m = 3, 11print (ApowBmodM(a, b, m))

C#

 // C# program to find (a^b) mod m// for a large 'a'using System; class GFG {     // utility function to calculate a%mstatic int aModM(string s, int mod){    int number = 0;    for (int i = 0; i < s.Length; i++)    {                 // (s[i]-'0') gives the digit        // value and form the number        number = (number * 10 );        int x = (int)(s[i] - '0');        number = number + x;        number %= mod;    }    return number;} // Returns find (a^b) % mstatic int ApowBmodM(string a, int b,                              int m){         // Find a%m    int ans = aModM(a, m);    int mul = ans;     // now multiply ans by b-1 times    // and take mod with m    for (int i = 1; i < b; i++)        ans = (ans * mul) % m;     return ans;} // Driver Codepublic static void Main(){    string a = "987584345091051645734583954832576";    int b=3, m=11;    Console.Write(ApowBmodM(a, b, m));     }} // This code is contributed by Sam007



Javascript


Output
10

Time Complexity: O(len(a)+b)

Auxiliary Space: O(1)

Efficient Approach: The above multiplications can be reduced to log b by using fast modular exponentiation where we calculate result by the binary representation of exponent (b). If the set bit is 1 we multiply current value of base to result and square the value of base for each recursive call.

Recursive Code:

C++14

 #include using namespace std;typedef long long ll; // Reduce the number B to a small number    // using Fermat Littlell MOD(string num,int mod){    ll res=0;         for(int i=0;i
Output
10

Time Complexity: O(len(a)+ log b)

Auxiliary Space: O(log b)

Space Efficient Iterative Code:

C++14

 // C++ program to find (a^b) mod m for a large 'a'#includeusing namespace std;typedef long long ll; // utility function to calculate a%m and b%mll aModM(string s, ll mod){    ll number = 0;    for (ll i = 0; i < s.length(); i++)    {        // (s[i]-'0') gives the digit value and form        // the number        number = (number*10 + (s[i] - '0'));        number %= mod;    }    return number;} // Returns find (a^b) % mll ApowBmodM(ll x, ll y,ll m){    ll res=1;     while(y)    {        if(y&1)        res=(res*x)%m;        y=y>>1;        x=((x*x)%m+m)%m;    }    return (res%m+m)%m;} // Driver program to run the caseint main(){    string a = "987584345091051645734583954832576";    ll b=3;    ll m=11;            // Find a%m    ll x=aModM(a,m);    cout << ApowBmodM(x,b,m);    return 0;}
Output
10

Time Complexity: O(len(a)+ log b)

Auxiliary Space: O(1)

Case: When both ‘a’ and ‘b’ are very large.

We can also implement the same approach if both ‘a’ and ‘b’ was very large. In that case, we would have first took mod of it with m using our aModM function. Then pass it to the above ApowBmodM recursive or iterative function to get the required result.

Recursive Code:

C++14

 #include using namespace std;typedef long long ll; // Reduce the number B to a small number    // using Fermat Littlell MOD(string num,int mod){    ll res=0;         for(int i=0;i
Output
546081867

Time Complexity: O(len(a)+len(b)+log b)

Auxiliary Space: O(log b)

Space Efficient Iterative Code:

C++14

 // C++ program to find (a^b) mod m for a large 'a'#includeusing namespace std;typedef long long ll; // utility function to calculate a%m and b%mll aModM(string s, ll mod){    ll number = 0;    for (ll i = 0; i < s.length(); i++)    {        // (s[i]-'0') gives the digit value and form        // the number        number = (number*10 + (s[i] - '0'));        number %= mod;    }    return number;} // Returns find (a^b) % mll ApowBmodM(string &a, string& b,ll m){    ll res=1;         // Find a%m    ll x = aModM(a,m);         // Find b%m    ll y = aModM(b,m);     while(y)    {        if(y&1)        res=(res*x)%m;        y=y>>1;        x=((x%m)*(x%m))%m;    }    return (res%m+m)%m;} // Driver program to run the caseint main(){    string a = "987584345091051645734583954832576";    string b="467687655456765756453454365476765";    ll m=1000000007;    cout << ApowBmodM(a,b,m);    return 0;}
Output
546081867

Time Complexity: O(len(a)+len(b)+ log b)

Auxiliary Space: O(1)

This article is contributed by Shashank Mishra ( Gullu ) and improved by prophet1999. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.