diff --git a/README.md b/README.md index 37ae518..e5c7dd6 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ -Рабочий проект по изучению и анализу всяких там умных и не очень алгоритмов. +Рабочий проект по изучению и анализу разнообразных алгоритмов. Итого: -1. Сортировка вставками -2. Нахождение наибольшего общего делителя +1. Сортировка вставками. +2. Нахождение наибольшего общего делителя. 3. Нахождение все простых множителей заданного числа. (в работе) 4. Сортировка слиянием. (в работе) -5. Возведение в степень. (в работе) +5. Возведение в степень. diff --git a/bin/main.cpp b/bin/main.cpp index cad6531..9dd6f7c 100644 --- a/bin/main.cpp +++ b/bin/main.cpp @@ -7,13 +7,18 @@ #include "numbers/gcd.hpp" #include "numbers/prime_factors.hpp" #include "numbers/pow.hpp" +#include "numbers/is_prime.hpp" auto main() -> int { { - hack::log()(alg::pow(3.0, 2), alg::pow(3.0, 3)); + hack::log()(alg::is_prime(2)); return 1; } + + { + hack::log()(alg::pow(3.0, 2), alg::pow(3.0, 3)); + } { std::vector v { 5, 4, 1, 5, 6 }; diff --git a/src/numbers/is_prime.hpp b/src/numbers/is_prime.hpp new file mode 100644 index 0000000..677bfb8 --- /dev/null +++ b/src/numbers/is_prime.hpp @@ -0,0 +1,21 @@ +#pragma once + +#include "gcd.hpp" +#include "pow.hpp" + +// Малая теорема Ферма: Если p - число простое и a - целое число, не делящееся на p, то при +// возведении a в степень p - 1, наибольший общий делитель между результатом и p будет равен 1 +// Но там есть ньюансы, называются обманщиками Ферма. По этому тесты нужно проводить на нескольких числах a. +// По этому если тестов много (у нас по уолчанию 1000) то вероятность того что появятся обманщики Ферам 1/2^1000 +// Проверяет число на простоту +namespace alg +{ + inline bool is_prime(int a, int max_test = 1000) + { + // начинаем с 4 т.к. 2 и 3 простые числа + for (int i = 4; i < max_test; ++i) + if (gcd(pow(i, a - 1), a) == 1) return true; + return false; + } +} +