数论知识-最大公约数

· · 个人记录

upd\ in\ 2021.08.14:
  1. 最大公约数的特征 处补充了裴蜀定理的内容

  2. 修正了a \bmod b一类的格式问题。

  3. 将结尾的例题放到了对应内容的位置。

整除性与约数

符号d \mid a(读作“d整除a”)的含义是,存在某个整数k,使得a=kd

任何整数均可整除0

如果a>0d \mid a,那么|d|≤|a|

如果d \mid a,则称ad倍数

如果d不能整除a,则写作d \nmid a

如果d \mid ad≥0,则称da约数

非零整数$a$的约数至少应为$1$,且不会大于$|a|$。 任何正整数$a$都可以被**平凡约数**$1$和其自身$a$整除,整数$a$的**非平凡约数**称为$a$的**因子**。 ## 除法定理 对于任何整数$a$和任何正整数$n$,存在唯一整数$q$和$r$,满足$0≤r<n$且$a=qn+r$。 称$q=\lfloor a/n \rfloor$为除法的**商**,值$r=a \bmod n$为出发的**余数**。 $n \mid a$ 当且仅当$a \bmod \ n=0$。 ## 公约数与最大公约数 如果$d$是$a$的约数并且$d$也是$b$的约数,那么$d$是$a$与$b$的公约数。 $1$是任意两个整数的**公约数**。 公约数的重要性质: $d \mid a$且$d \mid b$蕴含着$d \mid (a+b)$且$d \mid (a-b)

更一般地,对任意整数xy,有:

d \mid a$且$d \mid b$蕴含着$d \mid (ax+by)

如果a \mid b,那么|a|≤|b|,或者b=0,而这说明:

a \mid b$且$b \mid a$蕴含着$a=\pm b

两个不同时为0的整数ab的公约数中最大的称为其最大公约数,记作\gcd(a,b)

定义\gcd(0,0)=0,该定义是使gcd函数的基本性质的等式普遍成立所必不可少的。

最大公约数的基本性质

\gcd(a,b)=\gcd(b,a) \gcd(a,b)=\gcd(-a,b) \gcd(a,b)=\gcd(|a|,|b|) \gcd(a,0)=|a| \gcd(a,ka)=|a|(\forall k \in \mathbb{Z})

最大公约数的特征

如果任意整数ab不都为0,则\gcd(a,b)使ab的线性组合集\{ax+by: x,y \in \mathbb{Z}\}中的最小正元素。

upd\ in\ 2021.8.14:

这个特征和裴蜀定理讲的是一件事情。

裴蜀定理,又称贝祖定理,其内容为:

a,b是不全为0的整数,则存在整数x,y,使得ax+by=\gcd(a,b)

只不过特征里没有提到,\gcd(a,b)是线性组合集里最小的正元素。

这里有一道裴蜀定理的练习题:

LuoguP4549 【模板】裴蜀定理

推论1

对任意整数ab,如果d \mid ad \mid b,则d \mid \gcd(a,b)

(由\gcd(a,b)=ax+by显然得证)

推论2

对所有整数ab以及任意非负整数n,有

