hdu2138 How many prime numbers (素数测试)

来源:互联网 发布:阿里小号 注册淘宝 编辑:程序博客网 时间:2024/06/08 07:42

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2138


米勒拉宾算法


#include <stdio.h>_int64 pow_mod(_int64 a,_int64 b,_int64 mod){_int64 ans=1;while(b){if(b&1)ans=(ans*a)%mod;a=(a*a)%mod;b>>=1;}return ans;}int MillerBabbin(_int64 n,_int64 a){_int64 t;_int64 d=n-1;if(n==2||n==a)return 1;if((n&1)==0)//n为偶数return 0;while(!(d&1))d>>=1;t=pow_mod(a,d,n);while((d!=n-1)&&(t!=1)&&(t!=n-1)){t=t*t%n;d<<=1;}return ((t==n-1)||(d&1)==1);}int isPrime(_int64 n){int i;_int64 test[5]={2,3,5,7};for(i=0;i<4;++i){if(!MillerBabbin(n,test[i]))return 0;}return 1;}int main(){int n,ans;_int64 x;while(scanf("%d",&n)!=EOF){ans=0;while(n--){scanf("%I64d",&x);if(isPrime(x))ans++;}printf("%d\n",ans);}return 0;}