3种素数判断方法

 

#include<bits/stdc++.h>
using namespace std;

//试除法
bool is_prime(int n){
    if(n<2)return false;
    int temp=sqrt(n);
    for(int i=2;i<=temp;i++){
        if(n%i==0)return false;
    }
    return true;
}

/*
6倍法(试除法优化)
质数分布规律:>=5 的质数一定和 6 的倍数相邻
证明:令x≥1,将大于等于5的自然数表示如下:6x-1 6x 6x+1 6x+2 6x+3 6x+4 6x+5
其中,6|6x 2|(6x+2) 3|(6x+3) 2|(6x+4) 它们一定不是质数
但在6的倍数相邻两侧并不一定就是质数
*/
bool is_prime2(int n){
    if(n<=1)return false;
    if(n==2||n==3)return true;
    if(n%6!=1&&n&6!=5)return false;
    int temp=sqrt(n);
    for(int i=5;i<=temp;i+=6)
        if(n%i==0||n%(i+2)==0)return false;
    return true;
}

//MR素性探测(非确定)
typedef long long ll;
ll n,a;
ll prime[]={3,5,7,11,13,37,79,97};

ll quick_mul(ll a,ll b,ll p){
    ll res=a*b-(ll)((long double)a/p*b+0.5)*p;
    return res<0?res+p:res;
}
ll quick_pow(ll a,ll b,ll p){
    ll res=1;
    for(;b;b>>=1,a=quick_mul(a,a,p))
        if(b&1)res=quick_mul(res,a,p);
    return res;
}
bool is_prime3(ll n){
    if(n<2)return false;
    if(n==2)return true;
    if(!(n&1))return false;
    ll m=n-1,k=0;
    while(!(m&1)){
        m>>=1;
        k++;
    }
    for(int i=0;i<8;i++){
        ll a=prime[i];
        if(a==n)return true;
        ll x=quick_pow(a,m,n),y;
        for(int j=1;j<=k;j++){
            y=quick_mul(x,x,n);
            if(y==1&&x!=1&&x!=n-1)return false;
            x=y;
        }
        if(y!=1)return false;
    }
    return true;
}

int main(){


    return 0;
}

 

posted @ 2021-01-11 13:17  _Famiglistimo  阅读(234)  评论(0编辑  收藏  举报