整数唯一分解定理,也称为算术基本定理,是由德国数学家高斯在其著作《算术研究》中首次提出的。本文回顾整数唯一分解定理以及对应的几个重要结论。
在这里插入图片描述

一、整数唯一分解定理

整数唯一分解定理,也称为算术基本定理,是数论中的一个重要定理。它指的是每个大于1的整数都可以唯一地表示为几个素数的乘积,而且这些素数的幂都是正整数。
n=p1a1∗p2a2∗…∗pkak(1)n = p_1^{a_1} * p_2^{a_2} * … * p_k^{a_k}\tag1n=p1a1p2a2pkak(1)

整数唯一分解的C++代码如下:

void IntDecompose(int n) {
	map<int,int> maps;  		//存储质数以及对应的幂
	int i = 2, e = 0;
	while (n != 1) {
		if (n % i == 0) {
			n /= i;
			maps[i]++;
		}
		else i++;
	}

	auto it = maps.begin();		//输出n对应的分解结果
	cout << n << "=" << it->first << "^" << it->second;
	for (++it; it != maps.end(); ++it)
		cout << " * " << it->first << "^" << it->second;
}

二、数的约数个数

根据整数唯一分解定理,可以得到一个结论:nnn 的正约数的个数为:
F(n)=(a1+1)∗(a2+1)∗⋯(ak+1)(2)F(n) = (a_1+1)*(a_2+1)*\cdots (a_k+1)\tag2F(n)=(a1+1)(a2+1)(ak+1)(2)
证明:对于 piaip_i^{a_i}piai, 它包含的因子有:pi0,pi1,pi2,⋯ ,piaip_i^0, p_i^1,p_i^2,\cdots ,p_i^{a_i}pi0,pi1,pi2,,piaiai+1a_i+1ai+1个因子。那么,nnn 有多少个因数呢?我们可以:
p1p_1p1中取1个因子,有 ai+1a_i+1ai+1种取法;
p2p_2p2中取1个因子,有 a2+1a_2+1a2+1种取法;
…;
pkp_kpk中取1个因子,有 ak+1a_k+1ak+1种取法。
然后将他们连乘起来。
总的数目为:F(n)=(a1+1)∗(a2+1)∗⋯(ak+1)F(n) = (a_1+1)*(a_2+1)*\cdots (a_k+1)F(n)=(a1+1)(a2+1)(ak+1)

三、最大公约数和最小公倍数

给定两个数 xxxyyy,他们可以分解为相同素数的幂的乘积:
x=p1a1∗p2a2∗…∗pkakx = p_1^{a_1} * p_2^{a_2} * … * p_k^{a_k} x=p1a1p2a2pkaky=p1b1∗p2b2∗…∗pkbk(3) y = p_1^{b_1} * p_2^{b_2} * … * p_k^{b_k} \tag3y=p1b1p2b2pkbk(3)
例如:给定 x=100,y=210x = 100, y = 210x=100,y=210 则:
100=22∗30∗52∗70100 = 2^2 * 3^0 *5^2*7^0100=22305270210=21∗31∗51∗71210=2^1 * 3^1 * 5^1 *7^1 210=21315171

3.1 最大公约数

给定式(3)所示的两个数 x,yx,yx,y, 它们的最大公约数为:
gcd(x,y)=p1min(a1,b1)∗p2min(a2,b2)∗…∗pkmin(ak,bk)(4)gcd(x,y) = p_1^{min(a_1,b_1)} * p_2^{min(a_2,b_2)} * … * p_k^{min(a_k,b_k)} \tag4gcd(x,y)=p1min(a1,b1)p2min(a2,b2)pkmin(ak,bk)(4)
简单证明:
首先, gcd(x,y)\text{gcd}(x,y)gcd(x,y) 一定能整除 xxxyyy。因为这里所有素数的幂都是取的较小者,即 pip_ipi 的幂为 min(ai,bi)min(a_i,b_i)min(ai,bi), 所以 pimin(ai,bi)∣piaip_i^{min(a_i,b_i)} | p_i^{a_i}pimin(ai,bi)piaipimin(ai,bi)∣pibip_i^{min(a_i,b_i)} | p_i^{b_i}pimin(ai,bi)pibi。 因此 gcd(x,y)\text{gcd}(x,y)gcd(x,y) 一定能够整除 xxxyyy

那么,为什么 gcd(x,y)\text{gcd}(x,y)gcd(x,y)xxxyyy 的最大公约数呢?这里使用反证法。
假设 ggg 才是 xxxyyy 的最大公约数。
那么,必然存在 ggg 包含的某个素数 pip_ipi 的指数 ci>min(ai,bi)c_i > min(a_i,b_i)ci>min(ai,bi)
但是,此时picip_i^{c_i}pici 要么不能整除 piaip_i^{a_i}piai, 要么不能整除 pibip_i^{b_i}pibi
因此, ggg 不能同时整除 xxxyyy
所以,与假设矛盾,gcd(x,y)\text{gcd}(x,y)gcd(x,y) 才是 xxxyyy 的最大公约数。

3.2 最小公倍数

给定式(3)所示的两个数 x,yx,yx,y, 它们的最小公倍数为:
lcm(x,y)=p1max(a1,b1)∗p2max(a2,b2)∗…∗pkmax(ak,bk)(5)lcm(x,y) = p_1^{max(a_1,b_1)} * p_2^{max(a_2,b_2)} * … * p_k^{max(a_k,b_k)} \tag5lcm(x,y)=p1max(a1,b1)p2max(a2,b2)pkmax(ak,bk)(5)
证明过程与最大公约数类似。

有了最大公约数和最小公倍数的定义,我们得出一个重要的结论:
xy=gcd(x,y)∗lcm(x,y)(4)xy = gcd(x,y)*lcm(x,y)\tag4xy=gcd(x,y)lcm(x,y)(4)
因为 :
(p1min(a1,b1)∗p2min(a2,b2)∗…∗pkmin(ak,bk))∗(p1max(a1,b1)∗p2max(a2,b2)∗…∗pkmax(ak,bk))=p1a1+b1∗p2a2+b2∗…∗pkak+bk=xy\left(p_1^{min(a_1,b_1)} * p_2^{min(a_2,b_2)} * … * p_k^{min(a_k,b_k)}\right) *\left(p_1^{max(a_1,b_1)} * p_2^{max(a_2,b_2)} * … * p_k^{max(a_k,b_k)}\right) \\= p_1^{a_1+b_1} * p_2^{a_2+b_2} * … * p_k^{a_k+b_k}=xy(p1min(a1,b1)p2min(a2,b2)pkmin(ak,bk))(p1max(a1,b1)p2max(a2,b2)pkmax(ak,bk))=p1a1+b1p2a2+b2pkak+bk=xy

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