写这次博客的原因是在网上看了很多的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; }