zoukankan      html  css  js  c++  java
  • miller_rabin判断质数logn

    写这次博客的原因是在网上看了很多的miller_rabin判断质数,发现代码都很长或者不好理解,这次搞懂了写个简单易懂的方便大家理解。
    首先,根据费马小定理,如果一个数n是质数的话,那么必定存在一个数a,使得a的n-1次方%n必定等于1
    那么,我们就可以用随机化算法,去随机a,然后只要存在a的n-1次方%n不等于1,就返回false
    最后返回true
    代码如下

    #include<bits/stdc++.h>
    #define fer(i,a,b) for(re i = a ; i <= b ; ++ i)
    #define re register int
    #define x first
    #define y second
    typedef long long ll ;
    using namespace std;
    const int N =  1e6 + 10 , M = 1010 , inf = 0x3f3f3f3f , mod = 1e9 + 7 ;
    int mi = 5 ;  //mi是随机a的次数  可以变大它的值使答案更准确
    ll random(ll n)
    {
        return (ll)((double)rand()/RAND_MAX*n + 0.5) ;
        //(double)rand()/RAND_MAX 返回0到1之间随机的一个小数
    }
    ll qpow(ll a , ll b , ll p) // 快速幂
    {
        ll ans = 1 % p ;
        while(b)
        {
            if(b & 1) ans = ans * a % p ;
            b >>= 1 ;
            a = a * a % p ;
        }
        return ans ;
    }
    bool check(ll n) 
    {
        for(int i = 1 ; i <= mi ; i ++)
        {
            ll a = random(n - 2) + 1 ;
            if(qpow(a,n-1,n) != 1)
                return false;
        }
        return true ;
    }
    int main()
    {
    
        ll n ;
        cin >> n ;
        if(check(n))
        {
            puts("YES");
        }
        else puts("NO");
    
        return 0;
    }
    
  • 相关阅读:
    Mysql 备份 导入导出
    简 历
    Mysql 表结构 创建 限制 关联
    Unity 碰撞检测
    Unity 获取键值
    关于大型网站系统的一些问题
    关于zookeeper
    dubbo分布式和消息队列
    集群
    cookie及安全问题
  • 原文地址:https://www.cnblogs.com/yueshehanjiang/p/14698145.html
Copyright © 2011-2022 走看看