Loading

「学习笔记」分解质因数

\(\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)\)
这个在最大公因数那篇文章中证过,这里不再证了

posted @ 2023-01-10 17:34  yi_fan0305  阅读(81)  评论(0编辑  收藏  举报