本文地址:http://www.cnblogs.com/HarryGuo2012/p/4785167.html
最大公約數
想必大家小學就學過什么事最大公約數吧,現在給出一個數學上的定義:定義$g$是整數$a$和$b$的最大公約數,當且僅當$g$是同時整除$a$和$b$的數中最大的那個。
歐幾里得算法
歐幾里得算法可以寫成如下簡單的形式:
$$gcd(a,b) =\begin{cases} a, & \mbox{if }b=0 \\gcd(b,a\ mod\ b), & \mbox{if }b\ne0\end{cases}$$
算法的證明
算法的過程可以寫成如下的形式:
$$a=q_0b+r_0$$
$$b=q_1r_0+r_1$$
$$r_0=q_2r_1+r_2$$
$$r_1=q_3r_2+r_3$$
$$\cdots$$
$$r_{k-1}=q_{k+1}r_k$$
顯然,歐幾里得算法的答案就是$r_k$。
先證明$r_k$能整除$a$和$b$:
$$\because r_{k-1}=q_{k+1}r_k$$
$$\therefore r_{k-2}=q_kr_{k-1}+r_k=(q_{k+1}q_k+1)r_k$$
$$\therefore r_k\mid r_{k-2}$$
$$\cdots$$
$$\therefore r_k\mid b$$
$$\therefore r_k\mid a$$
$$\therefore gcd(a,b)=g\ge r_k$$
接下來證明$gcd(a,b)=g$能整除$r_k$
$$\mbox{令} a=ng\ b=mg$$
$$\because a=q_0b+r_0$$
$$\therefore r_0=a-q_0b=ng-q_0mg=(n-q_0m)g$$
$$\mbox{同理}g\mid r_k$$
$$\therefore g\le r_k$$
$$\mbox{由前面的證明我們知道} g\ge r_k$$
$$\therefore g=r_k$$
代碼
int gcd(int a, int b){ return b==0?a:gcd(b,a%b); }