最大公约数与最小公倍数

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)。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值