#创作计划# 素数篇(未完成)
2025-06-14 07:25:12
发布于:浙江
本帖不是来水奖品的,只希望能上精华帖@AC君
言归正传,本帖是来讲素数的芝士的,废话不多说,见下↓
素数的定义:
素数,就是一个数的因数只有1和它本身,那么那个数就叫做素数,或质数。常见的素数有2,3,5等。0和1不是素数。详见小学数学书
来默写一下一百以内的素数:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
素数的相关知识:
1: 所有的合数都一定有一个素数作为其因数,也就是任意大于一的自然数,要么本身是素数,要么可以分解为几个素数之积,且这种分解是唯一的。
2: 素数有无数个,合数也有无数个。
3: 素数的个数公式 是不减函数。
4: 假设n是一个正数,那么 到 中至少有一个素数。
5: 假设n是大于等于2的正数,那么 到 之间至少有一个素数。
6: 假设n是一个素数,a小于n,那么有
7: 等等。
判断素数的方法:
方法一,试除法:
顾名思义,就是一个一个试过去,看看 除了1和本身,是否含有其他的因数。优化后时间复杂度为
方法二
#include <bits/stdc++.h>
using namespace std;
// 快速幂取模 (a^b mod n)
long long power_mod(long long a, long long b, long long n) {
long long res = 1;
a = a % n;
while (b > 0) {
if (b & 1) res = (res * a) % n;
b = b >> 1;
a = (a * a) % n;
}
return res;
}
// Miller-Rabin 检测核心
bool miller_test(long long d, long long n) {
long long a = 2 + rand() % (n - 4); // 随机基数 [2, n-2]
long long x = power_mod(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;
}
// 主函数:k为检测迭代次数(默认5次)
bool is_prime(long long n, int k = 5) {
if (n <= 1 || n == 4) return false;
if (n <= 3) return true;
long long d = n - 1;
while (d % 2 == 0) d /= 2; // 分解 n-1 = 2^s * d
for (int i = 0; i < k; i++) {
if (!miller_test(d, n)) return false;
}
return true;
}
int main() {
srand(time(0)); // 初始化随机种子
long long num;
cin >> num;
cout << (is_prime(num) ? "Yes":"No") << endl;
return 0;
}
全部评论 2
而且第六个点的幂是 n-1 吧
22小时前 来自 广东
0都可以,只要是小于n 的
13小时前 来自 浙江
0?
13小时前 来自 广东
0是的啊
13小时前 来自 浙江
0
精不了,因为是AI写的
22小时前 来自 广东
0不是,自己写的
13小时前 来自 浙江
0除了最后一个代码
13小时前 来自 浙江
0
有帮助,赞一个