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;
}
posted @ 2021-04-24 21:15  yueshehanjiang  阅读(74)  评论(0编辑  收藏  举报