欧几里得算法(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=⌊rmrm−1⌋
r m + 1 = r m − 1 − q m r m r_{m+1}=r_{m-1}-q_{m}r_{m} rm+1=rm−1−qmrm
m = m + 1 m=m+1 m=m+1return r m − 1 = g c d ( a , b ) r_{m-1}=gcd(a,b) rm−1=gcd(a,b)
我们先给出结论:
- 欧几里得算法的迭代次数是 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})。
- 欧几里得算法的单位乘法次数是 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+r3⋮rm−1=qmrm+rm+1
并且迭代结束时 r m + 1 = 0 r_{m+1}=0 rm+1=0。
证明:为了方便叙述,不妨令 a > b a>b a>b。
先证明一个结论:对 ∀ 0 ≤ i ≤ m − 2 \forall 0\le i\le m-2 ∀0≤i≤m−2,有 r i ≥ 2 r i + 2 r_{i}\ge 2r_{i+2} ri≥2ri+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+1≥1,所以有
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} ri≥ri+2qi+1+ri+2≥2ri+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=r0≥2r2r2≥2r4⋮rm−2≥2rm
并且迭代结束时 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})。由于每次迭代涉及两个整数的乘法,我们知道两个规模为 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=1∑mlog2qilog2ri
∑ 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=1∑mlog2qilog2ri≤log2a×i=1∑mlog2qi
另一方面,根据迭代方程,有
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>q2r2⋮rm−1>qmrm
左右分别相乘得到
a > ∏ i = 1 m q i a>\prod\limits_{i=1}^{m}q_{i} a>i=1∏mqi
即
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=1∏mqi=i=1∑mlog2qi
所以上界为
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=1∑mlog2qi<(log2a)2
令 n = log 2 a n=\log_{2}a n=log2a,则算法的单位乘法次数为 O ( n 2 ) O(n^{2}) O(n2)。