\gcd(an,bn)=n \gcd(a,b) \gcd(an,bn)=anx+bny=n(ax+by)=n\gcd(a,b) 下面这道题目用到了这个推论: [NOIP2009提高组 Hankson的趣味题](https://www.luogu.com.cn/problem/P1072) 题目解答笔记: [Hankson的趣味题_笔记](https://www.luogu.com.cn/blog/60994/xhyu61-13-noip2009TGT2) #### 推论3 对于任意正整数$n,a,b$,如果$n \mid ab$且$\gcd(a,n)=1$,则$n \mid b$。 感性理解很容易,如果$ab$这个数拆成了$a×b$的形式,$n$不能将$a$整除,那就只能将$b$整除了。 一个草率且不一定正确的证明如下: 由$n \mid ab$,设$ab=kn$。 $$\gcd(a,n)=\gcd(\frac{kn}{b},n)=n\gcd(\frac{k}{b},1)=1$$ $$n\gcd(k,b)=b$$ $$\gcd(k,b)=\frac{b}{n}$$ 而$\gcd(k,b) \in \mathbb{Z}$,故得$n \mid b$。 ## 互质数 如果两个整数$a$与$b$只有公约数$1$,即$\gcd(a,b)=1$,则$a$和$b$称为互质数。 ### 定理 对任意整数$a,b,p$,如果$\gcd(a,p)=1$且$\gcd(b,p)=1$,则$\gcd(ab,p)=1$。 证明: 由定理得 $$ax+py=1$$ $$bx'+py'=1$$ 等式两边分别相乘,整理得 $$ab(xx')+p(ybx'+y'ax+pyy')=1$$ 而$1$是$ab$与$p$的一个正线性组合,所以根据最大公约数的特征,得到$\gcd(ab,p)=1$。 ~~暴力证明法~~ ## GCD递归定理 对任意非负整数$a$和任意正整数$b$: $$\gcd(a,b)=\gcd(b,a\bmod \ b)$$ ## 欧几里得算法 欧几里得算法是通过$GCD$递归定理计算两个非负整数的最大公约数的算法。 其实就是高中数学里面学习的辗转相除法。 代码如下: ```cpp int EUCLID(int a, int b) { return (!b) ? a : gcd(b, a % b); } ``` ### 欧几里得算法的运行时间 首先介绍斐波那契数列$F_k$: $$ F_k = \begin{cases} 0 \qquad & k = 0 \\ 1 \qquad & k = 1 \\ F_{k-1}+F_{k-2} & k>1 \end{cases} $$ #### 引理 如果$a>b≥1$并且$EUCLID(a,b)$执行了$k≥1$次递归调用,则$a≥F_{k+2},b≥F_{k+1}$。 ~~(好像平时也不会用这个引理)~~ #### Lamé定理 对任意整数$k≥1$,如果$a>b≥1$,且$b<F_{k+1}$,则$EUCLID(a,b)$的递归调用次数少于$k$次。 已知$\phi=\frac{1+\sqrt{5}}{2}$,即黄金分割率。 $F_k$约为$\frac{\phi^k}{\sqrt{5}}$,所以$EUCLID$执行中递归调用次数为$O(lg \ b)$。 将这个界限改进,可以改进到至多执行 $$1+\log_{\phi}{(b/\gcd(a,b))}$$ 次递归调用。 ## 扩展欧几里得算法 在欧几里得算法中,我们只能输入两个非负整数,输出这两个数的最大公约数。 但现在我们有了新的需求:想知道满足下列条件的整系数$x$和$y$: $$d=\gcd(a,b)=ax+by$$ 这里的$x$和$y$可能为$0$或负数。 我们对$EXTENDED-EUCLID$输入一对非负整数,其返回一个满足上面式子的一个三元组$(d,x,y)$。 代码如下: ```cpp int EXTENDED_EUCLID(int a, int b, int &x, int &y) { if (!b) { x = 1; y = 0; return a; } else { int ret = EXTENDED_EUCLID(b, a % b, y, x); y -= a / b * x; return ret; } } ``` ### 过程分析 我们发现,扩展欧几里得中$a$和$b$的作用依旧是在计算最大公约数,和欧几里得算法的区别仅在于$x$和$y$的计算。 首先分析,当$b=0$时,在欧几里得算法当中,我们直接返回$a$。在这里,我们注意到,根据最大公约数的性质,我们有 $$\gcd(a,0)=a=a×x+0×y$$ 显然,这里$x=1$,至于$y=0$,一个感性理解就是,我们所求的最大公约数是$ax+by$集合的最小数,而当我们返回的时候,其实是返回一个三元组$(d,x,y)$,那么返回之后,为了使$ax+by$是个最小的元素,那么令$y=0$。 ~~纯粹瞎编~~ 当递归回上一层之后,我们设返回过来的三元组为$(d',x',y')$,其中 $$ d'=\gcd(b,a \bmod\ b)=bx'+(a\bmod\ b)y' $$ 根据取模的性质,有 $$ a\bmod\ b = a-b\lfloor a/b \rfloor $$ 故 $$ d'=bx'+(a\bmod\ b)y'=bx'+(a-b\lfloor a/b \rfloor)y' $$ 整理得 $$ d'=ay'+b(x'-\lfloor a/b \rfloor y') $$ 因此,只需要选择$x=y'$和$y=x'-\lfloor a/b \rfloor y'$时,就可以满足等式$d=ax+by$。 从而证明了扩展欧几里得算法的算法的正确性。 ### 递归调用次数 我们发现,在计算最大公约数的部分,扩展欧几里得算法和欧几里得算法的过程完全一样,所以,欧几里得算法和扩展欧几里得算法的时间也相同,两者相差不会超过一个常数因子,所以扩展欧几里得算法的递归调用次数也是$O(log \ b)$。