From 4b740d464c8e8898162181b615efe7884d1980be Mon Sep 17 00:00:00 2001 From: realstealthninja <68815218+realstealthninja@users.noreply.github.com> Date: Sat, 29 Apr 2023 01:26:52 +0530 Subject: [PATCH] fix: fit euler's totient to the contribution guidelines (#2447) * fix: fit euler's totient to the contribution guidelines. * Update math/eulers_totient_function.cpp Co-authored-by: David Leal * Update math/eulers_totient_function.cpp Co-authored-by: David Leal * fix: add more tests notes: i should have added euler's number first * fix: revert description * Update math/eulers_totient_function.cpp Co-authored-by: David Leal * Update math/eulers_totient_function.cpp Co-authored-by: David Leal * chore: apply suggestions from code review * chore: apply suggestions from code review --------- Co-authored-by: David Leal --- math/eulers_totient_function.cpp | 68 +++++++++++++++++++++----------- 1 file changed, 44 insertions(+), 24 deletions(-) diff --git a/math/eulers_totient_function.cpp b/math/eulers_totient_function.cpp index 8283ab045..f1752e9e9 100644 --- a/math/eulers_totient_function.cpp +++ b/math/eulers_totient_function.cpp @@ -1,9 +1,7 @@ /** * @file - * @brief C++ Program to find - * [Euler's Totient](https://en.wikipedia.org/wiki/Euler%27s_totient_function) - * function - * + * @brief Implementation of [Euler's Totient](https://en.wikipedia.org/wiki/Euler%27s_totient_function) + * @description * Euler Totient Function is also known as phi function. * \f[\phi(n) = * \phi\left({p_1}^{a_1}\right)\cdot\phi\left({p_2}^{a_2}\right)\ldots\f] where @@ -23,36 +21,58 @@ * * \f$\phi(1) = 1\f$ * * \f$\phi(17501) = 15120\f$ * * \f$\phi(1420) = 560\f$ + * @author [Mann Mehta](https://github.com/mann2108) */ -#include -#include -/** Function to caculate Euler's totient phi +#include /// for IO operations +#include /// for assert + +/** + * @brief Mathematical algorithms + * @namespace + */ +namespace math { +/** + * @brief Function to calculate Euler's Totient + * @param n the number to find the Euler's Totient of */ uint64_t phiFunction(uint64_t n) { uint64_t result = n; for (uint64_t i = 2; i * i <= n; i++) { - if (n % i == 0) { - while (n % i == 0) { - n /= i; - } - result -= result / i; - } + if (n % i != 0) continue; + while (n % i == 0) n /= i; + + result -= result / i; } - if (n > 1) - result -= result / n; + if (n > 1) result -= result / n; + return result; } +} // namespace math -/// Main function +/** + * @brief Self-test implementations + * @returns void + */ +static void test() { + assert(math::phiFunction(1) == 1); + assert(math::phiFunction(2) == 1); + assert(math::phiFunction(10) == 4); + assert(math::phiFunction(123456) == 41088); + assert(math::phiFunction(808017424794) == 263582333856); + assert(math::phiFunction(3141592) == 1570792); + assert(math::phiFunction(27182818) == 12545904); + + std::cout << "All tests have successfully passed!\n"; +} + +/** + * @brief Main function + * @param argc commandline argument count (ignored) + * @param argv commandline array of arguments (ignored) + * @returns 0 on exit + */ int main(int argc, char *argv[]) { - uint64_t n; - if (argc < 2) { - std::cout << "Enter the number: "; - } else { - n = strtoull(argv[1], nullptr, 10); - } - std::cin >> n; - std::cout << phiFunction(n); + test(); return 0; }