Task 3 updated
This commit is contained in:
57
README.md
57
README.md
@@ -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;
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
64
task3.cpp
64
task3.cpp
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user