mirror of
https://hub.njuu.cf/TheAlgorithms/C-Plus-Plus.git
synced 2023-10-11 13:05:55 +08:00
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:
parent
2a076c1b03
commit
274cab6914
@ -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)
|
||||
|
60
math/modular_inverse_simple.cpp
Normal file
60
math/modular_inverse_simple.cpp
Normal 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
|
||||
};
|
Loading…
Reference in New Issue
Block a user