C++ 什么';这个Pollard Rho实现有什么问题 #包括 #包括 typedef无符号长整型; ULL gcd(ULL a、ULL b) { 对于(;b>0;) { ULL-rem=a%b; a=b; b=雷姆; } 返回a; } 无效波拉德罗(乌尔n) { ULL i=0,y,k,d; ULL*x=新的ULL[2*n]; x[0]=rand()%n; y=x[0]; k=2; 而(1){ i=i+1; std::cout

C++ 什么';这个Pollard Rho实现有什么问题 #包括 #包括 typedef无符号长整型; ULL gcd(ULL a、ULL b) { 对于(;b>0;) { ULL-rem=a%b; a=b; b=雷姆; } 返回a; } 无效波拉德罗(乌尔n) { ULL i=0,y,k,d; ULL*x=新的ULL[2*n]; x[0]=rand()%n; y=x[0]; k=2; 而(1){ i=i+1; std::cout,c++,algorithm,factorization,clrs,C++,Algorithm,Factorization,Clrs,尝试用以下内容替换(1){i=i+1;: #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(U

尝试用以下内容替换
(1){i=i+1;

#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);

}
for(i=1;i<2*n;++i){

为什么要存储所有这些中间值?你真的不需要把x和y放在一个数组中。只需使用两个不断重复使用的变量,
x
y

另外,将
while(1)
替换为
while(d==1)
并在之前切断循环

for (i = 1; i < 2*n; ++i) {
如果(d!=1&&d!=n)

std::cout我只有第一版CLRS,但假设它与第二版没有太大区别,终止条件的答案在下一页:

这个寻找因子的过程一开始似乎有些神秘。然而,请注意,POLLARD-RHO从不打印错误的答案;它打印的任何数字都是n的一个重要除数。不过,POLLARD-RHO可能根本不会打印任何东西;无法保证它会产生任何结果。然而,我们将看到,这是一个好的结果n期望POLLARD-RHO在while循环的大约sqrt(p)迭代后打印n的p因子。因此,如果n是复合的,我们可以期望此过程在大约n1/4更新后发现足够的因子来完全计算n因子,因为n的每个素因子p(可能最大的因子除外)都小于sqrt(n)


因此,从技术上讲,CLRS中的表示没有终止条件(这可能就是为什么他们称之为“启发式”和“过程”,而不是“算法”)而且也不能保证它确实会产生任何有用的东西。实际上,您可能希望根据预期的n1/4更新设置一些迭代边界。

关于
while
循环,您是对的;没有终止,因此
i
变大,并使用非法值索引到
x
,从而导致这是分段错误。那么终止条件应该是什么呢?请查看CLRS中的Pollard Rho算法。这是一个技巧性问题吗?我们如何知道它出了什么问题?不,这不是一个技巧性问题。我想知道如何更正代码。嗯。
while
d!=1
时终止,
d!=1
if
语句中是否冗余?
 if(d!= 1 && d!=n)
      std::cout <<d<<std::endl;
   if(i+1==k){
     y = x[i];
     k = 2*k;
while(d == 1)
{
    x = (x*x - 1) % n;
    y = (y*y - 1) % n;
    y = (y*y - 1) % n;
    d = abs(gcd(y-x,n))%n;
}
if(d!=n)
  std::cout <<d<<std::endl;
else
  std::cout<<"Can't find result with this function \n";