【发布时间】:2015-07-30 21:18:07
【问题描述】:
为了解决 Euler 项目 (https://projecteuler.net/problem=3) 的第三个问题,我决定实现 Pollard 的 Rho 算法(至少是其中的一部分,我计划稍后包含循环)。奇怪的是,它适用于以下数字:82123(因子 = 41)和 16843009(因子 257)。但是,当我尝试项目 Euler 编号:600851475143 时,当最大素数为 6857 时,我最终得到 71。这是我的实现(对不起,代码墙和缺少类型转换):
#include <iostream>
#include <math.h>
#include <vector>
using namespace std;
long long int gcd(long long int a,long long int b);
long long int f(long long int x);
int main()
{
long long int i, x, y, N, factor, iterations = 0, counter = 0;
vector<long long int>factors;
factor = 1;
x = 631;
N = 600851475143;
factors.push_back(x);
while (factor == 1)
{
y = f(x);
y = y % N;
factors.push_back(y);
cout << "\niteration" << iterations << ":\t";
i = 0;
while (factor == 1 && (i < factors.size() - 1))
{
factor = gcd(abs(factors.back() - factors[i]), N);
cout << factor << " ";
i++;
}
x = y;
//factor = 2;
iterations++;
}
system("PAUSE");
return 0;
}
long long int gcd(long long int a, long long int b)
{
long long int remainder;
do
{
remainder = a % b;
a = b;
b = remainder;
} while (remainder != 0);
return a;
}
long long int f(long long int x)
{
//x = x*x * 1024 + 32767;
x = x*x + 1;
return x;
}
【问题讨论】:
-
那么 71 是一个因素,那么问题是什么? Pollards Rho 从未承诺给你最大的因素
标签: algorithm primes factorization