整除
在数论中,一个整数 aaa 能够被另一个整数 ddd 整除,记做 d∣ad|ad∣a。
整除的性质:
- 如果 d∣ad | ad∣a,则对于任意整数 kkk 有 d∣kad | kad∣ka。
- 如果 d∣ad|ad∣a 并且 d∣bd|bd∣b ,则 d∣(a±b)d | (a ± b)d∣(a±b)。
- 如果 b∣ab | ab∣a并且 a∣ba | ba∣b,则 a=ba = ba=b。
约数&倍数
若整数ddd能整除整数aaa(记为d∣ad|ad∣a)且d>0d>0d>0,则称ddd是aaa的约数(Divisor)。一个整数aaa的约数最小为111,最大为∣a∣|a|∣a∣,比如202020的约数有111、222、444、555、101010和202020。
若d∣ad|ad∣a,则称aaa是ddd的倍数(Multiple)。即存在整数kkk,使得a=kda = kda=kd,例如202020是111、222、444、555、101010、202020的倍数。
公约数&最大公约数
如果 ddd 是 aaa 的约数也是 bbb 的约数,则 ddd 是 aaa 与 bbb 的公约数。
最大公约数顾名思义就是,所有公约数中最大的那个。
一般地,将 aaa 和 bbb 的最大公约数记为 gcd(a,b)gcd(a, b)gcd(a,b)。
举个例子,gcd(15,20)=5gcd(15, 20) = 5gcd(15,20)=5,gcd(1,20)=1gcd(1, 20) = 1gcd(1,20)=1, $gcd(0, 20) = 20 $。
需要特别注意,gcd(0,0)=0gcd(0, 0) = 0gcd(0,0)=0。
最大公约数具有以下性质:
- gcd(a,ka)=∣a∣gcd(a, ka) = |a|gcd(a,ka)=∣a∣。
- 对于任意整数 aaa 与 bbb,如果d∣ad | ad∣a 且 d∣bd | bd∣b,则 d∣gcd(a,b)d | gcd(a, b)d∣gcd(a,b)。
- 对所有整数 aaa 和 bbb 以及任意非负整数 nnn, gcd(an,bn)=ngcd(a,b)gcd(an, bn) = n gcd(a, b)gcd(an,bn)=ngcd(a,b) 。
- 对所有正整数 ddd,aaa和 bbb,如果 d∣abd | abd∣ab 并且 gcd(a,b)=1gcd(a, b) = 1gcd(a,b)=1,则 d∣bd | bd∣b。
- 如果 qqq 和 rrr 是 aaa 除以 bbb 的商和余数,即 a=b∗q+ra = b * q + ra=b∗q+r,则 gcd(a,b)=gcd(b,r)gcd(a, b) = gcd(b, r)gcd(a,b)=gcd(b,r)。
扩展:如果两个数字aaa和bbb满足gcd(a,b)=1gcd(a, b) = 1gcd(a,b)=1,我们成为aaa 和bbb互质。
证明
充分性
证明: gcd(a,b)gcd(a, b)gcd(a,b) 是 aaa 和 bbb 的公约数,并且是最大的。
证明过程:
- 根据定义,gcd(a,b)gcd(a, b)gcd(a,b) 是能够同时整除 aaa 和 bbb 的最大的正整数。
- 因此,gcd(a,b)∣agcd(a, b) | agcd(a,b)∣a 且 gcd(a,b)∣bgcd(a, b) | bgcd(a,b)∣b,这表明 gcd(a,b)gcd(a, b)gcd(a,b) 是 aaa 和 bbb 的公约数。
- 假设存在另一个公约数 d′>gcd(a,b)d' > gcd(a, b)d′>gcd(a,b),这与 gcd(a,b)gcd(a, b)gcd(a,b) 的定义矛盾,因为 gcd(a,b)gcd(a, b)gcd(a,b) 被定义为最大的公约数。
- 因此,不存在比 gcd(a,b)gcd(a, b)gcd(a,b) 更大的公约数。
故得证 gcd(a,b)gcd(a, b)gcd(a,b) 是最大的公约数。
必要性
证明: 如果存在一个正整数 ddd 是 aaa 和 bbb 的公约数,则 ddd 必然是 gcd(a,b)gcd(a, b)gcd(a,b) 的约数。
证明过程:
- 假设 ddd 是 aaa 和 bbb 的公约数,那么根据定义,d∣ad|ad∣a 且 d∣bd|bd∣b。
- 由于 gcd(a,b)gcd(a, b)gcd(a,b) 是 aaa 和 bbb 的最大公约数,根据公约数的定义,任何 aaa 和 bbb 的公约数都必须小于或等于 gcd(a,b)gcd(a, b)gcd(a,b)。
- 因此,d≤gcd(a,b)d ≤ gcd(a, b)d≤gcd(a,b)。
- 如果假设 gcd(a,b)gcd(a, b)gcd(a,b) 不是 ddd 的倍数,则存在一个更小的正整数 d′>dd' > dd′>d 能够同时整除 aaa 和 bbb,这与 gcd(a,b)gcd(a, b)gcd(a,b) 是最大公约数的定义矛盾。
- 因此,gcd(a,b)gcd(a, b)gcd(a,b) 必须是 ddd 的倍数,即 d∣gcd(a,b)d | gcd(a, b)d∣gcd(a,b)。
公倍数&最小公倍数
如果 mmm 是 aaa 的倍数并且也是 bbb 的倍数,则 mmm 是 aaa 与 bbb 的公倍数。
最小公倍数顾名思义,就是所有的公倍数中最小的那个。
一般地,将 aaa 和 bbb 最小公倍数记为 lcm(a,b)lcm(a, b)lcm(a,b)。
举个例子,lcm(8,12)=24lcm(8, 12) = 24lcm(8,12)=24,lcm(1,12)=12lcm(1, 12) = 12lcm(1,12)=12, lcm(0,12)=0lcm(0, 12) = 0lcm(0,12)=0, lcm(0,0)=0lcm(0, 0) = 0lcm(0,0)=0。
最小公倍数的性质:
- lcm(a,b)=a∗b/gcd(a,b)lcm(a, b) = a * b / gcd(a, b)lcm(a,b)=a∗b/gcd(a,b)。
求最大公约数&最小公倍数
在编程时,我们一般使用 辗转相除法 来求两个数的最大公约数,也就是直接利用第五个性质。
如果 qqq 和 rrr 是 aaa 除以 bbb 的商和余数,即 a=b∗q+ra = b * q + ra=b∗q+r,则 gcd(a,b)=gcd(b,r)gcd(a, b) = gcd(b, r)gcd(a,b)=gcd(b,r)。
举个例子:
gcd(1001,767)gcd(1001,767)gcd(1001,767)
=gcd(767,234)=gcd(767,234)=gcd(767,234)
=gcd(234,65)=gcd(234,65)=gcd(234,65)
=gcd(65,39)=gcd(65,39)=gcd(65,39)
=gcd(39,26)=gcd(39,26)=gcd(39,26)
=gcd(13,0)=gcd(13,0)=gcd(13,0)
=gcd(26,13)=gcd(26,13)=gcd(26,13)
=13=13=13
求最大公约数:
// 辗转相除法求最大公约数
int gcd(int a, int b) {
return !b ? a : gcd(b, a % b);
}
求最小公倍数:
// 利用最大公约数求最小公倍数
int lcm(int a, int b) {
return a * b == 0 ? 0 : a * b / gcd(a, b);
}
求 abmod na^b mod\ nabmod n :
// 求 a mod n
int qmi(int a, int b, int n) {
int t = 1;
int y = a;
while (b > 0) {
if (b % 2 == 1)
t = (t * y) % n;
y = (y * y) % n;
b /= 2;
}
return t;
}
883

被折叠的 条评论
为什么被折叠?



