一些基础的数论知识

来源:互联网 发布:网易云音乐推荐算法 编辑:程序博客网 时间:2024/05/16 02:24

Preface

  • 这个专题主要用于记录一些比较基础的,有意义的,数学知识,且不做深入研究,等有时间,再把对应的习题,及一些深入拓展的知识补上.

1.GCD与LCM

  • 这是一个非常简单的知识点.

  • 通常定义如下:

    • (n,m)表示n,m的最大公约数.

    • [n,m]表示n,m的最小公倍数.

1.1 GCD

  • 我们求GCD有很多种方法,常见的有以下几种:

1.1.1 GCD辗转相除法

  • 原理:GCD(X,Y)=GCD(X,XY)

  • 时间复杂度证明:一次mod至少会减半,所以级别为log2


1.1.2 二进制算法(更相减损术)

  • 先去除所有的公共2因子,然后通过GCD(x,y)=GCD(x,xy)来做,时间复杂度堪忧.

  • 另外,还有一种方法叫做:Stein

这里写图片描述

1.1.3 LCM

  • LCM(a,b)可以直接用ab/GCD(a,b)得到.

1.2 扩展GCD

  • 拓展gcd是用于给定一组(x,y),让你求(p,q),使得px+qy=gcd(x,y)

1.2.1 用GCD拓展求

  • 这个很好求,我们直接在回溯时,让x=y,y=xa/by即可.

  • 证明:

    • ax+by=Gcd(a,b)

    • bx+(aa/bb)y=Gcd(a,b)=Gcd(a,b)

    • ay+b(xa/by)=Gcd(a,b)

1.2.2 求解线性同余方程

  • 我们要求ax+by=c,前提是GCD(a,b)|c

  • 我们可以先用拓展gcd求得一组解,然后乘上c/GCD(a,b)即可.

1.2.3 线性同于方程的最小正整数解

  • (x,y)ax+by=c的一组解.

  • 其通解为x+bnyan,故如果相求x的最小整数解,直接用(x%b+b)%b即为答案.

  • y同理.

2.逆元

  • 逆元的定义:若ax1(mod m),前提GCD(x,m)=1

  • 我们知道,因为(ansax)1(mod m),所以,我们不乘a,相当于除了个a,故(ansx)1(mod m)等于除了一个a

2.1 扩展GCD求解

  • 根据逆元的定义,我们可以把问题转化为ax+bm=1,因为gcd(x,m)=1,所以方程一定有解.

2.2 费马小定理

  • 当然,还有一种方法,可以求逆元,那就是费马小定理.

  • 费马的证明很好证,运用完全剩余系的性质即可.

2.3 线性求逆元

这里写图片描述

  • 当然,这同时也是一种O(log2n)的方法求逆元.

3.中国剩余定理

  • 中国剩余定理是用来求
    xa1(mod m1)
    xa2(mod m2)
    xan(mod mr)

模线性方程组的解.

  • 满足,m1,m2mr两两互质,且M=mi.

  • 则满足条件的解x为:

这里写图片描述

  • 证明是很显然的:

    • 任意一个式子带进去模mi,其余ajMjM1j的会被mod掉,而MiM1i=1.

    • 需要注意的地方有,我们每次算完MiMi1时并不能mod mi,这样子其余的Mj才能被当前的mi给模掉.

  • 费马小定理求逆元

#include <iostream>#include <cstdio>#include <cstring>#define ll long long#define Maxn 1000#define fo(i,a,b) for (i=a;i<=b;i++)using namespace std;ll n,i,ans,M;ll p[Maxn],m[Maxn];ll ksm(ll x,ll y,ll p){    if (y==-1) return 0;    ll ans=1;    while (y){        if (y&1) ans=(ans*x)%p;        x=(x*x)%p;        y>>=1;    }    return ans;}int main(){    scanf("%lld",&n);    fo(i,1,n)        scanf("%lld%lld",&m[i],&p[i]);                  M=1;    fo(i,1,n)        M*=m[i];    fo(i,1,n)        ans = (ans + (M/m[i]) * ksm(M/m[i],m[i]-2,m[i]) * p[i]) % M;    printf("%lld",(ans%M+M)%M);}
  • EXgcd求逆元
#include <iostream>#include <cstdio>#include <cstring>#define ll long long#define Maxn 1000#define fo(i,a,b) for (i=a;i<=b;i++)using namespace std;ll n,i,ans,M;ll p[Maxn],m[Maxn];void Exgcd(ll a,ll b,ll &x,ll &y){    if (b==0){        x=1, y=0;        return;    }    Exgcd(b,a%b,x,y);    ll t=x; x=y, y=t-y*(a/b);}int main(){    scanf("%lld",&n);    fo(i,1,n)        scanf("%lld%lld",&m[i],&p[i]);    M=1;    fo(i,1,n)        M*=m[i];    fo(i,1,n)    {        ll x,y, Mi=M/m[i];        Exgcd(Mi,m[i],x,y);        ans = (ans + Mi * x * p[i]) % M;    }    printf("%lld",(ans%M+M)%M);}

