diff --git a/math/check_prime.cpp b/math/check_prime.cpp index a7b313551..a05bd8517 100644 --- a/math/check_prime.cpp +++ b/math/check_prime.cpp @@ -1,62 +1,83 @@ /** - * Copyright 2020 @author omkarlanghe - * * @file - * A simple program to check if the given number if prime or not. - * * @brief - * Reduced all possibilities of a number which cannot be prime. - * Eg: No even number, except 2 can be a prime number, hence we will increment - * our loop with i+6 jumping and check for i or i+2 to be a factor of the - * number; if it's a factor then we will return false otherwise true after the - * loop terminates at the terminating condition which is (i*i<=num) + * A simple program to check if the given number is [Prime](https://en.wikipedia.org/wiki/Primality_test) or not. + * @details + * A prime number is any number that can be divided only by itself and 1. It must + * be positive and a whole number, therefore any prime number is part of the + * set of natural numbers. The majority of prime numbers are even numbers, with + * the exception of 2. This algorithm finds prime numbers using this information. + * additional ways to solve the prime check problem: + * https://cp-algorithms.com/algebra/primality_tests.html#practice-problems + * @author [Omkar Langhe](https://github.com/omkarlanghe) + * @author [ewd00010](https://github.com/ewd00010) */ #include /// for assert #include /// for IO operations /** - * Function to check if the given number is prime or not. - * @param num number to be checked. - * @return if number is prime, it returns @ true, else it returns @ false. + * @brief Mathematical algorithms + * @namespace */ -template -bool is_prime(T num) { - bool result = true; - if (num <= 1) { - return false; - } else if (num == 2 || num == 3) { - return true; - } else if ((num % 2) == 0 || num % 3 == 0) { - return false; - } else { - for (T i = 5; (i * i) <= (num); i = (i + 6)) { - if ((num % i) == 0 || (num % (i + 2) == 0)) { - result = false; - break; +namespace math { + /** + * @brief Function to check if the given number is prime or not. + * @param num number to be checked. + * @return true if number is a prime + * @return false if number is not a prime. + */ + bool is_prime(int64_t num) { + /*! + * Reduce all possibilities of a number which cannot be prime with the first + * 3 if, else if conditionals. Example: Since no even number, except 2 can + * be a prime number and the next prime we find after our checks is 5, + * we will start the for loop with i = 5. then for each loop we increment + * i by +6 and check if i or i+2 is a factor of the number; if it's a factor + * then we will return false. otherwise, true will be returned after the + * loop terminates at the terminating condition which is i*i <= num + */ + if (num <= 1) { + return false; + } else if (num == 2 || num == 3) { + return true; + } else if (num % 2 == 0 || num % 3 == 0) { + return false; + } else { + for (int64_t i = 5; i * i <= num; i = i + 6) { + if (num % i == 0 || num % (i + 2) == 0) { + return false; + } } } + return true; } - return (result); +} // namespace math + +/** + * @brief Self-test implementations + * @returns void + */ +static void tests() { + assert(math::is_prime(1) == false); + assert(math::is_prime(2) == true); + assert(math::is_prime(3) == true); + assert(math::is_prime(4) == false); + assert(math::is_prime(-4) == false); + assert(math::is_prime(7) == true); + assert(math::is_prime(-7) == false); + assert(math::is_prime(19) == true); + assert(math::is_prime(50) == false); + assert(math::is_prime(115249) == true); + + std::cout << "All tests have successfully passed!" << std::endl; } /** - * Main function + * @brief Main function + * @returns 0 on exit */ int main() { - // perform self-test - assert(is_prime(50) == false); - assert(is_prime(115249) == true); - - int num = 0; - std::cout << "Enter the number to check if it is prime or not" << std::endl; - std::cin >> num; - bool result = is_prime(num); - if (result) { - std::cout << num << " is a prime number" << std::endl; - } else { - std::cout << num << " is not a prime number" << std::endl; - } - + tests(); // perform self-tests implementations return 0; }