Miller-Rabin 求调
查看原帖
Miller-Rabin 求调
676921
FailureC0der楼主2023/3/15 20:30

阳历过了,测了许多组都没问题。

#include <bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
	int now=0,nev=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')nev=-1;c=getchar();}
	while(c>='0'&&c<='9'){now=(now<<1)+(now<<3)+(c&15);c=getchar(); }
	return now*nev;
}

int qpow(int a, int b, int p){
	int ans = 1;
	for (; b; b >>= 1){
		if (b & 1) ans = ans * a % p;
		a = a * a % p;
	}
	return ans;
}

bool witness(int a, int n){
	int u = n - 1;
	int t = 0;
	while (u & 1 == 0)
		u >>= 1, t ++;
	int x1, x2;
	x1 = qpow(a, u, n);
	for (int i = 1; i <= t; i ++){
		x2 = qpow(x1, 2, n);
		if (x2 == 1 && x1 != 1 && x1 != n - 1)
			return true;
		x1 = x2;
	}
	if (x1 != 1) return true;
	return false;
}

int miller_rabin(int n, int s){
	if (n < 2) return 0;
	if (n == 2) return 1;
	if (n % 2 == 0) return 0;
	for (int i = 0; i < s && i < n; i ++){
		int a = rand() % (n - 1) + 1;
		if (witness(a, n)) return 0;
	}
	return 1;
}

signed main()
{
	srand(time(0));
 	int m = read();
 	while (m --){
 		int n = read();
 		int S = 50;
 		if (miller_rabin(n, S)) cout << "YES\n";
 		else cout << "NO\n";
	}
    return 0;
}
2023/3/15 20:30
加载中...