1. 程式人生 > >Miller rabin

Miller rabin

sin blog namespace OS ret cpp down == sca

蛤蛤,終於基本上搞懂了

#include<iostream> 
#include<cstdio>
using namespace std;
long long num[10]={0,2,3,5,7,11,13,17,19};
long long mul(long long a,long long b,long long p)
{
    long long ans=1;
    a=a%p;
    while(b)
    {
        if(b&1)
            ans=(ans*a)%p;
        b>>=1;
        a=(a*a)%p;
    }
    return
ans; } bool test(long long a) { if(a==2) return true; if(a%2==0||a==1) return false; for(int i=1;i<=8;i++) if(a==num[i]) return true; long long t=0,temp=a-1,now; while((temp&1)==0) { temp>>=1; t+=1; } for
(int i=1;i<=8;i++) { now=mul(num[i],temp,a); long long nxt=now; for(int i=1;i<=t;i++) { nxt=(now*now)%a; if(nxt==1&&now!=1&&now!=a-1) return false; now=nxt; } if(now!=1) return
false; } return true; } int main() { long long n,m; scanf("%lld%lld",&n,&m); long long pass; for(int i=1;i<=m;i++) { scanf("%lld",&pass); if(test(pass)) printf("Yes\n"); else printf("No\n"); } }

Miller rabin