辗转相除法证明

int gcd(int a, int b) {return !b ? a : gcd(b, a % b);}

a a a可以表示成 a = k b + r a = kb + r a=kb+r,则 r = a % b r = a \% b r=a%b
假设 d d d a , b a,b a,b的一个公约数,记作 d ∣ a , d ∣ b d|a,d|b da,db,即 a a a b b b都可以被 d d d整除
r = a − k b r = a - kb r=akb,两边同时除以 d d d,得 r d = a d − k b d = m \frac{r}{d}=\frac{a}{d}-\frac{kb}{d}=m dr=dadkb=m
由等式右边可知 m m m为整数,因此 d ∣ r d|r dr
因此 d d d也是 ( b , a % b ) (b,a\%b) (b,a%b)的公约数
假设 d d d ( b , a % b ) (b,a\%b) (b,a%b)的公约数,则 d ∣ b , d ∣ ( a − k ∗ b ) d|b,d|(a-k*b) db,d(akb) k k k是一个整数。
进而 d ∣ a d|a da,因此 d d d也是 a , b a,b a,b的公约数
因此 ( a , b ) (a,b) (a,b) ( b , a % b ) (b,a\%b) (b,a%b)的公约数是一样的,其最大公约数也必然相等,得证。

你可能感兴趣的:(证明)