Exponential Squaring (Fast Modulo Multiplication) - GeeksforGeeks

07 Feb, 2020
Given two numbers base and exp, we need to compute baseexp under Modulo 10^9+7
Examples:
Input : base = 2, exp = 2
Output : 4

Input  : base = 5, exp = 100000
Output : 754573817

In competitions, for calculating large powers of a number we are given a modulus value(a large prime number) because as the values of  is being calculated it can get very large so instead we have to calculate (%modulus value.)We can use the modulus in our naive way by using modulus on all the intermediate steps and take modulus at the end,but in competitions it will definitely show TLE. So, what we can do.The answer is we can try exponentiation by squaring which is a fast method for calculating exponentiation of a number.Here we will be discussing two most common/important methods:
Basic Method(Binary Exponentiation)-ary method.
Basic Method(Binary Exponentiation)
-ary method.
Binary Exponentiation
As described in this article we will be using following formula to recursively calculate (%modulus value):
C++
Java
Python3
C#
PHP
// C++ program to compute exponential // value under modulo using binary // exponentiation.#include<iostream>using namespace std;  #define N 1000000007 // prime modulo value  long int exponentiation(long int base,                        long int exp){    if (exp == 0)        return 1;      if (exp == 1)        return base % N;      long int t = exponentiation(base, exp / 2);    t = (t * t) % N;      // if exponent is even value    if (exp % 2 == 0)        return t;      // if exponent is odd value    else        return ((base % N) * t) % N;}  // Driver Codeint main(){    long int base = 5;    long int exp = 100000;      long int modulo = exponentiation(base, exp);    cout << modulo << endl;    return 0;}  // This Code is contributed by mits
// Java program to compute exponential value under modulo// using binary exponentiation.import java.util.*;import java.lang.*;import java.io.*;  class exp_sq {    static long N = 1000000007L; // prime modulo value    public static void main(String[] args)    {        long base = 5;        long exp = 100000;          long modulo = exponentiation(base, exp);        System.out.println(modulo);    }      static long exponentiation(long base, long exp)    {        if (exp == 0)            return 1;          if (exp == 1)            return base % N;          long t = exponentiation(base, exp / 2);        t = (t * t) % N;          // if exponent is even value        if (exp % 2 == 0)            return t;          // if exponent is odd value        else            return ((base % N) * t) % N;    }}
# Python3 program to compute # exponential value under# modulo using binary # exponentiation.  # prime modulo valueN = 1000000007;      # Function code def exponentiation(bas, exp):    if (exp == 0):        return 1;    if (exp == 1):        return bas % N;          t = exponentiation(bas, int(exp / 2));    t = (t * t) % N;          # if exponent is    # even value    if (exp % 2 == 0):        return t;              # if exponent is    # odd value    else:        return ((bas % N) * t) % N;  # Driver codebas = 5;exp = 100000;  modulo = exponentiation(bas, exp);print(modulo);  # This code is contributed# by mits
// C# program to compute exponential// value under modulo using binary // exponentiation.using System;  class GFG {          // prime modulo value    static long N = 1000000007L;          // Driver code    public static void Main()    {        long bas = 5;        long exp = 100000;          long modulo = exponentiation(bas, exp);        Console.Write(modulo);    }      static long exponentiation(long bas, long exp)    {        if (exp == 0)            return 1;          if (exp == 1)            return bas % N;          long t = exponentiation(bas, exp / 2);        t = (t * t) % N;          // if exponent is even value        if (exp % 2 == 0)            return t;          // if exponent is odd value        else            return ((bas % N) * t) % N;    }}  // This code is contributed by nitin mittal.
<?php// PHP program to compute exponential// value under modulo using binary // exponentiation.  // prime modulo value$N = 1000000007;      // Function code function exponentiation($bas, $exp){    global $N ;    if ($exp == 0)        return 1;      if ($exp == 1)        return $bas % $N;      $t = exponentiation($bas,                         $exp / 2);    $t = ($t * $t) % $N;      // if exponent is    // even value    if ($exp % 2 == 0)        return $t;      // if exponent is    // odd value    else        return (($bas % $N) *                 $t) % $N;}  // Driver code$bas = 5;$exp = 100000;  $modulo = exponentiation($bas, $exp);echo ($modulo);  // This code is contributed by ajit?>
754573817

