数学基础-素数
素数
定义
一个大于
性质
- 素数有无穷多个
- 存在任意长的连续数,其中所有数都是合数,即相邻素数之间的间隔任意大。
- 随着
的增大素数越来越稀疏。
哥德巴赫猜想
任意大于
贝特朗假设
对任意
推论
素数定理
设
推论
推论:从不大于
算术基本定理(唯一分解定理)
任何一个大于
其中
推论
其中
质因数分解
引理
反证法:若有两个大于
试除法
用
例题:
素数判断
void solve() { int x, t; cin >> x; t = x; vector<int> v; for (int p : primes) { // 试除法 if (x == 1) break; if (x % p == 0) { v.push_back(p); while (x % p == 0) { x /= p; } } } if (x != 1) { v.push_back(x); } if (v[0] == t) { cout << "isprime\n"; } else { cout << "noprime\n"; } for (int i = 0; i < v.size(); i++) { cout << v[i] << " \n"[i == v.size() - 1]; } }
勒让德定理
例题:
阶乘分解
void solve() { int n; cin >> n; sieve(n); for (int p : primes) { int cnt = 0; for (int i = p; i <= n; i *= p) { cnt += n / i; // 勒让德定理 } cout << p << " " << cnt << "\n"; } }
筛法
埃拉托斯特尼筛法
筛掉素数的倍数,同一个数会被筛多遍,时间复杂度为
核心代码:
vector<int> primes, v; void sieve(int n) { primes.clear(); v.assign(n + 1, 0); for (int i = 2; i <= n; i++) { if (v[i]) continue; // 如果被筛过 primes.push_back(i); // 剩下的为素数 for (int j = i; j * i <= n; j++) { // 筛掉其倍数 v[i * j] = 1; } } }
欧拉筛/线性筛
确保每个合数只会被其最小质因子筛过,时间复杂度为
核心代码:
void sieve(int n) { minp.assign(n + 1, 0); primes.clear(); for (int i = 2; i <= n; i++) { if (minp[i] == 0) { minp[i] = i; primes.push_back(i); } for (int p : primes) { if (i * p > n || p > minp[i]) break; minp[i * p] = p; // 只被最小质因子筛过 } } }
例题:
素数判断
Forsaken喜欢数论
质数距离
欧拉函数
定义
性质
若
证明:显然,
计算公式
由算数基本定理,有
公式求欧拉函数
只需要求一个数的欧拉函数时,先筛出
void solve() { sieve(1e5); int n; cin >> n; int phi = n; for (int p : primes) { if (n == 1) break; if (n % p == 0) { phi = phi / p * (p - 1); while (n % p == 0) { n /= p; } } } if (n > 1) { phi = phi / n * (n - 1); } cout << phi << "\n"; }
例题:
欧拉函数
筛法求欧拉函数
当需要求多个数的欧拉函数,可利用线性筛法求出欧拉函数。
若
(1) 若
(1) 若
例题:
筛法求欧拉函数
vector<int> minp, primes, phi; int ans = 1; void sieve(int n) { primes.clear(); minp.assign(n + 1, 0); phi.assign(n + 1, 0); for (int i = 2; i <= n; i++) { if (minp[i] == 0) { minp[i] = i; primes.push_back(i); phi[i] = i - 1; } ans += phi[i]; for (int p : primes) { if (i * p > n || p > minp[i]) break; minp[i * p] = p; if (i % p) { phi[i * p] = phi[i] * phi[p]; } else { phi[i * p] = phi[i] * p; } } } }
积性函数
定义
若当
性质
若
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
2022-08-06 Linux常用简单命令
2022-08-06 conda常用命令和换源