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));
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, применяем метод Ферма int main() {
if (n > 1) { long long n;
int m = (int)(ceil(sqrt(n))); std::cout << "Введите n (произведение двух простых чисел p и q): ";
int b2 = m * m - n; std::cin >> n;
int b = (int)(sqrt(b2));
while (b * b != b2) { long long m = static_cast<long long>(sqrt(n));
m++; long long x = 1;
b2 = m * m - n;
b = (int)(sqrt(b2)); while (true) {
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;
std::cout << "Найдены p и q: p = " << p << ", q = " << q_value << std::endl;
break;
}
x++;
} }
int factor1 = m - b; return 0;
int factor2 = m + b;
// Добавляем найденные множители
factors[factor1]++;
factors[factor2]++;
}
return factors;
} }
``` ```

View File

@@ -6,58 +6,32 @@
*/ */
#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, применяем метод Ферма int main() {
if (n > 1) { long long n;
int m = (int)(ceil(sqrt(n))); std::cout << "Введите n (произведение двух простых чисел p и q): ";
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 n;
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;
std::cout << "Найдены p и q: p = " << p << ", q = " << q_value << std::endl;
break;
}
x++;
} }
return 0; return 0;