8.2 最大公约数、欧几里得算法与贝祖等式
第 8.1 节用素因数描述每个正整数。如果两个数已经完成分解,共同的素因数就能揭示它们的公因数。不过,因数分解往往比我们真正需要的工作多得多。
本节将建立一种递归方法:不断把一对数替换为规模更小的余数对,同时保持全部公因数不变。
设整数 a,b 不同时为零。如果整数 d 满足
d∣a且d∣b, 就称 d 为 a 与 b 的。
a 与 b 的记作
gcd(a,b), 它是同时整除两个数的最大正整数。
例如,84 的正因数为
1,2,3,4,6,7,12,14,21,28,42,84, 30 的正因数为
1,2,3,5,6,10,15,30. 两者的正公因数是 1,2,3,6,所以
gcd(84,30)=6. 交换输入顺序不会改变结果:
gcd(a,b)=gcd(b,a). 当 a=0 时,
gcd(a,0)=∣a∣, 因为 a 的每个因数都整除 0,而 a 的最大正因数是 ∣a∣。
假设
84=22⋅3⋅7 以及
30=2⋅3⋅5. 公因数只能使用两边都出现的素数,并且每个共同素数最多使用两边较小的指数。因此
gcd(84,30)=2min(2,1)3min(1,1)=2⋅3=6. 这种方法有助于理解,但前提是先分解两个输入。欧几里得算法不需要这个前提。
设 a∈Z,b 为正整数。说明,存在唯一的整数 q,r,使得
a=bq+r,0≤r<b. 其中:
- 条件 0≤r<b 保证余数具有唯一性。
例如,
252=2⋅105+42. 因此 252 除以 105 的商为 q=2,余数为 r=42。
余数可记作
252mod105=42. 这里的“mod”表示取余运算。第 8.3 节会用同一思想定义同余类。
若
则
gcd(a,b)=gcd(b,r). 为什么公因数没有变化?
先假设 d 同时整除 a 与 b。由
以及第 8.1 节的整数线性组合规则,可得 d∣r。所以 a,b 的每个公因数也是 b,r 的公因数。
反过来,假设 d 同时整除 b 与 r。因为
所以 d∣a。因此 b,r 的每个公因数也是 a,b 的公因数。
两对数拥有完全相同的公因数,所以最大正公因数也相同。
这条等式是一个:数对不断变化,但它的最大公约数保持不变。
要计算正整数 a≥b 的 gcd(a,b):
1. 用 b 除 a,得到 a=bq+r;
2. 把数对 (a,b) 替换为 (b,r);
3. 重复以上过程,直到余数为 0;
4. 返回最后一个非零余数。
例子:gcd(252,105)
25210542=2⋅105+42,=2⋅42+21,=2⋅21+0. 对应的不变量链为
gcd(252,105)=gcd(105,42)=gcd(42,21)=gcd(21,0)=21. 因此
gcd(252,105)=21. 每个非零余数都满足
所以数对的第二个分量会形成严格递减的非负整数序列。它不可能永远递减,最终必定产生余数 0。
这正是第 7 章学习过的良基递归推理。
算法可以递归地写成
gcd(a,b)={∣a∣,gcd(b,amodb),b=0,b=0. 第一行是基础情况,第二行是缩小问题的递归步骤。
让两股整数水流经过余数瀑布。每道闸门先按商分组,再把余数倒入下一条水道,同时携带一组不变的公因数令牌。你可以逐步操作或播放动画,直到最后一条非零水道揭示最大公约数。
对不同时为零的整数 a,b,说明存在整数 x,y,使得
gcd(a,b)=ax+by. x,y 叫作,它们通常并不唯一。
普通欧几里得算法求出最大公约数;再沿余数等式反向回代,找出这些系数。
正向计算得到的等式是
252=2⋅105+42 以及
105=2⋅42+21. 先用第二条等式表示最后一个非零余数:
21=105−2⋅42. 再用第一条等式表示 42:
42=252−2⋅105. 把 42 的表达式代回:
21=105−2(252−2⋅105)=105−2⋅252+4⋅105=−2⋅252+5⋅105. 所以一组贝祖系数是
x=−2,qquady=5. 直接检查:
252(−2)+105(5)=−504+525=21. 还可以把每个余数都表示成原始数对的线性组合。
等式
252=1⋅252+0⋅105 对应系数向量 (1,0);等式
105=0⋅252+1⋅105 对应 (0,1)。
当余数通过
产生时,系数向量也执行同一种减法:
vr=va−qvb. 在当前例子中,
v42=(1,0)−2(0,1)=(1,−2), 接着
v21=(0,1)−2(1,−2)=(−2,5). 最终向量直接给出了贝祖系数。
最大公约数整除 a 与 b,所以它也整除每个整数线性组合 ax+by。贝祖等式又说明最大公约数本身就是这样的组合。
因此方程
有整数解,当且仅当
gcd(a,b)∣c. 例如,
252x+105y=42 有整数解,因为 21∣42。把贝祖等式乘以 2 就得到一组解:
42=252(−4)+105(10). 但 252x+105y=10 没有整数解,因为 21∤10。
沿系数向量换轨场反向穿过欧几里得轨迹。每个路口都要选择按商加权的正确减法,才能重建上一个余数;错误代入会让最终恒等式断裂,正确路线则会产出可直接检查的贝祖系数。
欧几里得算法在严格缩小余数的同时保持最大公约数不变;反向展开同一批等式,就能把最大公约数表示为原始输入的整数线性组合。
贝祖系数不仅能求解线性方程。当 gcd(a,n)=1 时,等式 ax+ny=1 中的一个系数会成为 a 在模 n 下的乘法逆元。第 8.3 节将建立这个模运算视角,再用中国剩余定理合并多条余数条件。