/* * Задание 4 * Написать программу для проверки на простоту числа Мерсенна с * использование теста Люка-Лемера. С клавиатуры вводится номер числа * Мерсенна */ #include #include // Функция для проверки, является ли число простым 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; }