From efaabc3e2ffa68de98d48821d6d338500f2cd093 Mon Sep 17 00:00:00 2001 From: CarlosZoft <62192072+CarlosZoft@users.noreply.github.com> Date: Tue, 15 Feb 2022 14:27:02 -0300 Subject: [PATCH] feat : add modular_inverse_simple --- math/modular_inverse_simple.cpp | 69 +++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 math/modular_inverse_simple.cpp diff --git a/math/modular_inverse_simple.cpp b/math/modular_inverse_simple.cpp new file mode 100644 index 000000000..b0df7d02b --- /dev/null +++ b/math/modular_inverse_simple.cpp @@ -0,0 +1,69 @@ +/** + * @file + * @brief simple implementation of adaption modular multiplicative inverse + * algorithm + * + * @details + * this algorithm calculate the modular inverse iteratively + * + * @ref + * https://en.wikipedia.org/wiki/Modular_multiplicative_inverse + */ + +#include +#include + +// Macro +#define Key(A) (A) +#define module(A, B) (Key(A) % Key(B)) + +using namespace std; + +/** + * @brief Function imod + * Responsible for calculating the modular inverse from x % y + * @param x number + * @param y number + * @returns the modular inverse + */ +int imod(int x, int y) { + int aux, itr = 0; + + do { // run the algorithm while not find the inverse + aux = y * itr + 1; + itr++; + } while (module(aux, x)); // while module(aux, x) is different of zero + + return aux / x; +} + +/** + * @brief Some test cases + * @returns void + */ +static void test() { + cout << "First case testing... \n"; + // for a = 3 and b = 11 return 4 + cout << imod(3, 11) << endl; + assert(imod(3, 11) == 4); + cout << "\nPassed!\n"; + + cout << "Second case testing... \n"; + // for a = 3 and b = 26 return 9 + assert(imod(3, 26) == 9); + cout << "\nPassed!\n"; + + cout << "Third case testing... \n"; + // for a = 7 and b = 26 return 15 + assert(imod(7, 26) == 15); + cout << "\nPassed!\n"; + + cout << "\nAll test cases have successfully passed!\n"; +} +/** + * @brief Main function + * @returns 0 on exit + */ +int main() { + test(); // run tests implementations +};