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
#include <vector>
#include <map>
#include <iostream>
#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) {
std::map<int, int> factors;
int main() {
long long n;
std::cout << "Введите n (произведение двух простых чисел p и q): ";
std::cin >> n;
// Проверка на простоту
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;
long long m = static_cast<long long>(sqrt(n));
long long x = 1;
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++;
}
// Если число больше 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;
}
```

View File

@@ -6,58 +6,32 @@
*/
#include <iostream>
#include <vector>
#include <map>
#include <cmath>
#include "sieveoferatosthenes.cpp"
std::map<int, int> fermatFactorize(int n) {
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;
bool isPerfectSquare(int num) {
int s = static_cast<int>(sqrt(num));
return (s * s == num);
}
int main()
{
int n;
int main() {
long long n;
std::cout << "Введите n (произведение двух простых чисел p и q): ";
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) {
std::cout << factor.first << " : " << factor.second << "\n";
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++;
}
return 0;