C++
中求最大公约数主要采用欧几里得算法,欧几里得算法的核心其实是
g
c
d
(
a
,
b
)
=
g
c
d
(
b
,
a
m
o
d
b
)
gcd(a, b) = gcd(b, a\ mod\ b)
gcd(a,b)=gcd(b,a mod b)下面进行证明
-
对 a m o d b a\ mod \ b a mod b进行变换
a m o d b = a − ⌊ a b ⌋ × b = a − c × b \begin{align*} a\ mod\ b &= a - \left \lfloor \frac{a}{b} \right \rfloor \times b\\ &=a - c\times b \end{align*} a mod b=a−⌊ba⌋×b=a−c×b -
证明对于 a a a和 b b b的任意公约数 k k k,都是 b b b和 a m o d b a\ mod\ b a mod b的公约数
是 b b b的公约数,同时也是 a − c × b a-c\times b a−c×b 的公约数 -
证明对于 b b b和 a m o d b a\ mod\ b a mod b的任意公约数 m m m,都是 a a a和 b b b的公约数
即证明 m m m是 a a a的公约数, m m m可以整除 a m o d b a\ mod\ b a mod b,则 m m m可以整除 a − c × b a-c\times b a−c×b所以 m m m可以整除 a a a
综上所述,集合 c d ( a , b ) cd(a, b) cd(a,b)等于集合 c d ( b , a m o d b ) cd(b, a\ mod\ b) cd(b,a mod b),则 g c d ( a , b ) = g c d ( b , a m o d b ) gcd(a, b) = gcd(b, a\ mod\ b) gcd(a,b)=gcd(b,a mod b),该过程的实现如下
int gcd(int a, int b) {
return b ? gcd(b, a % b) : a;
}