Task 3 updated

This commit is contained in:
2024-11-02 09:10:51 +03:00
parent 1ec171ab0c
commit 823f84cf63
2 changed files with 46 additions and 83 deletions

View File

@@ -79,47 +79,36 @@ std::map<int, int> factorize(int number) {
Написать программу для факторизации заданного с клавиатуры нечетного числа методом Ферма (указать простые множители и их кратность). Для анализа числа на простоту использовать решето Эратосфена Написать программу для факторизации заданного с клавиатуры нечетного числа методом Ферма (указать простые множители и их кратность). Для анализа числа на простоту использовать решето Эратосфена
```cpp ```cpp
#include <vector> #include <iostream>
#include <map>
#include <cmath> #include <cmath>
#include "sieveoferatosthenes.cpp" bool isPerfectSquare(int num) {
int s = static_cast<int>(sqrt(num));
return (s * s == num);
}
std::map<int, int> fermatFactorize(int n) { int main() {
std::map<int, int> factors; long long n;
std::cout << "Введите n (произведение двух простых чисел p и q): ";
std::cin >> n;
// Проверка на простоту long long m = static_cast<long long>(sqrt(n));
std::vector<int> primes = sieveOfEratosthenes(n); long long x = 1;
for (int prime : primes) {
if (prime == 1) continue; while (true) {
if (prime * prime > n) break; long long q = (m + x) * (m + x) - n;
while (n % prime == 0) { if (isPerfectSquare(q)) {
factors[prime]++; long long k = static_cast<long long>(sqrt(q));
n /= prime; 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, применяем метод Ферма return 0;
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;
} }
``` ```

View File

@@ -6,60 +6,34 @@
*/ */
#include <iostream> #include <iostream>
#include <vector>
#include <map>
#include <cmath> #include <cmath>
#include "sieveoferatosthenes.cpp" bool isPerfectSquare(int num) {
int s = static_cast<int>(sqrt(num));
std::map<int, int> fermatFactorize(int n) { return (s * s == num);
std::map<int, int> factors;
// Проверка на простоту
std::vector<int> 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;
} }
int main() int main() {
{ long long n;
int n; std::cout << "Введите n (произведение двух простых чисел p и q): ";
std::cin >> n; std::cin >> n;
auto factors = fermatFactorize(n); long long m = static_cast<long long>(sqrt(n));
long long x = 1;
for (const auto& factor : factors) { while (true) {
std::cout << factor.first << " : " << factor.second << "\n"; long long q = (m + x) * (m + x) - n;
} if (isPerfectSquare(q)) {
long long k = static_cast<long long>(sqrt(q));
long long p = m + x - k;
long long q_value = m + x + k;
return 0; std::cout << "Найдены p и q: p = " << p << ", q = " << q_value << std::endl;
break;
}
x++;
}
return 0;
} }