辗转相除法又叫欧几里得算法,详情请见: 欧几里得算法
下面是算法的go实现
// i和j的大小无所谓,当i>j时,第一次循环完之后,i和j就交换了,构成了 i<j
func Gcb(i, j int) int{
for i != 0 {
i, j = j%i, i
}
return j
}
下面是关于这个算法的证明。
网上有很多相关讲解,但是大都难以理解或者冗长,这里我写下在别的地方看到的一个非常经典的证明。
- 假设
x
和y
的最大公约数为z - 那么
x
一定可以被z
整除,y
也一定可以被z
整除 - 所以
mx
± \pm ±ny
也一定可以被z
整除 - 假设
x
>y
,那么x
/y
余c
可以表示成x
-ny
=c
- 基于
3
的结论x
-ny
是mx
± \pm ±ny
的一个特例,也一定可以被z
整除 - 所以
c
和y
可以构成新的x
和y
,直到x
/y
余0
,此时y
即为我们要求解的z
值