关于欧几里得算法(Euclidean Algorithm)的迭代次数的证明

欧几里得算法(Euclidean Algorithm)的迭代次数和算法复杂度的证明

我们直到欧几里得算法是计算两个数的最大公因数(或者两个多项式的最大公因式),并且在其他算法中(例如因子分解算法)经常会用到欧几里得算法。本篇专门证明欧几里得算法的迭代次数和计算复杂度。

欧几里得算法描述

设我们研究的问题是利用欧几里得算法求 g c d ( a , b ) gcd(a,b) gcd(a,b),求解算法流程如下:

Euclidean Algorithm(a,b)

r 0 = a , r 1 = b , m = 1 r_{0}=a,r_{1}=b,m=1 r0=a,r1=b,m=1

while r m ≠ 0 r_{m} \ne 0 rm=0

​   q m = ⌊ r m − 1 r m ⌋ q_{m}=\lfloor \frac{r_{m-1}}{r_{m}}\rfloor qm=rmrm1
    r m + 1 = r m − 1 − q m r m r_{m+1}=r_{m-1}-q_{m}r_{m} rm+1=rm1qmrm
​   m = m + 1 m=m+1 m=m+1

return r m − 1 = g c d ( a , b ) r_{m-1}=gcd(a,b) rm1=gcd(a,b)

我们先给出结论:

  1. 欧几里得算法的迭代次数是 n = O ( m i n { log ⁡ 2 a , log ⁡ 2 b } ) n=O(min\lbrace \log_{2}a,\log_{2}b\rbrace) n=O(min{log2a,log2b})
  2. 欧几里得算法的单位乘法次数是 n 2 n^{2} n2(有很多资料粗略的写成 n 3 n^{3} n3)。

为了更容易叙述证明过程,我把Euclidean算法的过程写成迭代方程的形式:

r 0 = a r 1 = b r 0 = q 1 r 1 + r 2 r 1 = q 2 r 2 + r 3 ⋮ r m − 1 = q m r m + r m + 1 r_{0}=a\\ r_{1}=b\\ r_{0}=q_{1}r_{1}+r_{2}\\ r_{1}=q_{2}r_{2}+r_{3}\\ \vdots\\ r_{m-1}=q_{m}r_{m}+r_{m+1} r0=ar1=br0=q1r1+r2r1=q2r2+r3rm1=qmrm+rm+1

并且迭代结束时 r m + 1 = 0 r_{m+1}=0 rm+1=0

证明:为了方便叙述,不妨令 a > b a>b a>b

  1. 先证明一个结论:对 ∀ 0 ≤ i ≤ m − 2 \forall 0\le i\le m-2 0im2,有 r i ≥ 2 r i + 2 r_{i}\ge 2r_{i+2} ri2ri+2

    根据带余除法的理论,有 r i > r i + 1 r_{i}>r_{i+1} ri>ri+1。又因为 r i = r i + 1 q i + 1 + r i + 2 r_{i}=r_{i+1}q_{i+1}+r_{i+2} ri=ri+1qi+1+ri+2,且 q i + 1 ≥ 1 q_{i+1}\ge1 qi+11,所以有
    r i ≥ r i + 2 q i + 1 + r i + 2 ≥ 2 r i + 2 r_{i}\ge r_{i+2}q_{i+1}+r_{i+2}\ge2r_{i+2} riri+2qi+1+ri+22ri+2

  2. 因为
    a = r 0 ≥ 2 r 2 r 2 ≥ 2 r 4 ⋮ r m − 2 ≥ 2 r m a=r_{0}\ge2r_{2}\\ r_{2}\ge 2r_{4}\\ \vdots\\ r_{m-2}\ge 2r_{m} a=r02r2r22r4rm22rm
    并且迭代结束时 r m + 1 = 0 r_{m+1}=0 rm+1=0,所以可以得出迭代次数为 O ( log ⁡ 2 a ) O(\log_{2}a) O(log2a)同样可以得到 O ( log ⁡ 2 b ) O(\log_{2}b) O(log2b)。所以这里我们使用更为精确的界 O ( m i n { log ⁡ 2 a , log ⁡ 2 b } ) O(min\lbrace \log_{2}a,\log_{2}b\rbrace) O(min{log2a,log2b})

  3. 由于每次迭代涉及两个整数的乘法,我们知道两个规模为 n n n的整数相乘需要 O ( n 2 ) O(n^{2}) O(n2)次单位乘法,算上迭代次数,则Euclidean算法的单位乘法次数是 O ( n 3 ) O(n^{3}) O(n3)。这也是很多资料上给出的答案,但我们指出,这个上界可以进一步缩小至 O ( n 2 ) O(n^{2}) O(n2)

    证明:一方面,根据迭代方程,整个算法的单位乘法次数为 ∑ i = 1 m log ⁡ 2 q i log ⁡ 2 r i \sum\limits _{i=1}^{m}\log_{2}q_{i}\log_{2}r_{i} i=1mlog2qilog2ri
    ∑ i = 1 m log ⁡ 2 q i log ⁡ 2 r i ≤ log ⁡ 2 a × ∑ i = 1 m log ⁡ 2 q i \sum_{i=1}^{m}\log_{2}q_{i}\log_{2}r_{i}\le \log_{2}a\times \sum_{i=1}^{m}\log_{2}q_{i} i=1mlog2qilog2rilog2a×i=1mlog2qi
    另一方面,根据迭代方程,有
    a = r 0 > q 1 r 1 r 1 > q 2 r 2 ⋮ r m − 1 > q m r m a=r_{0}>q_{1}r_{1}\\ r_{1}>q_{2}r_{2}\\ \vdots\\ r_{m-1}>q_{m}r_{m} a=r0>q1r1r1>q2r2rm1>qmrm
    左右分别相乘得到
    a > ∏ i = 1 m q i a>\prod\limits_{i=1}^{m}q_{i} a>i=1mqi

    log ⁡ 2 a > log ⁡ 2 ∏ i = 1 m q i = ∑ i = 1 m log ⁡ 2 q i \log_{2}a>\log_{2}\prod\limits_{i=1}^{m}q_{i}= \sum_{i=1}^{m}\log_{2}q_{i} log2a>log2i=1mqi=i=1mlog2qi
    所以上界为
    log ⁡ 2 a × ∑ i = 1 m log ⁡ 2 q i < ( log ⁡ 2 a ) 2 \log_{2}a\times \sum_{i=1}^{m}\log_{2}q_{i}<(\log_{2}a)^{2} log2a×i=1mlog2qi<(log2a)2
    n = log ⁡ 2 a n=\log_{2}a n=log2a,则算法的单位乘法次数为 O ( n 2 ) O(n^{2}) O(n2)

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值