目录
1.GCD
1.1.GCD定义
整数a和b的最大公约数是指能同时被a和b整除的最大整数,记为gcd(a,b)。例如,gcd(15,81)=3。
注意:由于-a的因子与a的因子相同,因此gcd(a,b)=gcd(|a|,|b|)。编码只需关注正整数的最大公约数。
1.2.GCD性质
(1).gcd(a,b)=gcd(a,a+b)=gcd(a,k*a+b);
(2).gcd(k*a,k*b)=k*gcd(a,b);
(3).定义多个整数的最大公约数:gcd(a,b,c)=gcd[gcd(a,b),c];
(4).若gcd(a,b)=d,则gcd(a/d,b/d)=1,即a/d与b/d互素;
(5).gcd(a+c*b,b)=gcd(a,b);
1.3.GCD编程
1.3.1.欧几里得算法
gcd(a,b)=gcd(b,a%b)(a≥0,b>0,若b等于0,则结果为0);
证明1:
设a=k*b+r,则r=a-k*b,r=a mod b;
假设d是a,b的一个公约数,则有,r能被d整除;
因此d是(b,a mod b)的公约数;
d是(b,a mod b)的公约数,则b能被d整除,a mod b能被d整除;
有因为a=k*b+r,故a能被d整除,因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等
证明2:
设c是a,b的最大公约数,即c=gcd(a,b),则有 a=mc,b=nc,其中m,n为正整数,且m,n互为质数
由 r= a mod b可知,r= a- qb 其中,q是正整数,
则 r=a-qb=mc-qnc=(m-qn)c.,b=nc,r=(m-qn)c,且n,(m-qn)互质(假设n,m-qn不互质,则n=xd, m-qn=yd 其中x,y,d都是正整数,且d>1,则a=mc=(qx+y)dc, b=xdc,这时a,b 的最大公约数变成dc,与前提矛盾,所以n ,m-qn一定互质)
则gcd(b,r)=c=gcd(a,b),即gcd(a,b)=gcd(b,a%b);
int gcd(int a, int b) {
if (b == 0) {
return a;
}
return gcd(b, a % b);
}
2.LCM
2.1.LCM定义
整数a和b的最小公倍数表示为为lcm(a,b)。例如,lcm(5,6)=30。
2.2.算数基本定理
任何大于1的正整数n都可以唯一分解为有限个素数的乘积:n=,其中
都为正整数,
都为素数且从小到大。
设a=,b=
,
那么:gcd(a,b)=
lcm(a,b)=。
可以推出gcd(a,b)lcm(a,b)=a*b,即lcm(a,b)=a*b/gcd(a,b)=a/gcd(a,b)*b。
注意:最好先做除法再做乘法,不然可能会溢出
2.3.LCM编程
int gcd(int a, int b) {
if (b == 0) {
return a;
}
return gcd(b, a % b);
}
int lcm(int a, int b) {
return a / gcd(a, b) * b;
}
3.裴蜀定理
裴蜀定理(Bézout's identity),也称为裴蜀等式,Bézout等式,如果a与b均为整数,则有整数x和y使得ax+by=gcd(a,b)。
推论:整数a,b互素当且仅当存在整数x,y使得ax+by=1。