质数判断
朴素实现
bool is_prime(int v){
if (v < 2)return 0;
for (int i = 2; i * i <= v; ++i)if (v % i == 0)return 0;
return 1;
}
时间复杂度 \(O(\sqrt V)\)
二次探测定理
\[\forall p\in \mathbb P\;(\forall x^2\equiv 1\;(x\equiv\pm1))\pmod p
\]
Rabin-Miller 算法
const int prl[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37};
long long mul(long long a, long long b, long long M){return __int128(a) * b % M;}
long long gcd(long long a, long long b){return __gcd(a, b);}
long long add(long long a, long long b, long long M){a += b; while (a >= M)a -= M; return a;}
long long fpw(long long a, long long b, long long M){long long ret = 1;for (; b; b >>= 1, a = mul(a, a, M))if (b & 1)ret = mul(ret, a, M);return ret;}
bool check(int a, long long v){
long long d = v - 1, G = fpw(a, d, v);if (G != 1)return 1;
while ((d & 1) == 0){d >>= 1;if ((G = fpw(a, d, v)) == v - 1)return 0;else if (G != 1)return 1;}
return 0;
}
bool is_prime(long long v){
if (v <= 40){for (int a : prl)if (v == a)return 1;return 0;}
if (v < (1ll << 32)){if (check(2, v) || check(7, v) || check(61, v))return 0;return 1;}
for (int a : prl)if (check(a, v))return 0;return 1;
}
参考
- \(\text{12.11 math1.pdf \; \;by Tx\_Lcy}\)

浙公网安备 33010602011771号