基础数论学习笔记

数论杂项

  1. 扩展欧几里得

    裴蜀定理:\(ax+by=\gcd(a,b)\)。有解。

    void exgcd(int a,int b,int &x,int &y){
      if(!b) x=1,y=0;
      else{
        exgcd(b,a%b,y,x);
        y-=x*(a/b);
      }
    }
    

​ 其他解:\(x=x_0+i\times \frac{b}{\gcd(a,b)}\)。共有 \(\gcd(a,b)\) 个解。

  1. 费马小定理

    \(p\) 为质数,\(a^p\equiv a\pmod{p}\)\(a^{p-1}\equiv1\pmod{p}\)

  2. 欧拉函数、欧拉定理

    \(φ(m)\) 表示从 \(1\to m-1\) 中与 \(m\) 互质的数(包含 \(1\))。

    \(p\) 是质数,则 \(φ(p)=p-1\)

    \(\gcd(m,n)=1\),则 \(φ(mn)=φ(m)\times φ(n)\)

    \(φ(x)=x\times \prod_{i=1}^{n}(1-\frac{1}{p_i})\)

    求法:若 \(\gcd(a,m)=1\),则 \(a^φ(m)\equiv1\pmod{m}\)

    推论:若 \(\gcd(a,m)=1\),则 \(a^b\equiv a^{b\mod{φ(n)}}\pmod{m}\)

    扩展:若 \(b\geqφ(m)\),则 \(a^b\equiv a^{b \mod φ(m)+φ(m)}\pmod{m}\)

    筛法求欧拉函数:

    void oular(){
      vis[1]=1,phi[1]=1;
      for(int i=2;i<=n;i++){
        if(!vis[i]) pri[++cnt]=i,phi[i]=i-1;
        for(int j=1;i*pri[j]<=n;j++){
          vis[i*pri[j]]=1;
          if(i%pri[j]==0){
            phi[i*pri[j]]=phi[i]*pri[j];
            break;
          } 
          phi[i*pri[j]]=phi[i]*phi[pri[j]];
        }
      }
    }
    
  3. 逆元、组合数

    \(a*a^-1\equiv1\pmod{m}\) 则称\(a^-1\)\(a\)在模\(m\)意义下的逆元。

    求法:

    1. \(O(p\log{p})\)

      由费马小定理可得,若\(m\)为质数,则有\(a*a^{m-2}\equiv1\pmod{m}\)

      \(a^{m-2}\)为逆元。可以使用快速幂。

    2. \(O(p)\)

      \(m=\)\(\left\lfloor\dfrac{m}{x}\right\rfloor*x+r\)。则有\(x>r\)

      转化为\(\left\lfloor\dfrac{m}{x}\right\rfloor*x+r\equiv{0}\pmod{m}\)

      同乘\(x^{-1}r{-1}\)。则有\(\left\lfloor\dfrac{m}{x}\right\rfloor*r^{-1}+x^{-1}\equiv{0}\pmod{m}\)

      \(x^{-1}\equiv{-\left\lfloor\dfrac{m}{x}\right\rfloor*r^{-1}}\pmod{m}\)

      显然\(r<x\)\(r^{-1}\)已知。

      \(r=m-\left\lfloor\dfrac{m}{x}\right\rfloor*x\)

      显然\(r=m \mod {x}\)

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

    \(O(1)\) 求组合数:

    \(C_{n}^{m}={n!}*(m!)^{-1}*(n-m)!^{-1}\)

    注意到可以直接递归求出\(n!\)。而后\(m!^{-1}=(m-1)!^{-1}*m^{-1}\mod{p}\)

    又因为\(m,n\)范围,不可能暴力求。

    卢卡斯定理:

    \(C_{n}^{m}\mod{p}=C_{n\mod{p}}^{m\mod{p}}*C_{n/p}^{m/p}{\mod{p}}\)

    前项显然均小于\(p\)。后一项递归求即可。

    void init(){
    	fac[0]=inv[0]=fac[1]=inv[1]=1;
    	for(int i=2;i<=mod;i++){
    		fac[i]=fac[i-1]*i%mod;
    		inv[i]=((mod-mod/i)*inv[mod%i]+mod)%mod;
    	}
    	for(int i=2;i<=mod;i++) inv[i]=inv[i-1]*inv[i]%mod;
    }
    int C(int n,int m){
    	if(n<m) return 0;
    	return fac[n]*inv[m]%mod*inv[n-m]%mod;
    }
    int lucas(int n,int m){
    	if(m==0) return 1;
    	else return C(n%mod,m%mod)*lucas(n/mod,m/mod)%mod;
    }
    
  4. 中国剩余定理

    对于形如 \(x\equiv r_i \pmod{m_i}\)

    \(M=\prod_{i=1}^{n}m_i\)\(M_i=\frac{M}{m_i}\)

    \(x\equiv \sum_{i=1}^{n}r_iM_i^{-1}M_i\pmod{m}\)

posted @ 2023-08-08 09:02  Zimo_666  阅读(8)  评论(0编辑  收藏  举报