质数判断

朴素实现

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

参考

  1. \(\text{12.11 math1.pdf \; \;by Tx\_Lcy}\)
posted @ 2025-04-06 18:29  Hstry  阅读(5)  评论(0)    收藏  举报