zoukankan      html  css  js  c++  java
  • Miller_Rabin判断素数模版

    #include<bits/stdc++.h>
    
    using namespace std;
    
    typedef long long ll;
    const int maxn=1000100;
    const int INF=1e9+10;
    
    /// 18位素数:154590409516822759
    /// 19位素数:2305843009213693951 (梅森素数)
    /// 19位素数:4384957924686954497
    ll prime[6] = {2, 3, 5, 233, 331};
    ll qmul(ll x,ll y,ll mod)
    { // 乘法防止溢出, 如果p * p不爆LL的话可以直接乘; O(1)乘法或者转化成二进制加法
        return (x*y-(ll)(x/(long double)mod*y+(1e-3))*mod+mod)%mod;
    }
    
    ll qpow(ll n,ll k,ll mod)
    {
        ll res=1;
        while(k){
            if(k&1) res=qmul(res,n,mod);
            n=qmul(n,n,mod);
            k>>=1;
        }
        return res;
    }
    
    bool Miller_Rabin(ll p) {
        if(p<2) return 0;
        if(p!=2&&p%2==0) return 0;
        ll s=p-1;
        while(!(s&1)) s>>=1;
        for(int i=0;i<5;i++) {
            if(p==prime[i]) return 1;
            ll t=s,m=qpow(prime[i],s,p);
            while(t!=p-1&&m!=1&m!=p-1) {
                m=qmul(m,m,p);
                t<<=1;
            }
            if(m!=p-1&&!(t&1)) return 0;
        }
        return 1;
    }
    
    int main()
    {
        ll n;
        while(cin>>n){
            if(Miller_Rabin(n)) cout<<"YES"<<endl;
            else cout<<"NO"<<endl;
        }
        return 0;
    }
    View Code
    没有AC不了的题,只有不努力的ACMER!
  • 相关阅读:
    寒假补习记录_4
    寒假补习记录_3
    寒假补习记录_2
    寒假补习记录_1
    公文流转系统编程
    Javaweb编程
    转:在静态方法中访问类的实例成员
    Java字段初始化规律
    原码,反码,补码浅谈
    java第二节课课后
  • 原文地址:https://www.cnblogs.com/--560/p/5176666.html
Copyright © 2011-2022 走看看