【发布时间】:2011-08-27 18:42:45
【问题描述】:
#include <iostream>
#include <cstdlib>
typedef unsigned long long int ULL;
ULL gcd(ULL a, ULL b)
{
for(; b >0 ;)
{
ULL rem = a % b;
a = b;
b = rem;
}
return a;
}
void pollard_rho(ULL n)
{
ULL i = 0,y,k,d;
ULL *x = new ULL[2*n];
x[0] = rand() % n;
y = x[0];
k = 2;
while(1){
i = i+1;
std::cout << x[i-1];
x[i] = (x[i-1]*x[i-1]-1)%n;
d = gcd(abs(y - x[i]),n);
if(d!= 1 && d!=n)
std::cout <<d<<std::endl;
if(i+1==k){
y = x[i];
k = 2*k;
}
}
}
int main()
{
srand(time(NULL));
pollard_rho(10);
}
此实现源自 CLRS 第 2 版(第 894 页)。 while(1) 在我看来很可疑。 while 循环的终止条件应该是什么?
我尝试了k<=n,但这似乎不起作用。我得到分段错误。代码有什么缺陷,如何改正?
【问题讨论】:
-
您对
while循环的看法是正确的;没有终止,所以i变大并使用非法值索引到x,这会导致分段错误。 -
那么终止条件应该是什么?请查看 CLRS 中的 Pollard Rho 算法。
-
这是一个技巧问题吗?我们怎么知道它出了什么问题?
-
不,这不是一个技巧问题。我想知道如何更正代码。
标签: c++ algorithm factorization clrs