feat: add modular_inverse_simple (#1937)

* fix: power_of_two algorithm redundant conditional 'else'

* feat : add modular_inverse_simple

* updating DIRECTORY.md

* fix : according lint rules

* fix : removed macro and initialize variable aux

* fix: remove namespace std like default

* feat : add unsigned type for block negative number and improving description

* fix: defined in header <cstdint> for use uint64_t type

* fix: improving descriptive comments

* fix: remove redundant lib

* fix: improvinf "brief" and "details" acording suggestion in review

* fix: improving descrition of function imod acording suggestion in review

* fix: improving descrition acording suggestion in review

* Update modular_inverse_simple.cpp

* Apply suggestions from code review

* clang-format and clang-tidy fixes for 768a99c8

* Apply suggestions from code review

* Apply suggestions from code review

* updating DIRECTORY.md

Co-authored-by: John Law <johnlaw.po@gmail.com>
Co-authored-by: David Leal <halfpacho@gmail.com>
This commit is contained in:
Carlos Rafael 2022-06-09 12:27:12 -03:00 committed by GitHub
parent 2a076c1b03
commit 274cab6914
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 62 additions and 3 deletions

View File

@ -158,9 +158,6 @@
* [Quadratic Probing Hash Table](https://github.com/TheAlgorithms/C-Plus-Plus/blob/master/hashing/quadratic_probing_hash_table.cpp)
* [Sha1](https://github.com/TheAlgorithms/C-Plus-Plus/blob/master/hashing/sha1.cpp)
## Linear Algebra
* [Gram Schmidt](https://github.com/TheAlgorithms/C-Plus-Plus/blob/master/linear_algebra/gram_schmidt.cpp)
## Machine Learning
* [A Star Search](https://github.com/TheAlgorithms/C-Plus-Plus/blob/master/machine_learning/a_star_search.cpp)
* [Adaline Learning](https://github.com/TheAlgorithms/C-Plus-Plus/blob/master/machine_learning/adaline_learning.cpp)
@ -208,6 +205,7 @@
* [Modular Division](https://github.com/TheAlgorithms/C-Plus-Plus/blob/master/math/modular_division.cpp)
* [Modular Exponentiation](https://github.com/TheAlgorithms/C-Plus-Plus/blob/master/math/modular_exponentiation.cpp)
* [Modular Inverse Fermat Little Theorem](https://github.com/TheAlgorithms/C-Plus-Plus/blob/master/math/modular_inverse_fermat_little_theorem.cpp)
* [Modular Inverse Simple](https://github.com/TheAlgorithms/C-Plus-Plus/blob/master/math/modular_inverse_simple.cpp)
* [N Bonacci](https://github.com/TheAlgorithms/C-Plus-Plus/blob/master/math/n_bonacci.cpp)
* [N Choose R](https://github.com/TheAlgorithms/C-Plus-Plus/blob/master/math/n_choose_r.cpp)
* [Ncr Modulo P](https://github.com/TheAlgorithms/C-Plus-Plus/blob/master/math/ncr_modulo_p.cpp)
@ -237,6 +235,7 @@
* [Fast Fourier Transform](https://github.com/TheAlgorithms/C-Plus-Plus/blob/master/numerical_methods/fast_fourier_transform.cpp)
* [Gaussian Elimination](https://github.com/TheAlgorithms/C-Plus-Plus/blob/master/numerical_methods/gaussian_elimination.cpp)
* [Golden Search Extrema](https://github.com/TheAlgorithms/C-Plus-Plus/blob/master/numerical_methods/golden_search_extrema.cpp)
* [Gram Schmidt](https://github.com/TheAlgorithms/C-Plus-Plus/blob/master/numerical_methods/gram_schmidt.cpp)
* [Inverse Fast Fourier Transform](https://github.com/TheAlgorithms/C-Plus-Plus/blob/master/numerical_methods/inverse_fast_fourier_transform.cpp)
* [Lu Decompose](https://github.com/TheAlgorithms/C-Plus-Plus/blob/master/numerical_methods/lu_decompose.cpp)
* [Lu Decomposition](https://github.com/TheAlgorithms/C-Plus-Plus/blob/master/numerical_methods/lu_decomposition.h)

View File

@ -0,0 +1,60 @@
/**
* @file
* @brief Simple implementation of [modular multiplicative
* inverse](https://en.wikipedia.org/wiki/Modular_multiplicative_inverse)
*
* @details
* this algorithm calculates the modular inverse x^{-1} \mod y iteratively
*/
#include <cassert> /// for assert
#include <iostream> /// for IO operations
/**
* @brief Function imod
* Calculates the modular inverse of x with respect to y, x^{-1} \mod y
* @param x number
* @param y number
* @returns the modular inverse
*/
uint64_t imod(uint64_t x, uint64_t y) {
uint64_t aux = 0; // auxiliary variable
uint64_t itr = 0; // iteration counter
do { // run the algorithm while not find the inverse
aux = y * itr + 1;
itr++;
} while (aux % x); // while module aux % x non-zero
return aux / x;
}
/**
* @brief self-test implementations
* @returns void
*/
static void test() {
std::cout << "First case testing... \n";
// for a = 3 and b = 11 return 4
assert(imod(3, 11) == 4);
std::cout << "\nPassed!\n";
std::cout << "Second case testing... \n";
// for a = 3 and b = 26 return 9
assert(imod(3, 26) == 9);
std::cout << "\nPassed!\n";
std::cout << "Third case testing... \n";
// for a = 7 and b = 26 return 15
assert(imod(7, 26) == 15);
std::cout << "\nPassed!\n";
std::cout << "\nAll test cases have successfully passed!\n";
}
/**
* @brief Main function
* @returns 0 on exit
*/
int main() {
test(); // run self-test implementations
};