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

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
```

## Recommended: Please solve it on “PRACTICE” first, before moving on to the solution.

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' ` `#include ` `using` `namespace` `std; ` ` `  `// utility function to calculate a%m ` `unsigned ``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) % m ` `unsigned ``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 `

## Python

 `# 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) % m ` `def` `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 case ` `a ``=` `"987584345091051645734583954832576"` `b, m ``=` `3``, ``11` `print` `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%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 = (``int``)(s[i] - ``'0'``); ` `        ``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` `a = ``"987584345091051645734583954832576"``; ` `    ``int` `b=3, m=11; ` `    ``Console.Write(ApowBmodM(a, b, m)); ` `     `  `} ` `} ` ` `  `// This code is contributed by Sam007 ` ` `  ` `  ` `  ` `

## PHP

 ` `

Output:

```10
```

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