辗转相除法, 又名欧几里德算法(Euclidean algorithm),是求最大公约数的一种方法。它的具体做法是:用较大数除以较小数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。
递归gcd代码
unsigned int gcd(unsigned int a, unsigned int b)
{
return b == 0? a : gcd(b, a% b);
}
非递归代码
unsigned int gcd(unsigned int a, unsigned int b)
{
unsigned int rem;
while(b != 0)
{
rem = a % b;
a = b;
b = rem;
}
return a;
}
数学证明
证
明
欧
几
里
得
算
法
,
即
g
c
d
(
a
,
b
)
=
g
c
d
(
b
,
a
m
o
d
b
)
,
前
提
条
件
:
{
a
=
m
d
b
=
n
d
m
和
n
互
质
⇒
d
是
a
和
b
的
最
大
公
约
数
证明欧几里得算法,即gcd(a,b) = gcd(b, a mod b),前提条件:\\ \begin{cases} a=md\\ b=nd\\ m和n互质\\ \end{cases} \Rightarrow d是a和b的最大公约数\\
证明欧几里得算法,即gcd(a,b)=gcd(b,amodb),前提条件:⎩⎪⎨⎪⎧a=mdb=ndm和n互质⇒d是a和b的最大公约数
证
明
:
证明:
证明:
设
g
c
d
(
a
,
b
)
=
d
1
,
则
{
a
=
m
d
1
b
=
n
d
1
m
,
n
互
质
令
a
=
q
b
+
r
则
r
=
a
−
q
b
=
m
d
1
−
q
n
d
1
=
(
m
−
q
n
)
d
1
要
证
明
欧
几
里
得
算
法
,
只
需
证
明
b
和
r
的
最
大
公
因
数
等
于
d
1
即
可
由
上
述
过
程
可
得
,
r
可
以
被
d
1
整
除
,
即
d
1
是
r
和
b
的
公
约
数
。
因
此
只
需
要
证
明
n
和
m
−
q
n
互
质
即
可
。
下
面
用
反
证
法
来
证
明
:
假
设
n
与
m
−
q
n
不
互
质
,
设
g
c
d
(
n
,
m
−
q
n
)
=
d
2
(
d
2
>
1
)
则
有
{
n
=
x
d
2
m
−
q
n
=
y
d
2
即
m
=
(
q
x
+
y
)
d
2
⇒
m
,
n
不
互
质
,
这
与
前
提
m
,
n
互
质
相
矛
盾
因
此
假
设
不
成
立
,
n
和
m
−
q
n
互
质
所
有
r
和
b
的
最
大
公
约
数
为
d
1
g
c
d
(
a
,
b
)
=
g
c
d
(
b
,
a
m
o
d
b
)
,
命
题
得
证
设gcd(a, b) = d_1,则 \begin{cases} a = md_1\\ b = nd_1\\ m,n互质 \end{cases}\\ 令a=qb+r\\ 则r=a-qb\\ =md_1-qnd_1\\ =(m-qn)d_1\\ 要证明欧几里得算法,只需证明b和r的最大公因数等于d_1即可\\ 由上述过程可得,r可以被d_1整除,即d_1是r和b的公约数。\\ 因此只需要证明n和m-qn互质即可。\\ 下面用反证法来证明:\\ 假设n与m-qn不互质,设gcd(n,m-qn)=d_2(d_2>1)\\ 则有 \begin{cases} n=xd_2\\ m-qn=yd_2 \end{cases}\\ 即m=(qx+y)d_2\Rightarrow m,n不互质,这与前提m,n互质相矛盾\\ 因此假设不成立,n和m-qn互质\\ 所有r和b的最大公约数为d_1\\ gcd(a, b) = gcd(b, a\ mod\ b),命题得证
设gcd(a,b)=d1,则⎩⎪⎨⎪⎧a=md1b=nd1m,n互质令a=qb+r则r=a−qb=md1−qnd1=(m−qn)d1要证明欧几里得算法,只需证明b和r的最大公因数等于d1即可由上述过程可得,r可以被d1整除,即d1是r和b的公约数。因此只需要证明n和m−qn互质即可。下面用反证法来证明:假设n与m−qn不互质,设gcd(n,m−qn)=d2(d2>1)则有{n=xd2m−qn=yd2即m=(qx+y)d2⇒m,n不互质,这与前提m,n互质相矛盾因此假设不成立,n和m−qn互质所有r和b的最大公约数为d1gcd(a,b)=gcd(b,a mod b),命题得证
欧几里得算法时间复杂度分析
定理: 若 M > N , 则 ( M m o d N ) < M 2 。 若M>N,则(M\ mod\ N)<\frac{M}{2}。 若M>N,则(M mod N)<2M。
证明:
存
在
两
种
情
况
。
若
N
≤
M
2
,
则
由
于
余
数
小
于
N
,
故
定
理
成
立
若
N
>
M
2
。
但
是
此
时
M
仅
含
有
一
个
N
,
从
而
余
数
为
M
−
N
<
M
2
定
理
得
证
。
存在两种情况。\\ 若N \le\frac{M}{2},则由于余数小于N,故定理成立\\ 若N>\frac{M}{2}。但是此时M仅含有一个N,从而余数为M - N < \frac{M}{2}\\ 定理得证。
存在两种情况。若N≤2M,则由于余数小于N,故定理成立若N>2M。但是此时M仅含有一个N,从而余数为M−N<2M定理得证。
由此定理可得出,欧几里得算法的迭代次数最多是 2 l o g 2 N = O ( l o g 2 N ) 2log_2N=O(log_2N) 2log2N=O(log2N)。