#define C 240
#define TIME 6
typedef __int64 LL;
__int64 fac[65]; //存n的质因子
int prime[65],x[65],m,cnt;
__int64 gcd(__int64 a,__int64 b)
{
if(b==0)
return a;
return gcd(b,a%b);
}
__int64 mod_mult(__int64 a,__int64 b,__int64 n)
{
__int64 s=0;
a=a%n;
while(b)
{
if (b&1)
{
s+=a;
if(s>=n)
s-=n;
}
a=a<<1;
if(a>=n)
a-=n;
b=b>>1;
}
return s;
}
__int64 mod_exp(__int64 a, __int64 b,__int64 n)
{
__int64 d=1;
a=a%n;
while (b>=1)
{
if (b&1)
d=mod_mult(d,a,n);
a=mod_mult(a,a,n);
b=b>> 1;
}
return d;
}
bool Wintess(__int64 a,__int64 n)
{
__int64 m,x,y;
int i,j=0;
m=n-1;
while(m%2==0)
{
m=m>>1;
j++;
}
x=mod_exp(a, m, n);
for(i=1;i<=j;i++)
{
y=mod_exp(x,2,n);
if((y==1)&&(x!=1)&&(x!=n-1))
return true;
x=y;
}
if (y!=1)
return true;
return false;
}
bool miller_rabin(int times,__int64 n)
{
__int64 a;
int i;
if (n==1)
return false;
if (n==2)
return true;
if (n%2==0)
return false;
srand(time(NULL));
for (i =1;i<=times;i++)
{
a=rand()%(n-1)+1;
if(Wintess(a,n))
return false;
}
return true;
}
__int64 Pollard(__int64 n,int c)
{
__int64 i,k,x,y,d;
srand(time(NULL));
i=1;
k=2;
x=rand()%n;
y=x;
while(true)
{
i++;
x=(mod_mult(x,x,n)+c)%n;
d=gcd(y-x,n);
if (d>1&&d<n)
return d;
if (y==x)
return n;
if (i==k)
{
y=x;
k=k<<1;
}
}
}
void get_prime(__int64 n,int c)
{//二分找出所有素因子
__int64 m;
if(n==1)
return;
if(miller_rabin(TIME,n))
{
fac[cnt++]=n;
return;
}
m=n;
while(m>=n)
m=Pollard(m,c--);
get_prime(m,c);
get_prime(n/m,c);
}
//get_prime(n,C);
//miller_rabin(TIME,n);
miller_rabin和pollard模板 #by nobody
最新推荐文章于 2020-02-22 17:57:50 发布