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 }