First commit

This commit is contained in:
2024-10-26 09:11:25 +03:00
commit d45769c4bc
9 changed files with 354 additions and 0 deletions

61
task4.cpp Normal file
View File

@@ -0,0 +1,61 @@
/*
* Задание 4
* Написать программу для проверки на простоту числа Мерсенна с
* использование теста Люка-Лемера. С клавиатуры вводится номер числа
* Мерсенна
*/
#include <iostream>
#include <cmath>
// Функция для проверки, является ли число простым
bool isPrime(int p) {
if (p <= 1) return false;
if (p <= 3) return true;
if (p % 2 == 0 || p % 3 == 0) return false;
for (int i = 5; i * i <= p; i += 6) {
if (p % i == 0 || p % (i + 2) == 0) return false;
}
return true;
}
// Тест Люка-Лемера для проверки простоты числа Мерсенна
bool lucasLehmerTest(int p) {
if (p == 2) return true; // M_2 = 3, простое число
// Вычисляем M_p = 2^p - 1
long long M_p = (1LL << p) - 1; // 1LL << p эквивалентно 2^p
// Начальное значение s
long long s = 4;
// Выполняем тест
for (int i = 3; i <= p; ++i) {
s = (s * s - 2) % M_p; // s = s^2 - 2
}
// Если s % M_p == 0, то M_p простое
return s == 0;
}
int main() {
int p;
std::cout << "Введите номер числа Мерсенна (простое число p): ";
std::cin >> p;
// Проверка, является ли p простым
if (!isPrime(p)) {
std::cout << p << " не является простым числом." << std::endl;
return 1;
}
// Проверка простоты числа Мерсенна
if (lucasLehmerTest(p)) {
std::cout << "Число Мерсенна M_" << p << " = 2^" << p << " - 1 является простым." << std::endl;
} else {
std::cout << "Число Мерсенна M_" << p << " = 2^" << p << " - 1 не является простым." << std::endl;
}
return 0;
}