1. 程式人生 > >【Template】Miller Rabin

【Template】Miller Rabin

efi a* ont tor sin putc spa bre lose

技術分享圖片
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #include<cmath>
 6 #include<vector>
 7 //#include<stack>
 8 #include<bitset> 
 9 #define R(a,b,c) for(register int (a)=(b);(a)<=(c);++(a))
10 #define nR(a,b,c) for(register int (a)=(b);(a)>=(c);--(a))
11
#define Ii inline int 12 #define Iv inline void 13 #define Il inline long long 14 #define Ib inline bool 15 #define INF 0x7ffffff 16 #define re register 17 #define ll long long 18 #define Max(a,b) ((a)>(b)?(a):(b)) 19 #define Min(a,b) ((a)<(b)?(a):(b)) 20 #define Cmin(a,b) ((a)=(a)<(b)?(a):(b)) 21
#define Cmax(a,b) ((a)=(a)>(b)?(a):(b)) 22 #define Fill(a,b) memset((a),(b),sizeof((a))) 23 #define D_e_Line printf("\n-------------\n"); 24 #define D_e(x) printf("\n______%d_______\n",x) 25 #define Pause() system("pause") 26 using namespace std; 27 Ii read(){ 28 int s=0,f=1;char c; 29
for(c=getchar();c>9||c<0;c=getchar())if(c==-)f=-1; 30 while(c>=0&&c<=9)s=s*10+(c^0),c=getchar(); 31 return s*f; 32 } 33 template<class T>Iv print(T x){ 34 if(x<0)putchar(-),x=-x; 35 if(x>9)print(x/10); 36 putchar(x%10^0); 37 } 38 int base[3]={2,7,61}; 39 ll Pow(ll a,ll b,ll mod){ 40 ll s=1; 41 while(b){ 42 if(b&1)s=(s*a)%mod; 43 a=a*a%mod,b>>=1; 44 } 45 return s%mod; 46 } 47 Ib Miller_Rabin(ll n){ 48 if(n==2||n==7||n==61)return 1; 49 if(n<2||n%2==0||n%7==0||n%61==0)return 0; 50 R(i,0,2){ 51 int flag=0; 52 ll a=base[i]; 53 ll tmp=n-1;int k=0; 54 while(tmp%2==0) 55 ++k,tmp>>=1; 56 ll x=Pow(a,tmp,n); 57 if(x==1||x==n-1){flag=1;continue;} 58 while(k--){ 59 x=x*x%n; 60 if(x==n-1){ 61 flag=1;break; 62 } 63 } 64 if(!flag)return 0; 65 } 66 return 1; 67 } 68 int main(){ 69 int n=read(),T=read(); 70 while(T--){ 71 (Miller_Rabin(read())==1)? 72 printf("Yes\n"): 73 printf("No\n"); 74 } 75 return 0; 76 }
Miller Rabbin.cpp

【Template】Miller Rabin