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;
}