数论的一些证明

来源:互联网 发布:手机分享电脑网络 编辑:程序博客网 时间:2024/05/29 07:45

目录

  • 目录
    • 欧几里得定理
      • 用途
      • 证明
      • 代码
    • 扩展欧几里得定理
      • 用途
      • 证明
      • 代码
    • 费马小定理
      • 用途
      • 证明
      • 代码
    • 递推求逆元
      • 用途
      • 证明
      • 代码
    • 欧拉-费马定理
      • 用途
      • 证明
      • 代码
    • Lucas定理
      • 用途
      • 证明
      • 代码
    • 威尔逊定理
      • 用途
      • 证明


1.欧几里得定理


用途

log的时间内,求出xy的最大公约数


证明

首先,设xa,b的最大公约数,即ab=x,那么a=k1xb=k2x,则a mod b=(k1 mod k2)x

所以,x也一定是ba mod b的最大公约数(因为如果k2k1 mod k2的最大公约数不等于1,那么,k2k1的最大公约数也不等于1【这个应该不用我证明吧】,则x一定不是ab的最大公约数,与定义矛盾了),然后,就把b看成aa mod b看成b,(很显然,改变后的b=k2x里的k2会变小,因为k1 mod k2的值在0~k21之间)继续递归,又因为y0的值就是y(这个应该就不需要证明了吧),所以只要递归到y0就可以了。

(证明不是很严谨。。。网上的证明自己看得也是很糊涂,还是喜欢自己证明一遍。)


代码

int gcd(int a,int b){    return (b==0?a:gcd(b,a%b));}

2.扩展欧几里得定理


用途

log的时间内,找到 x,y 的最大公约数

log的时间内,找出构成abxy使得ax+by=ab(或找出构成abk倍的数的xy,就是把前面得出的xy乘上k

log的时间内,找出a在模b意义下的模反元素(如果,ab=1,说明有模反元素为x,否则没有)

(弱弱地问一句,模反元素与逆元的区别是什么?【自我感觉是一样的,但是不知道为什么有两个名称】)


证明

原式ax+by=ab,假设ab

① 当b=0时,ab=a,即x=1y=0

② 当b0时,根据欧几里得定理ab=ba mod b得到 ax+by=bx+a mod by

ax+by=bx+aba/by

移项得到ax+by=ay+bxa/by

然后就可以得到 x=yy=xa/by

然后通过回溯,得出xy


代码

int exgcd(int a,int b,int &x,int &y){    if (b==0)    {        x=1;y=0;return a;    }    int w=exgcd(b,a%b,x,y),t=x;    x=y;y=t-a/b*y;    return w;}

3.费马小定理


用途

在log的时间内求出x在模pp为素数)意义下的逆元

判断一个数是不是素数(即费马素性检验,一个随机化算法判断一个数是否是素数,但是有Carmichael数,会导致判断错误)

(丢个度娘的链接:费马素性检验、Carmichael数)

当模p不是素数的时候需要用到欧拉定理(欧拉定理什么的我还不会…)


证明

方法①:

首先,如果p是素数,那么(p1)!1(mod p)(这个应该不用我证明,表示自己懒的一批,能少写就少写吧)

假设,p为素数(x mod pp)=1(即费马小定理的前提,x mod p是保证x<p

即对于f(i)=(xi) mod piNip1)中任意两个不相同的i,f(i)的值都不相同

(p1)!(x1)(x2)(x3)(x(p2))(x(p1))(mod p)

(p1)!x(p1)!(p1)!(mod p)

两边同时除去(p1)!(当且仅当一个数为与模数互质时才满足消去性质)就可以得到xp11(mod p)

然后就可以得到xx(p2)1(mod p),很显然x(p2)就是x在模p意义下的逆元

方法②:

需要用到后面介绍的欧拉-费马定理,因为p为素数,那么很显然ϕ(p)=p1,那么就可以得出x(p1)1(mod p)


代码

//等我学会欧拉函数再来写p非素数的费马小定理求逆元LL pow(LL x,LL n,LL p)//快速算出x^n模p(为素数)后的值,求逆元的话,就是n=p-2{    LL res=1;    while(n)    {        if (n&1) res=res*x%p;        x=x*x%p;        n>>=1;    }    return res;}

4.递推求逆元


用途

当需要求逆元的次数过多时就需要打个逆元表,这时候就需要用递推在n的时间内求出1~n在模p意义下的逆元


证明

首先,inv[1]=1(这个不用证明吧……)

然后,设 x=p/iy=p mod i

那么,很显然,xy 满足 xi+y=p,即 xi+y0(mod p)

根据同余的性质,可以得到 yxi (mod p),然后两边同时除去 yi,得到 inv[i]xinv[y] (mod p)

x=p/iy=p mod i 带入得到 inv[i](p/iinv[p mod i]) (mod p)

再根据同余的性质,得到 inv[i]=(pp/i)inv[p mod i] (mod p)


代码

void makeinv(int n,int p){    inv[1]=1;    for (int i=2;i<=n;i++) inv[i]=(p-p/i)*inv[p%i]%p;}

