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";