【发布时间】:2019-04-21 04:03:02
【问题描述】:
我实现了wikipedia 上给出的 Pollard Rho 算法
x ← 2; y ← 2; d ← 1 while d = 1: x ← g(x) y ← g(g(y)) d ← gcd(|x - y|, n) if d = n: return failure else: return d
大输入给出错误:
GNU MP:无法分配内存(大小=4294950944)
这是我的实现
mpz_class factor(mpz_class num)
{
mpz_class x(2), y(2), d(1);
while(d == 1)
{
x = polynomial(x);
y = polynomial(polynomial(y));
mpz_class diff = x - y;
if(diff < 0)
{
diff *= -1;
}
mpz_gcd(d.get_mpz_t(), diff.get_mpz_t(), num.get_mpz_t());
}
if(d == num)
{
return -1;//failure
}
else
{
return d;//found factor
}
}
mpz_class polynomial (mpz_class x)
{
return ((x * x) + 1);
}
它适用于像 121 这样的输入,但在 5540987 上崩溃。我做错了什么吗?有没有办法可以改善这种情况,以便将这些数字考虑在内?我见过some implementations 似乎使用多项式((x*x)%N+c)%N(注意额外的mod n)。这是否可行,因为可以使用任何多项式?
【问题讨论】: