信息安全数学基础——欧几里得算法


定理1.7(Euclid除法,也称为带余除法)

  设a,b是两个整数,其中b>0,则存在唯一的整数q,r,使得

a = qb + r   0 ≤ r < b(式1.1)
  证明:   先证明存在性。考虑一个整数序列
…, -3b, -2b, -b, 0, b, 2b, 3b, …
  它们将实数轴分成长度为b的一系列区间,而a必定落在其中的一个区间上。因此,存在一个整数q,使得
qb ≤ a < (q + 1)b
  令r = a – qb,则有
a = qb + r 0 ≤ r < b

  再证明唯一性。如果分别有q1,r1和q2,r2满足式(1.1),则

a = q1b + r1 0 ≤ r1 < b
a = q2b + r2 0 ≤ r2 < b
  两式相减,有
(q1 – q2)b = -(r1 – r2)

  当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的一个公因数的数学表达式为

d|a1,…,d|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}

中的最小正整数。
  证明:
  令集合{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,使得

a = q1m + r1,b = q2m + r2 0 ≤ r1,r2 < m

易知,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),集合

{sa + tb | s,t ∈ Z}
由d的所有倍数组成。

定理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是三个不全为零的整数,如果

a = qb + r
其中q是整数,则(a,b)=(b,r)。

  证明:
  令d =(a,b),d’ =(b,r),d|a,d|b,由定理1.3,得

d|a + (-q)b = r
于是d是b,r的公因数,从而d ≤ d’。

  同理,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))

总结

  本文主要介绍了欧几里得算法,最后介绍采用递归和迭代的方式实现欧几里得除法(辗转相除法),如果利用绝对值最小余数代替最小非负余数,可以对算法进行优化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值