C++
中求最大公約數主要采用歐幾里得算法,歐幾里得算法的核心其實是\(gcd(a, b) = gcd(b, a\ mod\ b)\)下面進行證明
-
對\(a\ mod \ b\)進行變換
\[\begin{align*} a\ mod\ b &= a - \left \lfloor \frac{a}{b} \right \rfloor \times b\\ &=a - c\times b \end{align*} \] -
證明對於\(a\)和\(b\)的任意公約數\(k\),都是\(b\)和\(a\ mod\ b\)的公約數
是\(b\)的公約數,同時也是\(a-c\times b\) 的公約數 -
證明對於\(b\)和\(a\ mod\ b\)的任意公約數\(m\),都是\(a\)和\(b\)的公約數
即證明\(m\)是\(a\)的公約數,\(m\)可以整除\(a\ mod\ b\),則\(m\)可以整除\(a-c\times b\)所以\(m\)可以整除\(a\)
綜上所述,集合\(cd(a, b)\)等於集合\(cd(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;
}