4.求斐波那契通项公式的一种简单方法

这里写图片描述

5.欧拉函数

  • 三个重要性质:

    • φ(pk)=pkpk1=(p1)pk1

    • φ(xy)=φ(x)φ(y)|xy

      • 此性质证明稍微复杂

      • 这里写图片描述

      • 可以构造一个nm的矩阵,每一个数都可以用km+r|(1<=r<=m,1<=k<n)表示.

      • 那么对于每一列,因为gcd(km+r,m)=gcd(r,m),所以有φ(m)列可能与nm互质.

      • 同理,每一列中n个数模n之后可以构成一个完全剩余系,其中恰好有φ(n)个数与n互质,既然模n后与n互质,那么不模肯定也互质,同理,不互质的不模也不互质.

      • 所以总共有φ(n)φ(m)个数与nm互质,即

        φ(nm)=φ(n)φ(m)

    • φ(n)=nri=1(11pi)

      • 这个通过前两个定理可以很容易证明.

欧拉定理:

  • 对于互质的正整数a,n,有aφ(n)1(mod n)

    • 证明:

      • 第一步:

        Zn=x1,x2,...,xφ(n)
        S={(ax1)mod n,(ax2)mod n,...,(axφ(n))mod n}
        Zn=S

        ①因为a,n互质,xi(1iφ(n))n互质, 所以 axin 互质,所以(axi) mod nZn
        ②若ij , 那么xixj,且由 a,n互质可得 (axi) mod n(axj) mod n

      • 第二步:

aφ(n)x1x2...xφ(n)mod n

(ax1)(ax2)...(axφ(n))mod n

(ax1mod n)(ax2mod n)...(axφ(n)mod n)mod n

x1x2...xφ(n)mod n

  • 由消去律可得
    aφ(n)1mod n

莫比乌斯反演

  • 学之前,以为这是一个很高深的东西,但其实,只要仔细推一下,问一下大佬,并不是很难…

基本公式

  • f(n)=d|ng(d)g(n)=d|nf(nd)μ(d)

  • 证明需要用到两个基本性质

莫比乌斯函数

  • μ的定义如下

  • μ(n)中,将n分解质因式,n=pq11pq22pqkk

  • 只要存在一个qi>2,那么μ(n)=0

  • 否则μ(n)=(1)k

两个基本性质

  • 性质一

    • 对于任意正整数n,有
      d|nμ(d)=0,1,n>1n=1
    • 证明只需运用μ的性质以及组合数即可.
  • 性质二

    • μ(n)为积性函数

    • 证明只需分类讨论一下.

反演的证明:

g(n)=d|nf(nd)μ(d)

g(n)=d|nμ(d)i|ndg(i)

g(n)=d|nμ(d)id|ng(i)
(只要满足i,d乘积为n的约数即可.)
g(n)=d|ng(d)i|ndμ(i)

  • 根据性质一可得当d=n时,式子i|ndμ(i)值为1,其余为0,所以得证.

一个变形

  • f(i)=d=1nig(di)g(i)=d=1nif(di)μ(d)

  • 证明同样可以参照上面,一样的思路.

    g(i)=d=1nif(di)μ(d)
    g(i)=d=1niμ(d)f(di)
    g(i)=d=1niμ(d)d=1ndig(ddi)
    T=dd
    g(i)=T=1nig(Ti)d|Tμ(d)

  • 同理,由性质一可得当T=1时,d|Tμ(d)值为1,其余为0,所以得证.

  • 其中,最后一步的式子,我是这么理解的:

    • 首先,T的取值范围一定是在1n/i的.

    • 其次,对于这样的一个T,有多少个d可以更新它呢?

    • 显然,就是d|T个.

6.同余

  • 剩余类:

    • 整数除n后得到n个不同的余数,即{0,1,2,...,n1}.

    • 把所有被n除后余数相同的一些数称为n的一个剩余类,可知对于整数n,有且只有n个剩余类.

  • 完全剩余系:

    • nn个剩余类当中每类选取1个数出来,组成的序列称为n的完全剩余系.
  • 简化剩余系(即既约剩余系):

    • 在模数与n互质的剩余类中每类选取1个数出来,组成的序列称为n的简化剩余系.

有关同余的一些性质:

  • 定理①:若m|(ab),则ab (mod m)

    • 可设a=xm+r,b=ym+r,即可得证.$
  • 通过定理①,可以得出如下性质:

    • 1ab (mod m)ba (mod m)

    • 2ab (mod m)bc (mod m)ac (mod m)

    • 3ab (mod m)cd (mod m)acbd (mod m)a+cb+d (mod m)

    • 4ab (mod m)anbn (mod m)

    • 5acbc (mod m)(c,m)=1ab (mod m)

      • 证明:

      • acbc0 (mod m)(ab)c0 (mod m)

      • (c,m)=1.

      • (ab)0 (mod m)