文章目录
定理1.7(Euclid除法,也称为带余除法)
设a,b是两个整数,其中b>0,则存在唯一的整数q,r,使得
再证明唯一性。如果分别有q1,r1和q2,r2满足式(1.1),则
当q1 ≠ q2时,左边的绝对值不小于b,而右边的绝对值小于b,这是不可能的。于是,q1 = q2,r1 = r2。证毕。
定义1.4
式(1.1)中的q叫作a被b除所得的不完全商,r叫作a被b除所得的余数。
判断a是否能被非零整数b整除的充要条件是a被b除所得的余数r=0。
通常,0≤r<b,这时r叫作最小非负余数;但在有些时候通过“平移”(即调整不完全商的大小),可以将r调整为|r|≤b/2,这时r叫作绝对值最小余数。
定义1.5(公因子)
设a1,…,an是n(n≥2)个整数。若整数d是它们中每一个数的因数,那么d就叫作a1,…,an的一个公约数(也叫公因数)。
d是a1,…,an的一个公因数的数学表达式为
如果整数a1,…,an不全为零,那么a1,…,an的所有公约数中最大的一个公约数叫作最大公约数,记作gcd(a1,…,an)或(a1,…,an)。
特别的,当(a1,…,an)=1,称(a1,…,an)互素或互质。
下面给出公约数的等价定义:
d>0是a1,…,an的最大公约数的数学表达式可以表述如下:
(1) d|a1,…,d|an。
(2) 若e|a1,…,e|an,则e|d。
说明:条件(1)表示d是公约数;条件(2)表示d在公约数中最大。
定理1.8
a,b是不全为零的整数,a,b的最大公约数d=(a,b)是集合
中的最小正整数。
证明:
令集合{sa + tb | s,t ∈ Z}中最小的正整数为m。下面证明m=d,方法是先证明d|m,再证明m|d。
一方面,因为d=(a,b),于是d|a,d|b,由定理1.3可知,d|sa + tb,s,t∈Z,于是d|m。
另一方面,由带余除法知,存在整数q1,q2,r1,r2,使得
易知,r1,r2属于{sa + tb | s,t ∈ Z},由于m是该集合中的最小正整数,故r1 = r2 = 0,即m|a,m|b,由最大公约数的定义可知m|d。
综合d|m,m|d,且均为正整数,有m = d。证毕。
推论1.1
a, b是不全为零的整数,a,b的最大公约数d =(a,b),集合
定理1.9
设a,b为不全为零的整数,则方程ax + by = c有整数解,当且仅当c ∈{ax + by | x,y ∈ Z},即当且仅当(a,b)| c。
该定理可以用来判定二元一次不定方程ax + by = c(a,b,c∈Z)的整数解是否存在。
特别地,若(a,b)=1,则存在整数x,y,使得ax + by = 1。
这一特例也说明只有当a和b互素时,ax = 1(mod b)才有解。
定理1.10
设a1,…,an是n个不全为零的整数,则
(1) a1,…,an与|a1|,…,|an|的公因数相同。
(2) (a1,…,an)=(|a1|,…,|an|)。
这个定理将公因数的讨论转化为在非负数范围内的讨论。
定理1.11(欧几里得算法,也称辗转相除法)
设b是任一正整数,则(0,b)= b。
定理1.12
设a,b,r是三个不全为零的整数,如果
证明:
令d =(a,b),d’ =(b,r),d|a,d|b,由定理1.3,得
同理,d’是a,b的公因数,从而d’ ≤ d。
因此,d = d’。
代码:计算两个整数的最大公因数。
def gcdIter(a, b):
while b != 0:
a, b = b, a % b
return a
def gcdRecur(a, b):
if b == 0:
return a
return gcdRecur(b, a % b)
if '__name__' == '__main__':
print('迭代求解最大公约数:')
print('gcdIter(2, 12) =', gcdIter(2, 12))
print('gcdIter(6, 12) =', gcdIter(6, 12))
print('递归求解最大公约数:')
print('gcdRecur(9, 12) =', gcdRecur(9, 12))
print('gcdRecur(17, 12) =', gcdRecur(17, 12))
总结
本文主要介绍了欧几里得算法,最后介绍采用递归和迭代的方式实现欧几里得除法(辗转相除法),如果利用绝对值最小余数代替最小非负余数,可以对算法进行优化。