1 //************************************************ 2 //pollard_rho 算法进行质因数分解 3 //************************************************ 4 5 LL factor[100];//质因数分解结果(刚返回时是无序的) 6 int tol;////质因数的个数。数组小标从0开始 7 8 LL gcd(LL a,LL b) 9 { 10 if(a==0) return 1;// !!!! 11 if(a<0) return gcd(-a,b); 12 while(b) 13 { 14 LL t=a%b; 15 a=b; 16 b=t; 17 } 18 return a; 19 } 20 21 LL Pollard_rho(LL x,LL c) 22 { 23 LL i=1,k=2; 24 LL x0=rand()%x; 25 LL y=x0; 26 while(1) 27 { 28 i++; 29 x0=(mult_mod(x0,x0,x)+c)%x; 30 LL d=gcd(y-x0,x); 31 if(d!=1 && d!=x) return d; 32 if(y==x0) return x; 33 if(i==k) {y=x0;k+=k;} 34 } 35 } 36 37 //对n进行素因子分解 38 39 void findfac(LL n) 40 { 41 if(Miller_Rabin(n)) 42 { 43 factor[tol++]=n; 44 return; 45 } 46 LL p=n; 47 while(p>=n) 48 p=Pollard_rho(p,rand()%(n-1)+1); 49 findfac(p); 50 findfac(n/p); 51 }