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 的线性丢番图方程)
挖个坑先。