[施工...][业界良心]数论

来源:互联网 发布:优化软件点击 编辑:程序博客网 时间:2024/05/17 08:21

1.整除

整除的概念

a,bZ,如果存在一个整数 q,使a=bq 成立,则称“a能被 b 整除”或“b 整除 a”,记做ba,否则记做ba

带余除法定理

a,bZ,则存在唯一的整数 qr,使得a=bq+r
其中r[0,|b|)
也就是a/b=q,a%b=r

性质

  • ab,bc,则 ac
    证明:
    abb=q1a
    bcc=q2b
    c=q1q2a
    ac

  • da,db,则对于x,yZ,有d(ax+by)
    证明:
    daa=q1d
    dbb=q2d
    (ax+by)=q1dx+q2dy=d(q1x+q2y)
    d(ax+by)

  • abb0,则|a||b|
    证明 :
    abb=qa(qZ,q0)
    |b|=|qa|=|q||a|
    |q|1
    |a||b|

  • abba,则|a|=|b|0
    证明:
    abb=q1a
    baa=q2b
    显然成立。

  • ab|b|<|a|,则b=0

  • a,bZ,且 a2b2,则ab
    证明:反证法
    a2b2,则存在kZk>0,使b2=ka2
    k=a2b2k=ab
    如果ab,那kZ,那 k 就是完全平方数
    假设 k 不是完全平方数, 则k 是无理数
    但是k=abk 既然能表示成分数,那就肯定不是无理数
    所以假设不成立,k 是完全平方数
    kZ
    ab

2.最大公约数和最小公倍数

定义

最大公约数

a,b,mZ,若ma 并且mb,则称 ma,b 的公约数。

a,b 不全等于 0,则存在一个最大的 m,这个最大的 m 叫做 a,b 的最大公约数。

在数学中记做m=(a,b),在OI中可以表示为 gcd(a,b)=m

特别的,如果gcd(a,b)=1,则称 a,b 互质。

对于任意的aN+,都有gcd(a,1)=1

最小公倍数

a,b,mZ,若am 并且bm,则称 ma,b 的公倍数。

a,b 的所有公倍数中,最小的那个叫做 a,b 的最小公倍数。

在数学中记做m=[a,b],在OI中可以表示为 lcm(a,b)=m

定理

  • 对于mZ,若m0,则gcd(m,0)=|m|

  • m,n 不全等于 0,则gcd(m,n)1

  • mn,则gcd(m,n)=m

  • 欧几里得算法(辗转相除法)

a,b 是不为 0 的整数,且a=bq+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<algorithm>using namespace std;__gcd(a,b)

写完代码来干一些奇奇怪怪的事情,我们来证明一下这个的正确性。

证明:

d=gcd(a,b),d1=gcd(b,r)
那要证明这个定理,就只需要证明 d=d1

d1=gcd(b,r)
d1b,d1r
b=k1d1,r=k2d1
a=bq+r
a=qk1d1+k2d1=d1(qk1+k2)
d1a
d1b
d1a,b 的公约数
d1d
用相同的思路,在把d 处理一下,
d=gcd(a,b)
da,db
a=k1d,b=k2d
a=bq+r
r=abq=k1dqk2d=d(k1qk2)
dr
db
db,r 的公约数
dd1
d1d
d=d1

  • 扩展欧几里得算法(裴蜀定理)(x,y的线性丢番图方程)

挖个坑先。

原创粉丝点击