//Code by __dest__ruct__or__(uid=592238)
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
#define umap unordered_map
#define ll long long
#define pii pair<int,int>
#define pll pair<long long,long long>
namespace mySTL{
inline int max(int a,int b){return a>b?a:b;}
inline int min(int a,int b){return a<b?a:b;}
inline int abs(int a){return a<0?-a:a;}
inline int read(){char c=getchar();int f=1,ans=0;
while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9')ans*=10,ans+=c-'0',c=getchar();
return ans*f;}
inline long long readll(){char c=getchar();long long f=1,ans=0;
while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9')ans*=10,ans+=c-'0',c=getchar();
return ans*f;}
inline void swap(int &a,int &b){a^=b,b^=a,a^=b;}
inline void write(int x){if(x<0){putchar('-');x=-x;}
if(x>=10){write(x/10);}putchar(x%10+'0');}
inline void writell(long long x){if(x<0){putchar('-');x=-x;}
if(x>=10){writell(x/10);}putchar(x%10+'0');}
inline ll pw(ll a,ll b,ll p){if(b==0)return 1;
if(b==1)return a;
ll mid=pw(a,b/2,p)%p;
if(b&1)return mid*mid%p*a%p;else{return mid*mid%p;}}
}
using namespace mySTL;
const int cnt=25,prime[25]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97};
inline ll exmul(ll n,ll m,ll p){
ll ans=0;
while(m>0){
if(m&1){
ans=(ans+n)%p;
}
m>>=1;
n=(n+n)%p;
}
return ans;
}
inline ll expow(ll n,ll m,ll p){
ll ans=1;
while(m>0){
if(m&1){
ans=exmul(ans,n,p);
}
m>>=1;
n=exmul(n,n,p);
}
return ans;
}
inline bool Miller_Rabin(ll x){
if(x<2){
return false;
}
if(x==2){
return true;
}
for(int i=0;i<cnt;i++){
if(x==prime[i]){
return true;
}
ll a=((rand()<<16)|rand())%(x-1)+1;
if(expow(a,x,x)!=a){
return false;
}
}
for(int i=0;i<cnt;i++){
ll a=prime[i]%(x-1)+1;
if(expow(a,x,x)!=a){
return false;
}
}
return true;
}
int t;
ll n;
int main(void){
//freopen("data.txt","r",stdin);
srand(time(0));
t=read();
while(t--){
n=readll();
if(Miller_Rabin(n)){
printf("YES\n");
}else{
printf("NO\n");
}
}
return 0;
}
是在 Miller_Rabin 的过程出错了吗?
求大佬讲解