poj 1811 Prime Test(拉宾米勒测试+大数分解)
发布时间:2020-12-14 02:39:25 所属栏目:大数据 来源:网络整理
导读:Language: Default Prime Test Time Limit: ?6000MS ? Memory Limit: ?65536K Total Submissions: ?29969 ? Accepted: ?7647 Case Time Limit: ?4000MS Description Given a big integer number,you are required to find out whether it's a prime number.
给定一个数 判断是否是素数 如果不是素数给出最小的素因子 由于 给出的数可能会很大 所以 不能用普通的方法 在这里用到的就是拉宾米勒测试+pollard_rho
#include <cstdio> #include <iostream> #include <cstring> #include <cmath> #include <algorithm> #include <string.h> #include <string> #include <vector> #include <queue> #include <ctime> #include <cstdlib> #define MEM(a,x) memset(a,x,sizeof a) #define eps 1e-8 #define MOD 10009 #define MAXN 1010 #define MAXM 100010 #define INF 99999999 #define ll long long #define bug cout<<"here"<<endl #define fread freopen("ceshi.txt","r",stdin) #define fwrite freopen("out.txt","w",stdout) #define MAX ((ll)1<<61) #define Times 10 #define C 201 using namespace std; int Read() { char ch; int a = 0; while((ch = getchar()) == ' ' | ch == 'n'); a += ch - '0'; while((ch = getchar()) != ' ' && ch != 'n') { a *= 10; a += ch - '0'; } return a; } void Print(int a) //ê?3?ía1ò { if(a>9) Print(a/10); putchar(a%10+'0'); } ll mini; int cnt; ll pri[MAXN]; ll gcd(ll a,ll b) { if(b==0) return a; return gcd(b,a%b); } ll random(ll n) { return (ll)((double)rand()/RAND_MAX*n+0.5); } ll mult(ll a,ll b,ll m)//a*b%m { ll ret=0; while(b>0) { if(b&1) ret=(ret+a)%m; b>>=1; a=(a<<1)%m; } return ret; } ll quick_mod(ll a,ll m) { ll ans=1; a%=m; while(b) { if(b&1) { ans=mult(ans,a,m); b--; } b/=2; a=mult(a,m); } return ans; } bool Witness(ll a,ll n) { ll m=n-1; int j=0; while(!(m&1)) { j++; m>>=1; } ll x=quick_mod(a,m,n); if(x==1||x==n-1) return 0; while(j--) { x=x*x%n; if(x==n-1) return 0; } return 1; } bool miller_rabin(ll n) { // cout<<"n "<<n<<endl; if(n<2) return 0; if(n==2) return 1; if(!(n&1)) return 0; for(int i=1;i<=Times;i++) { ll a=random(n-2)+1; if(Witness(a,n)) return 0; } return 1; } ll pollard_rho(ll n,int c) { ll x,y,d,i=1,k=2; x=random(n-1)+1; y=x; while(1) { i++; x=(mult(x,n)+c)%n; d=gcd(y-x,n); if(1<d&&d<n) return d; if(y==x) return n; if(i==k) { y=x; k<<=1; } } } void find(ll n,int k) { if(n==1) return; if(miller_rabin(n)) { pri[++cnt]=n; if(n<mini) mini=n; return; } ll p=n; while(p>=n) p=pollard_rho(p,k--); find(p,k); find(n/p,k); } int main() { //fread; int tc; scanf("%d",&tc); while(tc--) { ll n; scanf("%lld",&n); mini=MAX; cnt=0; if(miller_rabin(n)) puts("Prime"); else { find(n,C); printf("%lldn",mini); } } return 0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |