Pollard's rho的核心思想其实就是求p和q的倍数,而这样的倍数有无穷多个,当N值很小的时候,成功率还是很高的,当N值很大时,该算法就不灵了。
#include <stdio.h>
#include <stdlib.h>
int gcd(int x,int y){
int z;
while(y){z=x,x=y,y=z%y;}
return x;
}
int f(int x,int c,int n)
{
return (x*x+c)%n;
}
int Pollard_Rho(int N)
{
//int c=rand()%(N-1)+1;
int c = 1;
int t=f(0,c,N);
int r=f(f(0,c,N),c,N);//两倍速跑
while( t!=r )
{
int d=gcd(abs(t-r),N);
if(d>1){
printf("d = %lld\n",d);
return d;
}
t=f(t,c,N);
r=f(f(r,c,N),c,N);
}
return N;
}
int main() {
int n = 70191551;
Pollard_Rho(n);
return 0;
}