MR素数测试

用来快速判断一个数是否为素数
期望时间复杂度O(logn),单次最坏时间复杂度O(lognxlogn)

ll ksc(int a,int b,int p){
    ll z = (long double)a/p*b;
    ll res =(ull)a*b -(ull)(z*p);
    return (res+p)%p;
}
int ksm(int a,int b,int p){
    int res=1;
    while(b){
        if(b&1)res=ksc(res,a,p);
        a=ksc(a,a,p);
        b>>=1;
    }
    return res%p;
}
int mr(int a,int p){
    if(ksm(a,p-1,p)!=1)return 0;
    int x= p-1,y=0;
    while(x%2==0){
        x>>=1;
        y=ksm(a,x,p);
        if(y!=1&&y!=p-1)return 0;
        if(y==p-1)return 1;
    }
    return 1;
}
int isprime(int x){
    if(x<2)return 0;
    if(x==2||x==3||x==5||x==7||x==43)return 1;
    return mr(2,x)&&mr(3,x)&&mr(5,x)&&mr(7,x)&&mr(43,x);
}
posted @ 2025-08-21 18:56  Marinaco  阅读(8)  评论(0)    收藏  举报
//雪花飘落效果