在ACM竞赛中,如何利用数论算法模板快速判断一个大整数是否为素数,并给出相应的C++代码实现?
时间: 2024-11-01 19:12:13 浏览: 36
在ACM竞赛中,素数判断是一个常见问题,特别是在需要处理大数时。为了快速利用数论算法模板进行素数判断,你可以采用Miller-Rabin素性测试算法,这是一种概率算法,它可以在多项式时间内给出一个大整数是否为合数的结论,并且当它判断一个数是素数时,该结论是准确无误的。下面是一个使用Miller-Rabin素性测试的C++代码实现示例:
参考资源链接:[史上最全ACM算法模板集——223页精华PDF](https://wenku.csdn.net/doc/64smrgz4pe?spm=1055.2569.3001.10343)
```cpp
#include <iostream>
#include <cmath>
#include <ctime>
using namespace std;
typedef long long LL;
LL quick_pow(LL a, LL n, LL mod) {
LL res = 1;
while (n) {
if (n & 1) res = res * a % mod;
a = a * a % mod;
n >>= 1;
}
return res;
}
bool miller_test(LL d, LL n) {
LL a = 2 + rand() % (n - 4);
LL x = quick_pow(a, d, n);
if (x == 1 || x == n - 1) return true;
while (d != n - 1) {
x = (x * x) % n;
d *= 2;
if (x == 1) return false;
if (x == n - 1) return true;
}
return false;
}
bool is_prime(LL n, int k) {
if (n <= 1 || n == 4) return false;
if (n <= 3) return true;
LL d = n - 1;
while ((d & 1) == 0) d >>= 1;
for (int i = 0; i < k; i++) {
if (!miller_test(d, n)) return false;
}
return true;
}
int main() {
srand(time(0));
LL n;
int k = 5; // 测试次数,次数越多,结果越准确
while (cin >> n && n) {
if (is_prime(n, k)) {
cout <<
参考资源链接:[史上最全ACM算法模板集——223页精华PDF](https://wenku.csdn.net/doc/64smrgz4pe?spm=1055.2569.3001.10343)
阅读全文