对任意
以下选定
记这族整数的最小公倍数为
记这族整数的最大公因数为
若
对于任意整数
证明
这是
至于唯一性,设
根据上述命题中的唯一性,带余除法中的余数
设
此时存在唯一的
上述两个性质是说
证明
至于
对给定的
按照惯例,极端情形
设
作为推论,
证明 不妨设
这就足以表明
基于上述结果,
若
证明 由于
求正整数
不妨设
这引出如下递归算法:
一言以蔽之,从
此算法称为辗转相除法,也称欧几里得算法。
用辗转相除法计算
从第三项开始,每一项都是前两项相除的余数;这样反复做带余除法,直到余数为
前一次的除数是下一次的被除数,而余数(可视为被除数的“残留”)是一下次的除数;被除数与除数前后角色翻转,此即“辗转”之义。
int gcd(int a, int b) {
return b == 0 ? a : gcd(a, a % b);
}
设
用辗转相除法计算
对每个
设
证明
设
证明:假设一共做了
我们有
根据上一页的命题,我们有
分别看
若
也就是有
若
也就是有
求正整数
对任意正整数
证明 设
令
设
因为
设
根据 Bézout's identity,
设
其中
证明:先证充分性。
令
所以
再证必要性。
设
设
于是可见
也就是说,存在整数
若
设
我们用辗转相除法计算
具体的计算方法有两种:一是正推,一是倒推。
用辗转相除法计算
我们可以按
的形式,其中
最后
我们取
将
得
改写成
我们可以取
我们以计算
pair<int,int> extgcd(int a, int b) {
int u = 1, v = 0;
while (b != 0) {
int q = a % b;
a -= q * b;
u -= q * v;
swap(a, b);
swap(u, v);
}
return {a, u};
}
extgcd(a, b) 返回的两个整数依次是
用辗转相除法计算
我们可以按
的形式,其中
最后,
将
改写成
将此式与
我们以计算
int extgcd(int a, int b, int& x, int& y) {
if (b == 0) {
x = 1;
y = 0;
return a;
}
int q = a % b;
int g = extgcd(b, a - q * b, y, x);
y -= x * q;
return g;
}
正推和倒推给出的
设
a == (a / b) * b + (a % b) 总是成立。设 extgcd(a, b, x, y) 给出的
证明:用归纳法。
当 extgcd(a, b, x, y) 给出
当 a / b。根据归纳假设,递归调用 extgcd(b, a % b, y, x) 给出的
和
注意到
此方程有解当且仅当
具体的,如果
如果
在计算时需要注意
我们可以这样做
设
设
整数
设
求方程组
整数
所以这样的
其中
注意到
设
任何非零整数
其中
证明
唯一性仍可简化到
由于
再次应用欧几里得引理可见
对于任何素数
考虑正整数
对于任意多个正整数的
素数列
存在无穷多个素数。
证明
则
这样对齐会导致 \implies 左边的空格较小,不是正确的对齐方式。
首先我们写出 $$ \begin{align} \gcd(a, b) &= x_i r_i + y_i r_{i+1} \label{eq} \tag{1} \\ \gcd(a, b) &= x_{i-1} r_{i-1} + y_{i-1} r_i \label{eq2} \tag{2} \end{align} $$