Loading

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

前言

终于开始正式写数论了,之前的快速幂和进制转化不算,莫名有些激动。
废话不多说,我们直接

进入正题!

定义

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

公式

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

半路杀出的唯一分解定理

看着很难,其实很好理解
就是一个正整数都可以拆成 \(a_1^{k1} \times a_2^{k2} \times a_3^{k3} \times a_4^{k4} \ldots\) 的形式,有且仅有这一种形式
其中 \(a_1, a_2 \ldots\) 都是质数,\(k1, k2 \ldots\) 都是指数
说白了就是质因数分解
比如说 \(252=2^3+3^2+7^1\)
在这里,如果一个数 \(a\) 是另一个数 \(b\) 的因数,\(a \ne b\),那么 \(a\) 分解质因数所得的 \(k1\) , \(k2\) 都小于等于 \(b\) 所对应的 \(k1\) , \(k2\)
比如 \(84\)\(252\) 的因数
\(84=2^2+3^1+7^1\)
很显然,是符合我们上面的结论的
同理,如果一个数 \(a\) 是另一个数 \(b\) 的倍数,\(a \ne b\),那么 \(a\) 分解质因数所得的 \(k1\) , \(k2\) 都大于等于 \(b\) 所对应的 \(k1\) , \(k2\)
比如 \(252\)\(84\) 的倍数

\[84=2^2+3^1+7^1\\ 252=2^3+3^2+7^1 \]

很显然,也是符合的
如果

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

一个数 \(c=d_1^{g1}+d_2^{g2}+d_3^{g3}+d_4^{g4}\ldots\)\(a\)\(b\) 的公因数
由上面的结论可得 \(g_i \le \min(k_i,j_i)\)
如果要求 \(\gcd(a,b)\)
那么 \(\gcd(a, b) = d_1^{\min(k1, j1)} + d_2^{\min(k2, j2)} + d_3^{\min(k3, j3)} + d_4^{\min(k4,j4)} \ldots\)
同理,一个数 \(c=d_1^{g1}+d_2^{g2}+d_3^{g3}+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)}+d_2^{\max(k2,j2)}+d_3^{\max(k3,j3)}+d_4^{\max(k4,j4)} \ldots\)
所以 \(\gcd(a,b) \times \operatorname{lcm}(a,b)=d_1^{\max(k1,j1)+\min(k1,j1)}+d_2^{\max(k2,j2)+\min(k2,j2)}+d_3^{\max(k3,j3)+\min(k3,j3)}+d_4^{\max(k4,j4)+\min(k4,j4)}\ldots\)
也就是 \(\gcd(a,b) \times \operatorname{lcm}(a,b)=d_1^{k1+j1}+d_2^{k2+j2}+d_3^{k3+j3}+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\)
也就是说 \(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,b) = \gcd(a \bmod b)\) ,但为了方便递归,我们将参数换一下,改为 \(\gcd(b,a \bmod b)\)

代码

\(\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

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