a,b∈Z ,如果存在一个整数 q ,使 a=b⋅q 成立,则称“ a 能被 b 整除”或“ b 整除 a ”,记做 b∣a ,否则记做 b∤a 。
设 a,b∈Z ,则存在唯一的整数 q 和 r ,使得 a=b⋅q+r
其中 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
设 a,b,m∈Z ,若 m∣a 并且 m∣b ,则称 m 是 a,b 的公约数。
若 a,b 不全等于 0 ,则存在一个最大的 m ,这个最大的 m 叫做 a,b 的最大公约数。
在数学中记做 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 的所有公倍数中,最小的那个叫做 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 的整数,且 a=b⋅q+r ,则 gcd(a,b)=gcd(b,r)
也就是 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
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=gcd(a,b)
∴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
挖个坑先。