在ACM做这么一道题:
我用了最简单的查找素数的方法:
bool isPrime(int n) { int t=n-1; while(t>2) { if(n%t==0) { return false; } t--; } return true; }结果正确,却超时了,后来发现当变量是一个大数的时候这种查找效率极低,于是就在网站各种搜索快速的判断素数的算法
Miller Rabin算法:
typedef unsigned __int64 llong; llong mod_pro(llong x,llong y,llong n) { llong ret=0,tmp=x%n; while(y) { if(y&0x1)if((ret+=tmp)>n)ret-=n; if((tmp<<=1)>n)tmp-=n; y>>=1; } return ret; } llong mod(llong a,llong b,llong c) { llong ret=1; while(b) { if(b&0x1)ret=mod_pro(ret,a,c); a=mod_pro(a,a,c); b>>=1; } return ret; } llong ran() { llong ret=rand(); return ret*rand(); } bool isPrime2(llong n) { int t=2; if(n<2)return false; if(n==2)return true; if(!(n&0x1))return false; llong k=0,m,a,i; for(m=n-1;!(m&1);m>>=1,k++); while(t--) { a=mod(ran()%(n-2)+2,m,n); if(a!=1) { for(i=0;i<k&&a!=n-1;i++) a=mod_pro(a,a,n); if(i>=k)return false; } } return true; }对比一下速度:
我的
Miller Rabin算法: