int gcd(int a,int b)
{
return b ? gcd(b,a % b) : a;
}
也叫欧几里得算法或辗转相除法。
证明:根据模板需要证明gcd(a,b) = gcd(b,a % b)
有d是a的约数,d是b的约数,d是ax + by的约数。
又有a mod b = a - (a / b(下取整) * b),设 c = a / b(下取整)
所以需要证明:gcd(a,b) = gcd(b,a - (c * b))
利用充分必要性证明:
左到右:根据第一条定理,只要某个数是a和b的公约数,就一定是 a - (c * b)的约数,可证。
右到左:需证如果 d是 a - (c * b)的约数,那么d是a的约数。
d是a - (c * b)的约数,那么d也是a - (c * b) + (c * b)= a 的约数,所以可证。