Files
ARPZ-s1-pr2/task4.cpp

65 lines
2.2 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* Задание 4
* Написать программу для проверки на простоту числа Мерсенна с
* использование теста Люка-Лемера. С клавиатуры вводится номер числа
* Мерсенна
*/
#include <iostream>
#include <cmath>
// Функция для проверки, является ли число простым
bool isPrime(long long p) {
if (p <= 1) return false;
if (p <= 3) return true;
if (p % 2 == 0 || p % 3 == 0) return false;
for (long long i = 5; i * i <= p; i += 6) {
if (p % i == 0 || p % (i + 2) == 0) return false;
}
return true;
}
// Тест Люка-Лемера для проверки простоты числа Мерсенна
bool lucasLehmerTest(long long 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 (long long 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() {
long long p;
std::cout << "Введите номер числа Мерсенна (простое число p): ";
std::cin >> p;
p = static_cast<long long>(pow(2, p) - 1);
std::cout << "Число Мерсенна M_" << p << " = 2^" << p << " - 1 = " << p << std::endl;
// Проверка, является ли 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;
}