1.整除
整除的概念
a,b∈Z,如果存在一个整数 q,使
带余除法定理
设a,b∈Z,则存在唯一的整数 q 和
其中r∈[0,|b|)。
也就是a/b=q,a%b=r。
性质
若 a∣b,b∣c,则 a∣c
证明:
a∣b⇒b=q1⋅a
b∣c⇒c=q2⋅b
∴c=q1⋅q2⋅a
∴a∣c若d∣a,d∣b,则对于∀x,y∈Z,有d∣(a⋅x+b⋅y)
证明:
d∣a⇒a=q1⋅d
d∣b⇒b=q2⋅d
∴(a⋅x+b⋅y)=q1⋅d⋅x+q2⋅d⋅y=d⋅(q1⋅x+q2⋅y)
∴d∣(a⋅x+b⋅y)若a∣b 且 b≠0,则|a|≤|b|
证明 :
a∣b⇒b=q⋅a(q∈Z,q≠0)
∴|b|=|q⋅a|=|q|⋅|a|
又∵|q|≥1
∴|a|≤|b|若a∣b 且 b∣a,则|a|=|b|≠0
证明:
a∣b⇒b=q1⋅a
b∣a⇒a=q2⋅b
显然成立。若a∣b且|b|<|a|,则b=0。
若a,b∈Z,且 a2∣b2,则a∣b
证明:反证法
∵a2∣b2,则存在k∈Z且k>0,使b2=k⋅a2
∴k=a2b2⇒k√=ab
∴ 如果a∣b,那k√∈Z,那 k 就是完全平方数
假设k 不是完全平方数, 则k√ 是无理数
但是k√=ab,k√ 既然能表示成分数,那就肯定不是无理数
所以假设不成立,k 是完全平方数
∴k√∈Z
∴a∣b
2.最大公约数和最小公倍数
定义
最大公约数
设 a,b,m∈Z,若m∣a 并且m∣b,则称 m 是
若 a,b 不全等于 0,则存在一个最大的
在数学中记做m=(a,b),在OI中可以表示为 gcd(a,b)=m
特别的,如果gcd(a,b)=1,则称 a,b 互质。
对于任意的a∈N+,都有gcd(a,1)=1
最小公倍数
设 a,b,m∈Z,若a∣m 并且b∣m,则称 m 是
在 a,b 的所有公倍数中,最小的那个叫做 a,b 的最小公倍数。
在数学中记做m=[a,b],在OI中可以表示为 lcm(a,b)=m
定理
对于∀m∈Z,若m≠0,则gcd(m,0)=|m|
若 m,n 不全等于 0,则
gcd(m,n)≥1 若 m∣n,则gcd(m,n)=m
欧几里得算法(辗转相除法)
设a,b 是不为 0 的整数,且
也就是gcd(a,b)=gcd(b,a%b)
根据这个可以写出求 gcd 的递归代码
int gcd(int a,int b) {
return !b?a:gcd(b,a%b);
}
迭代当然可以
int gcd(int a,int b) {
while(b!=0) {
int r=b;
b=a%b;
a=r;
}
return a;
}
或者直接用std
#include<algorithm>
using namespace std;
__gcd(a,b)
写完代码来干一些奇奇怪怪的事情,我们来证明一下这个的正确性。
证明:
设d=gcd(a,b),d1=gcd(b,r)
那要证明这个定理,就只需要证明 d=d1
∵d1=gcd(b,r)
∴d1∣b,d1∣r
∴b=k1⋅d1,r=k2⋅d1
又∵a=b⋅q+r
∴a=q⋅k1⋅d1+k2⋅d1=d1⋅(q⋅k1+k2)
∴d1∣a
又∵d1∣b
∴d1 是 a,b 的公约数
∴d1≤d
用相同的思路,在把d 处理一下,
∴d∣a,d∣b
∴a=k1⋅d,b=k2⋅d
又∵a=b⋅q+r
∴r=a−b⋅q=k1⋅d−q⋅k2⋅d=d⋅(k1−q⋅k2)
∴d∣r
又∵d∣b
∴d 是 b,r 的公约数
∴d≤d1
又∵d1≤d
∴d=d1
- 扩展欧几里得算法(裴蜀定理)(x,y的线性丢番图方程)
挖个坑先。