add is_prime

This commit is contained in:
2025-03-13 09:34:53 +03:00
parent 55881d4062
commit 9457d21c1e
3 changed files with 31 additions and 5 deletions

View File

@@ -1,9 +1,9 @@
Рабочий проект по изучению и анализу всяких там умных и не очень алгоритмов.
Рабочий проект по изучению и анализу разнообразных алгоритмов.
Итого:
1. Сортировка вставками
2. Нахождение наибольшего общего делителя
1. Сортировка вставками.
2. Нахождение наибольшего общего делителя.
3. Нахождение все простых множителей заданного числа. (в работе)
4. Сортировка слиянием. (в работе)
5. Возведение в степень. (в работе)
5. Возведение в степень.

View File

@@ -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<int> v { 5, 4, 1, 5, 6 };

21
src/numbers/is_prime.hpp Normal file
View File

@@ -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;
}
}