5.欧拉-费马定理


用途

求逆元,尤其是求 p 不是素数,但 (x,p)=1x 的逆元


证明

首先,得知道一个定义:ϕ(p)为小于p的且与p互质的正整数的个数(其中,规定ϕ(1)=1

设小于x且互质的数从小到大排序后,分别为a[1]a[2]a[ϕ(p)],那么a[1]a[2]a[ϕ(p)]p)=1

那么,xa[1]xa[2]xa[ϕ(p)]在模p意义下肯定不同余,且与p互质

① 证明不同余:

假设存在同余,那么就等于存在 iji<j)满足 p|x(a[j]a[i])

因为 0<a[j]a[i]<p,与定义矛盾了;

② 证明互质:

假设至少有一个数不与p互质

r=xa[i] mod p 存在i满足rp=yy1),即xa[i]=kp+r=y((kp+r)/y))【后面这个数很显然是个整数】,从这里就可以推出x,p1,与定义矛盾

经过上述的证明后,可以证明xa[1]xa[2]xa[ϕ(p)]这些数与原来的那些未乘过x的数在模p意义下的值一一对应

(因为,小于p且与p的数仅有ϕ(p)个,而乘x以后的数在模p意义下不同余且与p互质)

所以,(xa[1])(xa[2])(xa[ϕ(p)])a[1]a[2]a[ϕ(p)]

两边同时除去 a[1]a[2]a[ϕ(p)](当且仅当一个数为与模数互质时才满足消去性质)得到xϕ(p)1(mod p)

这个式子也可以转换为xxϕ(p)11(mod p),显然x在模p意义下的逆元就是xϕ(p)1


代码

与费马定理差不多,就是多了一个求ϕ(p),代码就懒得打了。。。

差点忘记介绍欧拉函数的两种做法,一种就是求与其互质数的个数(暴力…),还有一种就是求x不同的质因子,那么ϕ(x)就等于xx/pi(p[i]x)


6.Lucas定理


用途

logp(n)p 的时间内得到 Ckn 的值


证明

n=sp+qk=tp+r,其中,q<pr<pp 为素数

首先,得知道当 0<k<p 时,Ckp0 (mod p)

因为,Ckp一定是一个整数,且等于 p!/(k!(pk)!),显然当 p 为素数时,在整除的过程中不会被除掉,即 Ckp mod p=0

因为 (1+x)sp+q<=>i=0sp+qCisp+qxi …………①

而对于 (1+x)n<=>(1+x)sp+q<=>((1+x)s)p(1+x)q<=>((1+x)p)q(1+x)q

所以,(1+x)sp+q<=>i=0sCisxipi=0qCjqxj…………②

对于①式中的 xtp+r 的系数为 Ctp+rsp+q

对于②式中的 xtp+r 的系数(因为 p>r,那么 ip+j=tp+r 的表达方式唯一)为 CtsCrq,即为 Ck/pn/pCk mod pn mod p

所以,Ck/pn/pCk mod pn mod pCtp+rsp+q (mod p)

Lucas定理得证


代码

LL pow(LL x,LL n,LL p){    LL res=1;    while (n)    {        if (n&1) res=(res*x)%p;        x=(x*x)%p;        n>>=1;    }    return res;}LL C(LL n,LL k,LL p){    LL ret=1;    while (n&&k)    {        LL q=n%p,r=k%p;        if (q<r) return 0;        ret=ret*fact[q]*pow(fact[r]*fact[q-r]%p,p-2,p)%p;  //fact(x)表示x!        n/=p;k/=p;    }    return ret;}

7.威尔逊定理


用途

表示自己不知道…求大佬告诉我(别告诉我就是定理的内容…)


证明

对于证明一个素数 p 满足 (p1)!1 (mod p),即证明 (p1)!p1 (mod p) 对于 2~p2 内任何数都互相配对互成逆元,且没有一个数会同时与两个不同的数互成逆元

首先,我们可以知道素数中唯一个偶数2满足该条件,那么我们只需要证明剩下所有的奇素数即可

对于一个奇素数,2~p2中所拥有的数字的个数一定是偶数个,然后就是证明这些数字互相配对且互成逆元,且没有一个数会同时与两个不同的数互成逆元

根据乘法逆元的定义(乘法逆元,是指数学领域群 G 中任意一个元素 a,都在 G 中有唯一的逆元a)可以知道一定没有一个数同时与两个不同的数互成逆元(至于为什么,我表示并不知道)

因为,对于一个数 x 以及它的逆元 y 肯定满足 xy1 (mod p),那么对于 y 来说 x 必定是它的逆元,因为xy1 (mod p)<=>yx1 (mod p)

所以,奇素数中,2~p2 中的偶数个数一定互相配对互成逆元(因为p1的逆元为p1(p1)(p1)=p2+2p+11 (mod p)】,1的逆元为1,不会对这些数的匹配造成影响),且没有一个数会同时与两个不同的数互成逆元

所以,素数 p 一定满足 (p1)!1 (mod p)