素性测试(Miller-Rabin测试)
首先,一个叫费马的人提出:如果一个数p是质数,且gcd(a,p)==1。那么(a^p)%p==a,这就是费马小定理。 然后我们反向利用这个定理,随便拿一个a,来算一算(ap)%p,如果等于a,就认为p是素数。
#include<bits/stdc++.h>
using namespace std;
//快速幂
void solve(int b){
int a=b-1,c=b;
a=a%c;
while(b){
if(b&1)a=(a*a)%c;
b>>=1;
a=(a*a)%c;
}
if(a!=((b-1)%c)){
cout<<"NO";
return ;
}
a=b+1;
a=a%c;
b=c;
while(b){
if(b&1)a=(a*a)%c;
a=(a*a)%c;
b>>=1;
}
if(a!=(b+1)%c){
cout<<"NO";
return ;
}
cout<<"YES";
return ;
}
int main(){
//利用快速幂判断素数
//对于任意一个素数P
//如果gcd(a,b)==1,那么有(a^P)%P==a;反向利用这个定理:对于任何一个素数,取几个a如果有(a^b)%b=a,则该数为素数
int t;
cin>>t;
solve(t);
}
亲测可用代码。