欧几里得算法
function Euclid(a; b)
1: if b = 0 then
2: return a;
3: end if
4: return Euclid(b; a mod b);
复杂度分析:
设
a>=b
a
>=
b
,则有
amodb<a2
a
mod
b
<
a
2
证明:
假设
a=bq+r
a
=
b
q
+
r
,其中
q>=1
q
>=
1
,且
0<=r<b
0
<=
r
<
b
,
则有:
r=a−bq<b
r
=
a
−
b
q
<
b
因此:
a<b+bq
a
<
b
+
b
q
即 ==>
a<b(1+q)
a
<
b
(
1
+
q
)
于是:
11+q×a<b
1
1
+
q
×
a
<
b
==>
a1+q−b<0
a
1
+
q
−
b
<
0
==>
aq1+q−bq<0
a
q
1
+
q
−
b
q
<
0
==>
aq1+q+a1+q−bq<a1+q
a
q
1
+
q
+
a
1
+
q
−
b
q
<
a
1
+
q
===>
a−bq<a1+q
a
−
b
q
<
a
1
+
q
因为
a>=b
a
>=
b
,所以有
q>=1
q
>=
1
,于是:
a1+q<=a1+1
a
1
+
q
<=
a
1
+
1
所以有:
a−bq<a1+q<=a2
a
−
b
q
<
a
1
+
q
<=
a
2
即:
amodb<a2
a
mod
b
<
a
2
,每迭代一轮,a,b都会变成原来的一半!
因为算法的终止条件是a或b被处理为0为止。
于是复杂度为:
min(O(loga),O(logb))
m
i
n
(
O
(
l
o
g
a
)
,
O
(
l
o
g
b
)
)
即O(logn)