Files
ARPZ-s1-pr2/task4.cpp
2024-10-26 09:11:25 +03:00

62 lines
2.0 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(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;
}