板子
#include <cstdio>
using namespace std;
typedef long long ll;
ll prime[5] = {2, 3, 5, 233, 331};
ll pow_mod(ll a, ll n, ll mod)
{
ll ret = 1;
while (n) {
if (n & 1) ret = ret * a % mod;
a = a * a % mod;
n >>= 1;
}
return ret;
}
int miller_rabin(ll n)
{
if (n < 2 || (n != 2 && !(n & 1))) return 0;
ll s = n - 1;
while (!(s & 1)) s >>= 1;
for (int i = 0; i < 5; ++i) {
if (n == prime[i]) return 1;
ll t = s, m = pow_mod(prime[i], s, n);
while (t != n - 1 && m != 1 && m != n - 1) {
m = m * m % n;
t <<= 1;
}
if (m != n - 1 && !(t & 1)) return 0;
}
return 1;
}
int main()
{
ll n;
while (~scanf("%lld", &n))
printf("%s\n", miller_rabin(n) ? "YES" : "NO");
return 0;
}
https://blog.csdn.net/fwq990720/article/details/79108331
#include <iostream>
using namespace std ;
#define rd(x) (rand()%(x))
typedef unsigned long long ll;
ll pow_mod(ll a,ll b,ll r)
{
ll ans=1,buff=a;
while(b)
{
if(b&1)
ans=(ans*buff)%r;
buff=(buff*buff)%r;
b>>=1;
}
return ans;
}
bool test(ll n,ll a,ll d)
{
if(n==2) return true;
if(n==a) return false;
if(!(n&1)) return false;
while(!(d&1)) d>>=1;
ll t = pow_mod(a,d,n);
while(d!=n-1&&t!=n-1&&t!=1){
t = t*t%n;//下面介绍防止溢出的办法,对应数据量为10^18次方;
d<<=1;
}
return t == n-1||(d&1)==1;//要么t能变成n-1,要么一开始t就等于1
}
bool isprime(ll n)
{
int a[] = {2,3,5,7};//或者自己生成[2,N-1]以内的随机数rand()%(n-2)+2
for(int i = 0; i <= 3; ++i){
if(n==a[i]) return true;
if(!test(n,a[i],n-1)) return false;
}
return true;
}
int main()
{
int t,ans=0;
ll N;
for(cin >> t;t;t--){
cin >> N;
cout << ((isprime(N))?"Yes":"No") <<endl;
}
}
https://www.cnblogs.com/Norlan/p/5350243.html’
防止溢出
long long mod_mul(long long a, long long b, long long n) {
long long res = 0;
while (b) {
if(b & 1)
res = (res + a) % n;
a = (a + a) % n;
b >>= 1;
}
return res;
}
long long pow_mod(long long a, long long b, long long n) {
long long res = 1;
while(b) {
if(b & 1)
res = mod_mul(res, a, n);
a = mod_mul(a, a, n);
b >>= 1;
}
return res;
}