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
|
```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;
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
64
task3.cpp
64
task3.cpp
@@ -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, применяем метод Ферма
|
|
||||||
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;
|
||||||
|
|
||||||
|
std::cout << "Найдены p и q: p = " << p << ", q = " << q_value << std::endl;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
x++;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user