「学习笔记」分解质因数
\(\text{Before said}\)
本文涉及唯一分解定理,这个在之前的最大公因数那篇中提到了,可以去看一下,不过在本文我还是会在复述一遍
唯一分解定理
定义:任何一个大于 \(1\) 的自然数 \(N\),如果 \(N\) 不为质数,那么 \(N\) 可以唯一分解成有限个质数的乘积 \(N = P_1^{a_1}P_2^{a_2}P_3^{a_3}......P_n^{a_n}\),这里 \(P_1 < P_2 < P_3 ...... < P_n\)均为质数,其中指数 \(a_i\) 是正整数。这样的分解称为 \(N\) 的标准分解式。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
inline ll read() {
ll x = 0;
int fg = 0;
char ch = getchar();
while (ch < '0' || ch > '9') {
fg |= (ch == '-');
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
x = (x << 3) + (x << 1) + (ch ^ 48);
ch = getchar();
}
return fg ? ~x + 1 : x;
}
const int N = 1e7 + 5;
int n;
int num[N];
int main() {
n = read();
int maxn = sqrt(n) + 0.5;
printf("%d = ", n);
for (int i = 2; i <= maxn; ++ i) {
if (n < i) break;
while (n % i == 0) {
n /= i;
printf("%d * ", i);
}
}
if (n != 1) {
printf("%d\n", n);
}
else {
printf("1\n");
}
return 0;
}
这个算法是 \(O_{\sqrt n}\),如果能提前打出质数表,复杂度会更优秀!
性质
前提:如果一个正整数 \(N\),他的标准分解式为 \(N = p_1^{a_1}p_2^{a_2}p_3^{a_3} \ldots p_n^{a_n}\)
\(1\)、它的正因数个数 $\sigma(N) = (1 + a_1)(1 + a_2)(1 + a_3)(1 + a_4) \ldots (1 + a_n) $
证明:对于 \(p_1\) 来说,选的个数有 \(a_1 + 1\) 种,即\(0, 1, 2, 3, \ldots, a_1\),其他的质因数同理,最后用乘法原理即可
\(2\)、它的正因数之和 \(\sigma(N) = (1 + p_1 + p_1^2 + \ldots + p_1^{a_1})(1 + p_2 + p_2^2 + \ldots + p_2^{a_2}) \ldots(1 + p_n + p_n^2 + \ldots + p_n^{a_n})\)
证明:你把这个式子拆开就行了
\(3\)、\(a b = \gcd(a, b) \times \operatorname{lcm}(a, b)\)
这个在最大公因数那篇文章中证过,这里不再证了