整除性与最大公因数
1 基本概念
设 m , n m,n m,n是整数, m ≠ 0 m\ne 0 m=0。 m m m整除 n n n指: n n n是 m m m的倍数,即存在整数 k k k使得 n = k m n=km n=km。整除 n n n的数称为 n n n的因数。
对于两个已知整数,它们的公因数指:可以整除它们两个的数。
两个整数 a , b a,b a,b(不全为0)的最大公因数是整除它们两个的最大数,记为 g c d ( a , b ) gcd(a,b) gcd(a,b)。如果 g c d ( a , b ) = 1 gcd(a,b)=1 gcd(a,b)=1,则称 a a a与 b b b互素。
最大公因数是一个很重要的量,经常在数论中见到。
2 一些求最大公因数的方法
-
因数分解,例如求:
g c d ( 225 , 120 ) = 15 gcd(225,120)=15 gcd(225,120)=15
通过因数分解 225 = 3 2 ∗ 5 2 225=3^2*5^2 225=32∗52, 120 = 2 3 ∗ 3 ∗ 5 120=2^3*3*5 120=23∗3∗5可以验证答案是正确的。 -
打表,我们可以把 a , b a, b a,b的所有公因数都找出来,然后找出同时出现在两个表中的最大数
3 欧几里得算法
欧几里得算法是求两个数最大公因数的最有效方法,算法由直到余数为0的一系列带余除法组成的。
3.1 一个例子
计算:
g
c
d
(
36
,
132
)
gcd(36, 132)
gcd(36,132)
第一步:
132
=
3
∗
36
+
24
132=3*36+24
132=3∗36+24
第二步取
36
36
36,用前一步的余数
24
24
24除
36
36
36得:
36
=
1
∗
24
+
12
36=1*24+12
36=1∗24+12
下一步同理:
24
=
2
∗
12
+
0
24=2*12+0
24=2∗12+0
欧几里得算法说明当得到余数0时,则前一步的余数就是最初两个数的最大公因数。因此
g
c
d
(
36
,
163
)
=
12
gcd(36, 163)=12
gcd(36,163)=12。
3.2 形式化地表示
欧几里得算法可以用下式来形式化地表示:
A
=
B
∗
Q
+
R
A=B*Q+R
A=B∗Q+R
每一步用
B
,
R
B,R
B,R替换原来的
A
,
B
A,B
A,B,重复此过程知道得到余数0为止。
对于一般情形给出
a
,
b
a,b
a,b有:
a
=
q
1
∗
b
+
r
1
b
=
q
2
∗
r
1
+
r
2
r
1
=
q
3
∗
r
2
+
r
3
r
2
=
q
4
∗
r
3
+
r
4
⋯
⋯
r
n
−
3
=
q
n
−
1
∗
r
n
−
2
+
r
n
−
1
r
n
−
2
=
q
n
∗
r
n
−
1
+
r
n
r
n
−
1
=
q
n
+
1
∗
r
n
+
0
\begin{aligned} &a=q_1*b+r_1\\ &b=q_2*r_1+r_2\\ &r_1=q_3*r_2+r_3\\ &r_2=q_4*r_3+r_4\\ &\cdots \cdots \\ &r_{n-3}=q_{n-1}*r_{n-2}+r_{n-1}\\ &r_{n-2}=q_{n}*r_{n-1}+r_{n}\\ &r_{n-1}=q_{n+1}*r_{n}+0\\ \end{aligned}
a=q1∗b+r1b=q2∗r1+r2r1=q3∗r2+r3r2=q4∗r3+r4⋯⋯rn−3=qn−1∗rn−2+rn−1rn−2=qn∗rn−1+rnrn−1=qn+1∗rn+0
如果我们令
a
=
r
−
1
,
b
=
r
0
a=r_{-1},b=r_0
a=r−1,b=r0则上述的每一行都形如为:
r
i
−
1
=
q
i
+
1
∗
r
i
+
r
i
+
1
r_{i-1} = q_{i+1}*r_i+r_{i+1}
ri−1=qi+1∗ri+ri+1
r n r_n rn就是 a , b a,b a,b的最大公因数
3.3 证明
首先证明: r n r_n rn是 a , b a,b a,b的公因数。自底向上分析。最后一行 r n − 1 = q n + 1 ∗ r n r_{n-1}=q_{n+1}*r_{n} rn−1=qn+1∗rn说明 r n r_n rn整除 r n − 1 r_{n-1} rn−1,同理倒数第二行 r n − 2 = q n ∗ r n − 1 + r n r_{n-2}=q_{n}*r_{n-1}+r_{n} rn−2=qn∗rn−1+rn表明 r n r_{n} rn整除 r n − 2 r_{n-2} rn−2,再往上依旧成立,直到第 1 , 2 1,2 1,2行可以得到 r n r_n rn整除 a a a和 b b b,故 r n r_n rn是 a , b a,b a,b的公因数得证。
再证明: r n r_n rn是 a , b a,b a,b的最大公因数。设 d d d是 a , b a,b a,b的任意公因数。自顶向下分析,我们从第一个等式 a = q 1 ∗ b + r 1 a=q_1*b+r_1 a=q1∗b+r1出发,由于 d d d整除 a a a和 b b b,可知 d d d整除 r 1 r_1 r1,到第二行式子 b = q 2 ∗ r 1 + r 2 b=q_2*r_1+r_2 b=q2∗r1+r2,由于 d d d整除 b b b和 r 1 r_1 r1,可知 d d d整除 r 2 r_2 r2。再往下也是同理,对于每一步, d d d整除前两个余数 r i r_i ri和 r i − 1 r_{i-1} ri−1。最后我们能够得到 d d d整除 r n r_n rn的结论。既然 a , b a,b a,b的任意公因数 d d d都整除 r n r_n rn, r n r_n rn也是 a , b a,b a,b的公因数。那么 r n r_n rn一定是 a a a与 b b b的最大公因数。
3.4 定理(欧几里得算法)
要计算两个整数
a
a
a与
b
b
b的最大公因数,先令
r
−
1
=
a
r_{-1}=a
r−1=a且
r
0
=
b
r_0=b
r0=b,然后计算相继的商和余数:
r
i
−
1
=
q
i
+
1
∗
r
i
+
r
i
+
1
(
i
=
0
,
1
,
2
,
⋯
)
r_{i-1} = q_{i+1}*r_i+r_{i+1}\ \ \ \ (i=0,1,2,\cdots)
ri−1=qi+1∗ri+ri+1 (i=0,1,2,⋯)
直到某余数
r
n
+
1
r_{n+1}
rn+1为
0
0
0。最后的非零余数
r
n
r_n
rn就是
a
,
b
a,b
a,b的最大公因数。
4 算法实现
python实现 g c d gcd gcd并计算 g c d ( 316258250 , 1160718174 ) gcd(316258250, 1160718174) gcd(316258250,1160718174)
def gcd(a, b):
while a % b:
a, b = b, a % b
return b
print(gcd(316258250, 1160718174))
递归实现
def gcd(a, b):
if not b:
return a
return gcd(b, a % b)
print(gcd(316258250, 1160718174))
结果:
1078
5 参考资料
[1] 《数论概论》P19-P22