pollard-rho 5pts全T求调
查看原帖
pollard-rho 5pts全T求调
475112
MarSer020楼主2023/12/3 17:58

rt,代码:

#include<bits/stdc++.h>
#define int __int128_t
using namespace std;
const int pri[]={0,2,3,5,7,11,13,17,19,23,29,31,37},prsiz=12;
uint64_t n,t,ans,seed=19260817,sd;
int gen(){
	seed^=seed<<13,seed^=seed>>17,seed^=seed<<5;
	return seed;
}
int qpow(int x,int y,int mod){
	int ret=1;
	x%=mod;
	while(y){
		if(y&1)
			ret=ret*x%mod;
		x=x*x%mod,y>>=1;
	}
	return ret;
}
bool check(int x,int p){
	int d=p-1,val=qpow(x,d,p);
	if(val!=1)
		return 1;
	while(!(d&1)){
		d>>=1,val=qpow(x,d,p);
		if(val==p-1)
			return 0;
		else if(val!=1)
			return 1;
	}
	return 0;
}
bool miller_rabin(int p){
	if(p>40){
		for(int i=1;i<=prsiz;i++)
			if(check(pri[i],p))
				return 0;
		return 1;
	}
	for(int i=1;i<=prsiz;i++)
		if(p==pri[i])
			return 1;
	return 0;
}
int f(int x,int mod){
	return (qpow(x,x,mod)+sd)%mod;
}
int floyd(int x,int st){
	sd=gen()%x;
	int fst,slw,ret=1,g;
	fst=slw=gen()%x,fst=f(fst,x);
	for(int i=0;fst!=slw;i++){
		ret=ret*(fst-slw+x)%x;
		if(!ret)
			ret=fst-slw+x;
		if(!(i%st)){
			g=__gcd(ret,x);
			if(g!=1)
				return g;
			ret=1;
		}
		fst=f(f(fst,x),x),slw=f(slw,x);
	}
	return __gcd(ret,x);
}
int pollard_rho(int x){
	if(x==1)
		return 1;
	if(miller_rabin(x))
		return x;
	int k=1,st=int(log((uint64_t)x))<<1|1;
	while(k==1)
		k=floyd(x,st);
	return max(pollard_rho(k),pollard_rho(x/k));
}
int32_t main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>t;
	while(t--){
		cin>>n,ans=pollard_rho(n);
		if(ans==n)
			cout<<"Prime\n";
		else
			cout<<ans<<'\n';
	}
	return 0;
}

除了#12全T

2023/12/3 17:58
加载中...