最大公约数与最小公倍数
gcd(最大公约数)
求解gcd时通常使用的是欧几里得算法(辗转相除法)。
定理:两个整数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数。
int gcd(int a, int b)
{
return b ? gcd(b, a % b) : a;
}
lcm(最小公倍数)
求解lcm时通常用gcd进行辅助计算。
定理:两个自然数的最大公约数与它们的最小公倍数的乘积等于这两个数的乘积。
int lcm(int a, int b)
{
return a / gcd(a, b) * b; // 避免发生算数溢出
}
gcd的性质
gcd(a, b) = gcd(b, a);(交换律)
gcd(-a, b) = gcd(a, b);
gcd(a, a) = |a|;
gcd(a, 0) = |a|;
gcd(a, 1) = 1;
gcd(a, b) = gcd(b, a mod b);
gcd(a, b) = gcd(b, a - b)。
如果有附加的一个自然数m,则:
gcd(m * a,m * b) = m * gcd(a, b) (分配律);
gcd(a + m * b , b) = gcd(a, b)。
如果m是a和b的最大公约数,则:
gcd(a / m , b / m) = gcd(a, b) / m;
在乘法函数中有:
gcd(a * b, m) = gcd(a, m) * gcd(b, m)。
和最小公倍数(lcm)的关系:
gcd(a, b) * lcm(a, b) = a * b;
两个整数的最大公因子可用于计算两数的最小公倍数,或分数化简成最简分数。
两个整数的最大公因子和最小公倍数中存在分配律:
gcd(a, lcm(b, c)) = lcm(gcd(a, b), gcd(a, c));
lcm(a, gcd(b, c)) = gcd(lcm(a, b), lcm(a, c));
在坐标里,将点(0, 0)和(a, b)连起来,通过整数坐标的点的数目(除了(0, 0)一点之外)就是gcd(a, b)。
常用定理
(1)如果两个自然数是互质数,那么它们的最大公约数是1,最小公倍数是这两个数的乘积。
(2)如果两个自然数中,较大数是较小数的倍数,那么较小数就是这两个数的最大公约数,较大数就是这两个数的最小公倍数。
(3)两个整数分别除以它们的最大公约数,所得的商是互质数。
(4)两个自然数的最大公约数与它们的最小公倍数的乘积等于这两个数的乘积。
(5)a与b的最大公约数是最小的a与b的正线性组合,即对于方程xa+yb=c来说,若x,a,y,b都为整数,那么c的最小正根为gcd(a,b)。