From 87d14dce6fdab14ca4db15c510386f7a446c7dbb Mon Sep 17 00:00:00 2001 From: Shri Prakash Bajpai <68155959+Shri2206@users.noreply.github.com> Date: Wed, 28 Oct 2020 19:38:10 +0530 Subject: [PATCH] Update modular_exponentiation.cpp --- math/modular_exponentiation.cpp | 112 ++++++++++++++++++-------------- 1 file changed, 64 insertions(+), 48 deletions(-) diff --git a/math/modular_exponentiation.cpp b/math/modular_exponentiation.cpp index 9c8dcf4cd..b85a9c874 100644 --- a/math/modular_exponentiation.cpp +++ b/math/modular_exponentiation.cpp @@ -1,7 +1,7 @@ /** * @file * @brief C++ Program for Modular Exponentiation Iteratively. - * Calculate the value of an integer a raised to an integer exponent b + * @details The task is to calculate the value of an integer a raised to an integer exponent b * under modulo c. * @note The time complexity of this approach is O(log b). * @@ -13,67 +13,83 @@ * 4 * 1 * 4 * We can also verify the result as 4^3 is 64 and 64 modulo 5 is 4 - */ - + * + * @author [Shri2206](https://github.com/Shri2206) +*/ #include /// for io operations +#include /// for assert /** * @namespace math * @brief Mathematical algorithms */ namespace math { -/** -* @brief This function calculates a raised to exponent b -* under modulo c using modular exponentiation -* @param a integer base -* @param b unsigned integer exponent -* @param c integer modulo -* @return a raised to power b modulo c -*/ -uint64_t power(uint64_t a, uint64_t b, uint64_t c) -{ - uint64_t ans = 1; /// Initialize the answer to be returned - - a = a % c; /// Update a if it is more than or - /// equal to c - - if (a == 0) - { - return 0; /// In case a is divisible by c; - } - - while (b > 0) + + /** + * @brief This function calculates a raised to exponent b under modulo c using modular exponentiation. + * @param a integer base + * @param b unsigned integer exponent + * @param c integer modulo + * @return a raised to power b modulo c + */ + uint64_t power(uint64_t a, uint64_t b, uint64_t c) { - /// If b is odd, multiply a with answer - if (b & 1) + uint64_t ans = 1; /// Initialize the answer to be returned + a = a % c; /// Update a if it is more than or equal to c + if (a == 0) { - ans = (ans*a) % c; + return 0; /// In case a is divisible by c; } - - /// b must be even now - b = b>>1; // b = b/2 - a = (a*a) % c; + while (b > 0) + { + /// If b is odd, multiply a with answer + if (b & 1) + { + ans = (ans*a) % c; + } + /// b must be even now + b = b>>1; /// b = b/2 + a = (a*a) % c; + } + return ans; } - return ans; -} } // namespace math /** -* @brief Main function -* @returns 0 on exit + * Function for testing power function. + * test cases and assert statement. + * @returns `void` */ -int main() -{ - /// Give two numbers num1, num2 and modulo m - uint64_t num1 = 2; - uint64_t num2 = 5; - uint64_t m = 13; - - std::cout << "The value of "<