欧几里得算法(辗转相除)
gcd(a,b),用于计算a,b的最大公约数
gcd(a, b) = g(b, a%b)
证明(反证法):
设 r=a%b , c=gcd(a,b)
则 a=xc , b=yc , 其中x , y互质
r=a%b=a-pb=xc-pyc=(x-py)c
因为gcd(a,b) = gcd(b,a%b)
b = yc;
a%b = r = (x-py)c
所以 y 与 (x-py) 互质
反证法:
假设 y 与 (x-py) 不互质
设 y = nk , x-py = mk , (k>1) 不互质有大于1的公因子
将 y 带入可得
x-pnk = mk
x = (pn + m)k
则 a = xc = (pn+m)kc , b = yc = nkc
那么此时 a 与 b 的最大公约数为 kc 不为 k
与原命题矛盾,则 y 与 x-py 互质
所以 gcd(a, b) = gcd(b, a%b)成立
代码实现用递归的方法,当a%b等于0时退出,返回b
代码:
int gcd(int a,int b) { return b?gcd(b,a%b):a; }