求 greatest common divisor 不需要列出所有 divisors。关键是把一对整数换成更小、但 common divisors 完全相同的一对,再重复这个过程。
Greatest common divisors
设 a , b ∈ Z a,b\in\mathbb Z a , b ∈ Z ,并且两者不同时为零。它们的 greatest common divisor 记作 gcd ( a , b ) \gcd(a,b) g cd( a , b ) ,是同时整除 a a a 与 b b b 的最大正整数。等价地,d = gcd ( a , b ) d=\gcd(a,b) d = g cd( a , b ) 表示
d > 0 , d ∣ a , d ∣ b , c ∣ a and c ∣ b ⟹ ∣ c ∣ ≤ d . \boxed{
d>0,\qquad d\mid a,\qquad d\mid b,
\qquad
c\mid a\text{ and }c\mid b\Longrightarrow |c|\le d.
}
d > 0 , d ∣ a , d ∣ b , c ∣ a and c ∣ b ⟹ ∣ c ∣ ≤ d .
最后一个条件中的 absolute value 也涵盖了负的 common divisors。特别地,当 a ≠ 0 a\ne0 a = 0 时,
gcd ( a , 0 ) = ∣ a ∣ . \gcd(a,0)=|a|.
g cd( a , 0 ) = ∣ a ∣.
这里排除 ( 0 , 0 ) (0,0) ( 0 , 0 ) ,因为每个非零整数都能整除这两个数,所以不存在最大的正 common divisor。
例如,16 16 16 与 24 24 24 的正 common divisors 是 1 , 2 , 4 , 8 1,2,4,8 1 , 2 , 4 , 8 ,因此
gcd ( 16 , 24 ) = 8. \gcd(16,24)=8.
g cd( 16 , 24 ) = 8.
为什么列出 divisors 的方法很慢
对正整数 n n n ,直接做法会测试直到 n \sqrt n n 为止的候选 divisors。找到不超过这个位置的 divisor 后,还能得到与它配对的 divisor n / d n/d n / d ,所以大于 n \sqrt n n 的 divisors 也不会漏掉。若 n n n 的二进制输入长度是 L L L ,那么 L ≈ log 2 n L\approx\log_2 n L ≈ log 2 n ,而 trial divisions 的数量大约是
n = 2 1 2 log 2 n ≈ ( 2 ) L . \sqrt n=2^{\frac12\log_2 n}\approx(\sqrt2)^L.
n = 2 2 1 l o g 2 n ≈ ( 2 ) L .
这相对于输入位数是 exponential complexity。Euclid's algorithm 不需要进行这种 divisor search。
Division algorithm
对任意 a , b ∈ Z a,b\in\mathbb Z a , b ∈ Z ,若 b ≠ 0 b\ne0 b = 0 ,则存在唯一 整数 q q q 和 r r r ,使得
a = q b + r , 0 ≤ r < ∣ b ∣ . \boxed{a=qb+r,
\qquad 0\le r<|b|.}
a = q b + r , 0 ≤ r < ∣ b ∣.
整数 q q q 称为 quotient ,r r r 称为 remainder 。Remainder condition 是 theorem 的一部分;若去掉它,会有许多不同的商和余数组合(quotient–remainder pairs)满足 a = q b + r a=qb+r a = q b + r 。
Existence
先设 b > 0 b>0 b > 0 。若 a ≥ b a\ge b a ≥ b ,long division,或重复减去 b b b ,会得到符合范围要求的 quotient 与 remainder。若 a < b a<b a < b ,选择足够大的非负整数 k k k ,使 a + k b ≥ b a+kb\ge b a + kb ≥ b 。对 a + k b a+kb a + kb 使用前一种情况:
a + k b = q ′ b + r , 0 ≤ r < b . a+kb=q'b+r,
\qquad 0\le r<b.
a + kb = q ′ b + r , 0 ≤ r < b .
两边减去 k b kb kb ,得到 a = ( q ′ − k ) b + r a=(q'-k)b+r a = ( q ′ − k ) b + r 。若 b < 0 b<0 b < 0 ,先对正数 − b -b − b 使用前面的结论,再把 q ′ ( − b ) q'(-b) q ′ ( − b ) 改写为 ( − q ′ ) b (-q')b ( − q ′ ) b 。这样就覆盖了所有非零整数 b b b 。
Negative-dividend 例子
Quotient 可以是负数。取 a = − 5 a=-5 a = − 5 、b = 3 b=3 b = 3 ,则
− 5 = 3 ( − 2 ) + 1 , 0 ≤ 1 < 3. -5=3(-2)+1,
\qquad 0\le1<3.
− 5 = 3 ( − 2 ) + 1 , 0 ≤ 1 < 3.
因此 quotient 是 − 2 -2 − 2 ,remainder 是 1 1 1 。
Uniqueness proof
假设有两组 quotient–remainder pairs 都满足 theorem:
a = q 1 b + r 1 , 0 ≤ r 1 < ∣ b ∣ , a = q 2 b + r 2 , 0 ≤ r 2 < ∣ b ∣ . \begin{aligned}
a&=q_1b+r_1, & 0&\le r_1<|b|,\\
a&=q_2b+r_2, & 0&\le r_2<|b|.
\end{aligned}
a a = q 1 b + r 1 , = q 2 b + r 2 , 0 0 ≤ r 1 < ∣ b ∣ , ≤ r 2 < ∣ b ∣.
把两个等式相减:
0 = ( q 1 − q 2 ) b + ( r 1 − r 2 ) , r 2 − r 1 = ( q 1 − q 2 ) b . 0=(q_1-q_2)b+(r_1-r_2),
\qquad
r_2-r_1=(q_1-q_2)b.
0 = ( q 1 − q 2 ) b + ( r 1 − r 2 ) , r 2 − r 1 = ( q 1 − q 2 ) b .
所以 b ∣ ( r 2 − r 1 ) b\mid(r_2-r_1) b ∣ ( r 2 − r 1 ) 。Remainder bounds 同时给出
− ∣ b ∣ < r 2 − r 1 < ∣ b ∣ . -|b|<r_2-r_1<|b|.
− ∣ b ∣ < r 2 − r 1 < ∣ b ∣.
b b b 的倍数中,严格位于 − ∣ b ∣ -|b| − ∣ b ∣ 与 ∣ b ∣ |b| ∣ b ∣ 之间的只有 0 0 0 。因此 r 2 − r 1 = 0 r_2-r_1=0 r 2 − r 1 = 0 ,从而 r 1 = r 2 r_1=r_2 r 1 = r 2 。回到相减后的等式,再使用 b ≠ 0 b\ne0 b = 0 ,得到
( q 1 − q 2 ) b = 0 ⟹ q 1 = q 2 . (q_1-q_2)b=0
\quad\Longrightarrow\quad
q_1=q_2.
( q 1 − q 2 ) b = 0 ⟹ q 1 = q 2 .
所以 quotient 与 remainder 都是唯一的。
Gcd reduction theorem
设 a , b , q , r ∈ Z a,b,q,r\in\mathbb Z a , b , q , r ∈ Z ,并且 ( a , b ) ≠ ( 0 , 0 ) (a,b)\ne(0,0) ( a , b ) = ( 0 , 0 ) 。若
a = q b + r , a=qb+r,
a = q b + r ,
则
gcd ( a , b ) = gcd ( b , r ) . \boxed{\gcd(a,b)=\gcd(b,r).}
g cd( a , b ) = g cd( b , r ) .
这个 theorem 不仅保持 gcd 的数值不变;两对数的 common divisors 完全相同。
通过 common-divisor sets 证明
定义
C ( u , v ) = { c ∈ Z ∣ c ∣ u and c ∣ v } . C(u,v)=\{c\in\mathbb Z\mid c\mid u\text{ and }c\mid v\}.
C ( u , v ) = { c ∈ Z ∣ c ∣ u and c ∣ v } .
分别证明两个包含关系(set inclusions)。
任取 c ∈ C ( a , b ) c\in C(a,b) c ∈ C ( a , b ) 。于是 c ∣ a c\mid a c ∣ a 且 c ∣ b c\mid b c ∣ b 。既然一个数整除 b b b ,它也整除 q b qb q b ,difference property 给出
c ∣ ( a − q b ) = r . c\mid(a-qb)=r.
c ∣ ( a − q b ) = r .
所以 c c c 同时整除 b b b 与 r r r ,即 c ∈ C ( b , r ) c\in C(b,r) c ∈ C ( b , r ) 。因此 C ( a , b ) ⊆ C ( b , r ) C(a,b)\subseteq C(b,r) C ( a , b ) ⊆ C ( b , r ) 。
反过来,任取 c ∈ C ( b , r ) c\in C(b,r) c ∈ C ( b , r ) 。于是 c ∣ b c\mid b c ∣ b 且 c ∣ r c\mid r c ∣ r ,所以 c c c 整除它们的 integer linear combination
q b + r = a . qb+r=a.
q b + r = a .
因此 c c c 同时整除 a a a 与 b b b ,即 c ∈ C ( a , b ) c\in C(a,b) c ∈ C ( a , b ) 。所以 C ( b , r ) ⊆ C ( a , b ) C(b,r)\subseteq C(a,b) C ( b , r ) ⊆ C ( a , b ) 。
两个包含关系说明
C ( a , b ) = C ( b , r ) , C(a,b)=C(b,r),
C ( a , b ) = C ( b , r ) ,
因此两个集合的最大正元素相同,也就是 gcd ( a , b ) = gcd ( b , r ) \gcd(a,b)=\gcd(b,r) g cd( a , b ) = g cd( b , r ) 。
Euclid's algorithm
对正整数输入,令 r − 2 = a r_{-2}=a r − 2 = a 、r − 1 = b r_{-1}=b r − 1 = b ,再重复使用 division algorithm:
a = q 0 b + r 0 , 0 ≤ r 0 < b , b = q 1 r 0 + r 1 , 0 ≤ r 1 < r 0 , r 0 = q 2 r 1 + r 2 , 0 ≤ r 2 < r 1 , ⋮ \begin{aligned}
a&=q_0b+r_0, & 0&\le r_0<b,\\
b&=q_1r_0+r_1, & 0&\le r_1<r_0,\\
r_0&=q_2r_1+r_2, & 0&\le r_2<r_1,\\
&\hspace{2.5em}\vdots
\end{aligned}
a b r 0 = q 0 b + r 0 , = q 1 r 0 + r 1 , = q 2 r 1 + r 2 , ⋮ 0 0 0 ≤ r 0 < b , ≤ r 1 < r 0 , ≤ r 2 < r 1 ,
每一步都保持 gcd 不变。令 m m m 是第一个满足 r m = 0 r_m=0 r m = 0 的下标,此时停止,并返回正 divisor r m − 1 r_{m-1} r m − 1 。若第一次 division 的 remainder 已经是零,就返回 r − 1 = b r_{-1}=b r − 1 = b 。
为什么 algorithm 一定终止
每个非零 remainder 都是 nonnegative integer,并且严格小于前一个正 divisor。若第一个 remainder 不是零,这些正 remainders 会形成 strictly decreasing sequence。这样的 sequence 不可能无限延续,所以最终一定出现零 remainder。
若 r m = 0 r_m=0 r m = 0 是第一个零 remainder,则最后一次 division 的正 divisor 是 r m − 1 r_{m-1} r m − 1 。重复使用 reduction theorem 得到
gcd ( a , b ) = gcd ( r − 2 , r − 1 ) = ⋯ = gcd ( r m − 2 , r m − 1 ) = r m − 1 . \gcd(a,b)=\gcd(r_{-2},r_{-1})=\cdots=\gcd(r_{m-2},r_{m-1})=r_{m-1}.
g cd( a , b ) = g cd( r − 2 , r − 1 ) = ⋯ = g cd( r m − 2 , r m − 1 ) = r m − 1 .
例:gcd ( 35 , 21 ) \gcd(35,21) g cd( 35 , 21 )
35 = 1 ( 21 ) + 14 , 21 = 1 ( 14 ) + 7 , 14 = 2 ( 7 ) + 0. \begin{aligned}
35&=1(21)+14,\\
21&=1(14)+7,\\
14&=2(7)+0.
\end{aligned}
35 21 14 = 1 ( 21 ) + 14 , = 1 ( 14 ) + 7 , = 2 ( 7 ) + 0.
最后一个非零 remainder 是 7 7 7 ,所以
gcd ( 35 , 21 ) = 7. \gcd(35,21)=7.
g cd( 35 , 21 ) = 7.
Bézout's identity
设 a , b ∈ Z a,b\in\mathbb Z a , b ∈ Z 不同时为零,并令 d = gcd ( a , b ) d=\gcd(a,b) d = g cd( a , b ) 。Bézout's identity 说明存在整数 s s s 、t t t ,使得
d = s a + t b . \boxed{d=sa+tb.}
d = s a + t b .
s s s 与 t t t 称为 Bézout coefficients 。它们不一定为正,也不一定唯一。
为什么 back-substitution 有效
每个 Euclidean step 都可以改写为
r i = r i − 2 − q i r i − 1 . r_i=r_{i-2}-q_i r_{i-1}.
r i = r i − 2 − q i r i − 1 .
起始值 r − 2 = a r_{-2}=a r − 2 = a 与 r − 1 = b r_{-1}=b r − 1 = b 本来就是 a a a 与 b b b 的 integer linear combinations。上面的等式通过 induction 说明,每个后续 remainder 也都是 a a a 与 b b b 的 integer linear combination。第一个零 remainder 前面的 divisor 等于 d d d ,所以反向代入 Euclidean steps 就能把 d d d 写成 s a + t b sa+tb s a + t b 。
输入中有零的情况可以直接处理。若 b = 0 b=0 b = 0 ,则 d = ∣ a ∣ d=|a| d = ∣ a ∣ :可以取 s = 1 , t = 0 s=1,t=0 s = 1 , t = 0 (当 a > 0 a>0 a > 0 ),或取 s = − 1 , t = 0 s=-1,t=0 s = − 1 , t = 0 (当 a < 0 a<0 a < 0 )。若 a = 0 a=0 a = 0 ,可以取 s = 0 , t = 1 s=0,t=1 s = 0 , t = 1 (当 b > 0 b>0 b > 0 ),或取 s = 0 , t = − 1 s=0,t=-1 s = 0 , t = − 1 (当 b < 0 b<0 b < 0 )。两个输入都非零时,对 ∣ a ∣ |a| ∣ a ∣ 与 ∣ b ∣ |b| ∣ b ∣ 使用正整数情形;若原输入为负,再改变对应 coefficient 的符号。这样就证明了所有不同时为零的整数输入。
对前面的较小例子,
7 = 21 − 14 = 21 − ( 35 − 21 ) = − 35 + 2 ( 21 ) . 7=21-14=21-(35-21)=-35+2(21).
7 = 21 − 14 = 21 − ( 35 − 21 ) = − 35 + 2 ( 21 ) .
因此 35 35 35 与 21 21 21 的一组 Bézout coefficients 是 s = − 1 s=-1 s = − 1 、t = 2 t=2 t = 2 。
Extended example:gcd ( 515 , 42 ) \gcd(515,42) g cd( 515 , 42 )
先运行 Euclid's algorithm:
515 = 12 ( 42 ) + 11 , 42 = 3 ( 11 ) + 9 , 11 = 1 ( 9 ) + 2 , 9 = 4 ( 2 ) + 1 , 2 = 2 ( 1 ) + 0. \begin{aligned}
515&=12(42)+11,\\
42&=3(11)+9,\\
11&=1(9)+2,\\
9&=4(2)+1,\\
2&=2(1)+0.
\end{aligned}
515 42 11 9 2 = 12 ( 42 ) + 11 , = 3 ( 11 ) + 9 , = 1 ( 9 ) + 2 , = 4 ( 2 ) + 1 , = 2 ( 1 ) + 0.
最后一个非零 remainder 是 1 1 1 ,所以 gcd ( 515 , 42 ) = 1 \gcd(515,42)=1 g cd( 515 , 42 ) = 1 。接着进行回代(back-substitution):
1 = 9 − 4 ( 2 ) = 9 − 4 ( 11 − 9 ) = 5 ( 9 ) − 4 ( 11 ) = 5 ( 42 − 3 ( 11 ) ) − 4 ( 11 ) = 5 ( 42 ) − 19 ( 11 ) = 5 ( 42 ) − 19 ( 515 − 12 ( 42 ) ) = 233 ( 42 ) − 19 ( 515 ) . \begin{aligned}
1
&=9-4(2)\\
&=9-4(11-9)\\
&=5(9)-4(11)\\
&=5(42-3(11))-4(11)\\
&=5(42)-19(11)\\
&=5(42)-19(515-12(42))\\
&=233(42)-19(515).
\end{aligned}
1 = 9 − 4 ( 2 ) = 9 − 4 ( 11 − 9 ) = 5 ( 9 ) − 4 ( 11 ) = 5 ( 42 − 3 ( 11 )) − 4 ( 11 ) = 5 ( 42 ) − 19 ( 11 ) = 5 ( 42 ) − 19 ( 515 − 12 ( 42 )) = 233 ( 42 ) − 19 ( 515 ) .
因此,
1 = − 19 ( 515 ) + 233 ( 42 ) . \boxed{1=-19(515)+233(42).}
1 = − 19 ( 515 ) + 233 ( 42 ) .
这同时验证了 gcd,并给出 Bézout coefficients s = − 19 s=-19 s = − 19 与 t = 233 t=233 t = 233 。