数论_最大公约数 & 最小公倍数
最大公约数(gcd)
辗转相除法
算法核心: gcd(a,b) = gcd(b,a mod b)
证明:
公理
如果 \(a\) 能整除 \(k\),且 \(b\) 能整除 \(k\) ,那么 \(ax+by\) (x,y 是未知数) 也能整除 \(k\)
首先 \(a \mod b=a - \lfloor \frac{a}{b} \rfloor × b\)
因此 a 和 b 的公因数 就是 \(ax+by\) ,a ,b的三个数公因数;那必然是b 和 \(a \mod b=a - \lfloor \frac{a}{b} \rfloor × b\) 的公因数。
反之同理,证毕。
时间复杂度: \(O(\log_{2} n)\)
代码:
int gcd(int a,int b)
{
int c=a%b;
while(c!=0)
{
a=b;
b=c;
c=a%b;
}
return b;
}
最小公倍数(lcm)
最小公倍数可以通过最大公约数求:最小公倍数 = 两数之和 / 最大公约数。
int lcm(int a,int b)
{
return a*b/gcd(a,b);
}