#include <iostream>
using namespace std;
long long pow_mod(long long a,long long n,long long m){ //快速幂运算
if(n==0) return 1;
long long x=pow_mod(a,n/2,m);
long long ans=x*x%m;
if(n%2==1) ans=ans*a%m;
return ans;
}
bool test(int n,int a,int b){
if(n==2||n==a) return true;
if((n%2)==0) return false;
if(pow_mod(a,b,n)==1) return true;
else return false;
}
bool isPrime(int n){
int a[]={2,3,61};
for(int i=0;i<3;i++){
if(test(n,a[i],n-1))
return true;
}
return false;
}
int main(){
int n,p;
while(cin>>n){
int account=0;
for(int i=0;i<n;i++){
cin>>p;
if(isPrime(p)) account++;
}
cout<<account<<endl;
}
}
大数字素数的判断原理实际上就是利用费马小定理:对于任意的素数a,如果a^(p-1)mod p=1,则p为素数;
一般我们把a取2,但此时会有一定概率对伪素数(如341)判断不成功,所以需要多次取质数判断;
因为p比较大的时候2^(p-1)会溢出,所以这里我们要用快速幂计算;
快速幂主要运用递归的思想和ab mod n=(a mod n)(b mod n)mod n公式计算,优化可用二次查找法;(紫书P315讲解很详细)
最后传入一个质数数组判断就OK了