Loading

「学习笔记」最大公因数和最小公倍数、唯一分解定理

前言

2025.12.17
发现高中时自己写的有点小问题,大学的自己再来修改一下,发挥 AFOer 的余热。
2022.7.27
终于开始正式写数论了,之前的快速幂和进制转化不算,莫名有些激动。
废话不多说,我们直接

进入正题!

定义

还是老样子,先搞明白定义
\(\gcd\) 最大公因数
\(\operatorname{lcm}\) 最小公倍数
此外,为了方便,规定 \(\gcd(0, a)=a\)

公式

\(a \times b= \gcd(a,b) \times \operatorname{lcm}(a,b)\)
你一定很好奇这是怎么来的,对吧?
别急,这就向你解释,但在这里,我们要插入一个小小的定理——唯一分解定理

半路杀出的唯一分解定理

2025.12.17
先前写太烂了,重写一下。

先说一下内容,就是一个正整数都可以拆成 \(a_1^{k1} \times a_2^{k2} \times a_3^{k3} \times a_4^{k4} \ldots\) 的形式,有且仅有这一种形式,其中 \(a_1, a_2 \ldots\) 都是质数,即质因数分解。

为什么一个正整数最终一定会被分解为质数相乘呢?
当我们分解一个正整数时,如果我们分解出来的因数里面有合数,那么这个合数一定还能分解(因为合数的因子不止 \(1\) 和它本身),合数分解后如果还有合数,那就再分解,直到分解为质数,就不能再分解了(因为质数的因子只有 \(1\) 和它本身),因此,可以得证一个正整数可以被分解为质数相乘

比如说 \(252=2^3 \times 3^2 \times 7^1\)
\(84=2^2 \times 3^1 \times 7^1\)

gcd 与 lcm

我们定义:

\[a=d_1^{k1} \times d_2^{k2} \times d_3^{k3} \times d_4^{k4}\ldots\\ b=d_1^{j1} \times d_2^{j2} \times d_3^{j3} \times d_4^{j4}\ldots \]

其中 \(k_i, j_i \ge 0\)
我们假设一个数 \(c=d_1^{g1} \times d_2^{g2} \times d_3^{g3} \times d_4^{g4}\ldots\)\(a\)\(b\) 的公因数
则可得 \(g_i \le \min(k_i,j_i)\)(这里理解过来基本就 OK 了)
如果要求 \(\gcd(a,b)\)
那么 \(\gcd(a, b) = d_1^{\min(k1, j1)} \times d_2^{\min(k2, j2)} \times d_3^{\min(k3, j3)} \times d_4^{\min(k4,j4)} \ldots\)
同理,一个数 \(e=d_1^{g1} \times d_2^{g2} \times d_3^{g3} \times d_4^{g4} \ldots\)\(a\)\(b\) 的公倍数,则\(g_i \ge \max(k_i,j_i)\)
要求 \(\operatorname{lcm}(a,b)\),则\(\operatorname{lcm}(a,b)=d_1^{\max(k1,j1)}\times d_2^{\max(k2,j2)} \times d_3^{\max(k3,j3)} \times d_4^{\max(k4,j4)} \ldots\)
所以 \(\gcd(a,b) \times \operatorname{lcm}(a,b)=d_1^{\max(k1,j1) + \min(k1,j1)} \times d_2^{\max(k2,j2)+\min(k2,j2)} \times d_3^{\max(k3,j3)+\min(k3,j3)} \times d_4^{\max(k4,j4)+\min(k4,j4)}\ldots\)
也就是 \(\gcd(a,b) \times \operatorname{lcm}(a,b)=d_1^{k1+j1} \times d_2^{k2+j2} \times d_3^{k3+j3} \times d_4^{k4+j4} \ldots = a \times b\)
所以我们证明了结论 \(a \times b = \gcd(a,b) \times \operatorname{lcm}(a,b)\)

\(\gcd\) ——欧几里得算法

欧几里得算法,其实就是辗转相除法

公式

\(\gcd(a,b) = \gcd(b,a \bmod b)\)
如何证明它的正确呢?
这里要用到弱化版本——更相减损术

同样半路杀出来的更相减损术

公式

\(\gcd(a, b) = \gcd(a - b, b)\)

证明

如果\(c \mid a\)\(c \mid b\),则\(a=cx,b=cy\),那么\(a-b=c(x-y)\),所以\(c \mid a-b\)(假设 \(a >b\))
也就是说 \(c\) 如果是 \(a\)\(b\) 的公因数,那它也一定是 \(a-b\) 的公因数,所以 \(\gcd(a,b) = \gcd(a-b,b)\) 是成立的

回归求 \(\gcd\)

我们利用更相减损术继续往下推
\(\gcd(a,b) = \gcd(a-b,b) = \gcd(a-b-b,b) = \gcd(a-b-b-b,b) = \ldots\)
\(a\) 一直减 \(b\),减到最后就成为了 \(\gcd(a \bmod b, b)\)
\(\gcd(a \bmod b, b) = \gcd(a, b)\),这里我们设 \(a \bmod b = c\),则 \(\gcd(c, b) = \gcd(a, b)\),同理 \(\gcd(c, b) = \gcd(c, b \bmod c)\),如此循环操作下去最终一定会到达一个阶段 \(\gcd(x, y)\),其中 \(x ,y\) 之间存在倍数关系,我们假设 \(x > y\),此时\(\gcd(x, y) = \gcd(0, y) = y\), \(0\) 是因为 \(x \bmod y = 0\),通过 \(\gcd(a, b) = \gcd(a \bmod b, b) = \gcd(a \bmod b, b \bmod (a \bmod b)) = \ldots = \gcd(x, y) = \gcd(0, y) = y\),则我们得出最后的最大公因数为 \(y\)

代码

\(\gcd\)

int gcd(int a,int b)
{
    if(b==0)    return a;
    return gcd(b,a%b);
}

小结

\(\operatorname{lcm}\) ,可以直接用 \(\dfrac{a}{\gcd(a, b)} \times b\) 来完成
这里打好基础,后面的扩展欧几里得算法才能学会
本文到这里就结束了,喜欢的话可以支持一下ヾ(≧▽≦*)o

2025.12.17后记:感觉当时写的一坨……

posted @ 2022-07-27 21:50  yi_fan0305  阅读(768)  评论(0)    收藏  举报