diff --git a/README.md b/README.md index d49cbf4..6f25347 100644 --- a/README.md +++ b/README.md @@ -79,47 +79,36 @@ std::map factorize(int number) { Написать программу для факторизации заданного с клавиатуры нечетного числа методом Ферма (указать простые множители и их кратность). Для анализа числа на простоту использовать решето Эратосфена ```cpp -#include -#include +#include #include -#include "sieveoferatosthenes.cpp" +bool isPerfectSquare(int num) { + int s = static_cast(sqrt(num)); + return (s * s == num); +} -std::map fermatFactorize(int n) { - std::map factors; +int main() { + long long n; + std::cout << "Введите n (произведение двух простых чисел p и q): "; + std::cin >> n; - // Проверка на простоту - std::vector primes = sieveOfEratosthenes(n); - for (int prime : primes) { - if (prime == 1) continue; - if (prime * prime > n) break; - while (n % prime == 0) { - factors[prime]++; - n /= prime; + long long m = static_cast(sqrt(n)); + long long x = 1; + + while (true) { + long long q = (m + x) * (m + x) - n; + if (isPerfectSquare(q)) { + long long k = static_cast(sqrt(q)); + long long p = m + x - k; + long long q_value = m + x + k; + + std::cout << "Найдены p и q: p = " << p << ", q = " << q_value << std::endl; + break; } + x++; } - // Если число больше 1, применяем метод Ферма - if (n > 1) { - int m = (int)(ceil(sqrt(n))); - int b2 = m * m - n; - int b = (int)(sqrt(b2)); - - while (b * b != b2) { - m++; - b2 = m * m - n; - b = (int)(sqrt(b2)); - } - - int factor1 = m - b; - int factor2 = m + b; - - // Добавляем найденные множители - factors[factor1]++; - factors[factor2]++; - } - - return factors; + return 0; } ``` diff --git a/task3.cpp b/task3.cpp index eb43127..9168e59 100644 --- a/task3.cpp +++ b/task3.cpp @@ -6,60 +6,34 @@ */ #include -#include -#include #include -#include "sieveoferatosthenes.cpp" - -std::map fermatFactorize(int n) { - std::map factors; - - // Проверка на простоту - std::vector primes = sieveOfEratosthenes(n); - for (int prime : primes) { - if (prime == 1) continue; - if (prime * prime > n) break; - while (n % prime == 0) { - factors[prime]++; - n /= prime; - } - } - - // Если число больше 1, применяем метод Ферма - if (n > 1) { - int m = (int)(ceil(sqrt(n))); - int b2 = m * m - n; - int b = (int)(sqrt(b2)); - - while (b * b != b2) { - m++; - b2 = m * m - n; - b = (int)(sqrt(b2)); - } - - int factor1 = m - b; - int factor2 = m + b; - - // Добавляем найденные множители - factors[factor1]++; - factors[factor2]++; - } - - return factors; +bool isPerfectSquare(int num) { + int s = static_cast(sqrt(num)); + return (s * s == num); } -int main() -{ - int n; - std::cin >> n; - - auto factors = fermatFactorize(n); +int main() { + long long n; + std::cout << "Введите n (произведение двух простых чисел p и q): "; + std::cin >> n; - for (const auto& factor : factors) { - std::cout << factor.first << " : " << factor.second << "\n"; - } + long long m = static_cast(sqrt(n)); + long long x = 1; - return 0; + while (true) { + long long q = (m + x) * (m + x) - n; + if (isPerfectSquare(q)) { + long long k = static_cast(sqrt(q)); + long long p = m + x - k; + long long q_value = m + x + k; + + std::cout << "Найдены p и q: p = " << p << ", q = " << q_value << std::endl; + break; + } + x++; + } + + return 0; }