摘要:本文证明了辗转相除法求最大公约数的合理性,并且给出了一种根据辗转相除法求出最大公约数后求最小公倍数的方法及其证明。
0. 符号规定
g c d ( a , b ) — — — — — — — — — — — — a 和 b 的 最 大 公 约 数 gcd(a,b)————————————a和b的最大公约数 gcd(a,b)————————————a和b的最大公约数
a ( m o d ) b — — — — — — — — — — — — a 除 b 的 余 数 a (mod) b————————————a除b的余数 a(mod)b————————————a除b的余数
( a , b ) — — — — — — — — — — — — a 和 b 的 最 大 公 约 数 (a,b)————————————a和b的最大公约数 (a,b)————————————a和b的最大公约数
[ a , b ] — — — — — — — — — — — — a 和 b 的 最 小 公 倍 数 [a,b]————————————a和b的最小公倍数 [a,b]————————————a和b的最小公倍数
1.最大公约数——辗转相除法
辗转相除法是一个求解a和b的最大公约数的算法,这个算法的每一步过程都是先计算 a % b a\%b a%b,如果 a % b = = 0 a\%b==0 a%b==0,那么最大公约数就是a,否则令 a = b , b = a % b a=b,b=a\%b a=b,b=a%b,然后重复第一步。
这个算法的合理性基于以下定理:a和b的最大公约数等于b和
a
%
b
a\%b
a%b的最大公约数,当
a
%
b
=
0
a\%b=0
a%b=0时,b和0的最大公约数就是b,
g
c
d
(
b
,
0
)
=
0
gcd(b,0)= 0
gcd(b,0)=0,(因为
0
=
0
∗
b
,
b
=
1
∗
b
0 = 0*b,b = 1*b
0=0∗b,b=1∗b).
所以这个算法依赖的定理的数学表达形式就是:
g
c
d
(
a
,
b
)
=
g
c
d
(
b
,
a
(
m
o
d
)
b
)
gcd(a,b)=gcd(b,a(mod)b)
gcd(a,b)=gcd(b,a(mod)b)
正是有了这个定理,我们求解a和b的最大公约数就等价于求解b和
a
%
b
a\%b
a%b的最大公约数,然后可以反复递归,直到
a
a%b==0
a时,因为
0
=
0
∗
b
,
b
=
b
∗
1
0 = 0 * b, b = b * 1
0=0∗b,b=b∗1,所以
g
c
d
(
b
,
0
)
=
b
gcd(b,0) = b
gcd(b,0)=b,b就是此时a和b的最大公约数,根据定理,此时的b也是最初的a和b的最大公约数。
下面我们来证明一下这个定理。
证明
P
r
o
o
f
Proof
Proof:不妨设
a
>
b
a>b
a>b(
a
<
b
a<b
a<b时
a
%
b
=
a
a\%b=a
a%b=a,一轮循环后自动变成
g
c
d
(
b
,
a
)
gcd(b,a)
gcd(b,a)),由整数拆分的基本定理
a
=
k
b
+
r
(
r
<
b
,
k
,
r
属
于
自
然
数
集
合
)
①
a=kb+r(r<b,k,r属于自然数集合)①
a=kb+r(r<b,k,r属于自然数集合)①
假设
d
d
d是
a
a
a和
b
b
b的任意一个公约数,则
a
(
m
o
d
)
d
=
0
a(mod)d=0
a(mod)d=0
b ( m o d ) d = 0 b(mod)d=0 b(mod)d=0
根据①,有:
r
=
a
(
m
o
d
)
b
r=a(mod)b
r=a(mod)b
r ( m o d ) d = ( a − k b ) ( m o d ) ( d ) = a ( m o d ) d − ( k b ) m o d ( d ) = 0 − 0 ∗ k = 0 r(mod)d=(a-kb)(mod)(d)=a(mod)d-(kb)mod(d)=0-0*k=0 r(mod)d=(a−kb)(mod)(d)=a(mod)d−(kb)mod(d)=0−0∗k=0
所以 d d d也是 b b b和 a ( m o d ) b a(mod)b a(mod)b的一个公约数;
所以任意一个 a a a和 b b b的公约数都是 b b b和 a ( m o d ) b a(mod)b a(mod)b的公约数;
同理可证任意一个 b b b和 a ( m o d ) b a(mod)b a(mod)b的公约数都是 a a a和 b b b的公约数;
所以 a a a和 b b b的公约数组成的集合和 b b b和 a ( m o d ) b a(mod)b a(mod)b的公约数组成的集合完全相同,
所以a和b的最大公约数一定也和b和 a ( m o d ) b a(mod)b a(mod)b的最大公约数相等。
所以当 a ( m o d ) b a(mod)b a(mod)b等于0时, b b b和 0 0 0的最大公约数显然等于 b b b,然后往前面返回,就有 a a a和 b b b的最大公约数等于某轮循环时 a ( m o d ) b a(mod)b a(mod)b等于0时,此轮b的值。
2.最小公倍数——(a,b)[a,b]=ab
一种快速求解
[
a
,
b
]
[a,b]
[a,b]的方法是利用辗转相除法求出
(
a
,
b
)
(a,b)
(a,b),然后利用
[
a
,
b
]
=
(
a
b
)
/
(
a
,
b
)
[a,b]=(ab)/(a,b)
[a,b]=(ab)/(a,b),这基于以下定理:
(
a
,
b
)
∗
[
a
,
b
]
=
a
∗
b
(a,b)*[a,b]=a*b
(a,b)∗[a,b]=a∗b
证明
P
r
o
o
f
Proof
Proof:
先证明
(
a
,
b
)
∗
[
a
,
b
]
>
=
a
b
(a,b)*[a,b]>=ab
(a,b)∗[a,b]>=ab,看到大于等于号,想到要用最大公约数的“最大”二字的性质。
首先先证明:a和b的任何公倍数都能整除最小公倍数
[
a
,
b
]
[a,b]
[a,b]
利用反证法证明,设c为a和b的任意一个公倍数,
d
=
[
a
,
b
]
d=[a,b]
d=[a,b],假设结论不成立,则有
c
=
k
d
+
r
,
0
<
r
<
d
c = kd + r, 0 < r < d
c=kd+r,0<r<d
又因为c是a和b的公倍数,即
c
%
a
=
0
且
c
%
b
=
0
c\%a = 0且c\%b=0
c%a=0且c%b=0,
k
d
kd
kd也是a和b的公倍数,即
k
d
%
a
=
0
且
k
q
%
b
=
0
kd \% a = 0 且kq\%b = 0
kd%a=0且kq%b=0,则根据上面的等式:
r
%
b
=
(
c
−
k
d
)
%
b
=
c
%
d
−
k
d
%
b
=
0
r
%
a
=
(
c
−
k
d
)
%
a
=
c
%
a
−
k
d
%
a
=
0
r\%b = (c - kd)\% b = c\%d - kd\%b = 0\\ r\%a = (c-kd)\%a = c\%a - kd\%a = 0
r%b=(c−kd)%b=c%d−kd%b=0r%a=(c−kd)%a=c%a−kd%a=0
所以r也是a和b的公倍数,然而
r
<
d
r < d
r<d,这与d是a和b的最小公倍数相矛盾,因此假设不成立,原结论成立。
a
b
ab
ab也是a和b的一个公倍数,所以根据上面的定理,有:
a
b
=
n
∗
[
a
,
b
]
,
n
∈
ℵ
ab=n*[a,b],n\in\aleph
ab=n∗[a,b],n∈ℵ
则
a
=
n
∗
(
[
a
,
b
]
/
b
)
a=n*([a,b]/b)
a=n∗([a,b]/b)
又因为
[
a
,
b
]
[a,b]
[a,b]是b的最小公倍数,所以
[
a
,
b
]
=
k
1
b
,
k
1
∈
ℵ
[a,b]=k_{1}b,k_{1}\in\aleph
[a,b]=k1b,k1∈ℵ
所以
a
=
n
∗
k
1
a=n*k_{1}
a=n∗k1
所以n是a的约数;
同理可证n是b的约数;
所以n是a和b的约数,那么n应该小于等于最大公约数(a,b):
n
<
=
(
a
,
b
)
⇒
(
a
b
)
/
[
a
,
b
]
<
=
(
a
,
b
)
⇒
a
∗
b
<
=
(
a
,
b
)
∗
[
a
,
b
]
n<=(a,b)\Rightarrow (ab)/[a,b]<=(a,b)\Rightarrow a*b<=(a,b)*[a,b]
n<=(a,b)⇒(ab)/[a,b]<=(a,b)⇒a∗b<=(a,b)∗[a,b]
再证明
a
b
>
=
(
a
,
b
)
[
a
,
b
]
ab>=(a,b)[a,b]
ab>=(a,b)[a,b],看到小于号,想到要用最小公倍数的"最小"二字的性质:
设
x
=
(
a
,
b
)
x=(a,b)
x=(a,b)
则
a
=
n
x
,
b
=
m
x
(
m
,
n
∈
ℵ
)
a=nx,b=mx(m,n\in\aleph)
a=nx,b=mx(m,n∈ℵ)
a b / x = n ∗ m ∗ x = n b = m a ab/x=n*m*x=nb=ma ab/x=n∗m∗x=nb=ma
所以
a
b
/
x
是
a
和
b
的
一
个
公
倍
数
ab/x是a和b的一个公倍数
ab/x是a和b的一个公倍数
所以
a
b
/
x
ab/x
ab/x应该小于等于最小公倍数
[
a
,
b
]
[a,b]
[a,b],即
a
b
/
x
=
a
b
/
(
a
,
b
)
<
=
[
a
,
b
]
⇒
a
b
<
=
(
a
,
b
)
[
a
,
b
]
ab/x=ab/(a,b)<=[a,b]\Rightarrow ab<=(a,b)[a,b]
ab/x=ab/(a,b)<=[a,b]⇒ab<=(a,b)[a,b]
综上.
a
∗
b
=
(
a
,
b
)
∗
[
a
,
b
]
a*b=(a,b)*[a,b]
a∗b=(a,b)∗[a,b]