-ary method:
In this algorithm we will be expanding the exponent in base (k>=1), which is somehow similar to above method except we are not using recursion this method uses comparatively less memory and time.
C++
Java
Python3
C#
PHP
// C++ program to compute exponential value using (2^k)// -ary method.#include<bits/stdc++.h>using namespace std;  #define N 1000000007L; // prime modulo value  long exponentiation(long base, long exp){    long t = 1L;    while (exp > 0)     {          // for cases where exponent        // is not an even value        if (exp % 2 != 0)            t = (t * base) % N;          base = (base * base) % N;        exp /= 2;    }    return t % N;}  // Driver codeint main(){    long base = 5;    long exp = 100000;      long modulo = exponentiation(base, exp);    cout << (modulo);    return 0;}  // This code is contributed by Rajput-Ji
// Java program to compute exponential value using (2^k)// -ary method.import java.util.*;import java.lang.*;import java.io.*;  class exp_sq {    static long N = 1000000007L; // prime modulo value    public static void main(String[] args)    {        long base = 5;        long exp = 100000;          long modulo = exponentiation(base, exp);        System.out.println(modulo);    }      static long exponentiation(long base, long exp)    {        long t = 1L;        while (exp > 0) {              // for cases where exponent            // is not an even value            if (exp % 2 != 0)                t = (t * base) % N;              base = (base * base) % N;            exp /= 2;        }        return t % N;    }}
# Python3 program to compute # exponential value # using (2^k) -ary method.  # prime modulo valueN = 1000000007;   def exponentiation(bas, exp):    t = 1;    while(exp > 0):           # for cases where exponent        # is not an even value        if (exp % 2 != 0):            t = (t * bas) % N;          bas = (bas * bas) % N;        exp = int(exp / 2);    return t % N;  # Driver Code bas = 5;exp = 100000;  modulo = exponentiation(bas,exp);print(modulo);  # This code is contributed# by mits
// C# program to compute // exponential value // using (2^k) -ary method.using System;  class GFG{// prime modulo valuestatic long N = 1000000007L;   static long exponentiation(long bas,                            long exp){    long t = 1L;    while (exp > 0)     {          // for cases where exponent        // is not an even value        if (exp % 2 != 0)            t = (t * bas) % N;          bas = (bas * bas) % N;        exp /= 2;    }    return t % N;}  // Driver Code    public static void Main (){    long bas = 5;    long exp = 100000;      long modulo = exponentiation(bas,                                  exp);    Console.WriteLine(modulo);}}  //This code is contributed by ajit
<?php// PHP program to compute // exponential value // using (2^k) -ary method.  // prime modulo value$N = 1000000007;   function exponentiation($bas,                         $exp){    global $N;     $t = 1;    while ($exp > 0)     {          // for cases where exponent        // is not an even value        if ($exp % 2 != 0)            $t = ($t * $bas) % $N;          $bas = ($bas * $bas) % $N;        $exp = (int)$exp / 2;    }    return $t % $N;}  // Driver Code $bas = 5;$exp = 100000;  $modulo = exponentiation($bas,                          $exp);echo ($modulo);  // This code is contributed// by ajit?>
754573817

Applications:Besides fast calculation of  this method have several other advantages, like it is used in cryptography, in calculating Matrix Exponentiation et cetera.
nitin mittal
jit_t
Mithun Kumar
Rajput-Ji
Modular Arithmetic
Mathematical
Technical Scripter
Mathematical
Modular Arithmetic
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Merge two sorted arrays
Modulo Operator (%) in C/C++ with Examples
Print all possible combinations of r elements in a given array of size n
Operators in C / C++
The Knight's tour problem | Backtracking-1
Program for factorial of a number
Find minimum number of coins that make a given value
Program to find sum of elements in a given array
Program to print prime numbers from 1 to N.
Minimum number of jumps to reach end