基础数论学习笔记

数论杂项

  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=x0+i×bgcd(a,b)。共有 gcd(a,b) 个解。

  1. 费马小定理

    p 为质数,apa(modp)ap11(modp)

  2. 欧拉函数、欧拉定理

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

    p 是质数,则 φ(p)=p1

    gcd(m,n)=1,则 φ(mn)=φ(m)×φ(n)

    φ(x)=x×i=1n(11pi)

    求法:若 gcd(a,m)=1,则 aφ(m)1(modm)

    推论:若 gcd(a,m)=1,则 ababmodφ(n)(modm)

    扩展:若 bφ(m),则 ababmodφ(m)+φ(m)(modm)

    筛法求欧拉函数:

    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. 逆元、组合数

    aa11(modm) 则称a1a在模m意义下的逆元。

    求法:

    1. O(plogp)

      由费马小定理可得,若m为质数,则有aam21(modm)

      am2为逆元。可以使用快速幂。

    2. O(p)

      m=mxx+r。则有x>r

      转化为mxx+r0(modm)

      同乘x1r1。则有mxr1+x10(modm)

      x1mxr1(modm)

      显然r<xr1已知。

      r=mmxx

      显然r=mmodx

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

    O(1) 求组合数:

    Cnm=n!(m!)1(nm)!1

    注意到可以直接递归求出n!。而后m!1=(m1)!1m1modp

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

    卢卡斯定理:

    Cnmmodp=CnmodpmmodpCn/pm/pmodp

    前项显然均小于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. 中国剩余定理

    对于形如 xri(modmi)

    M=i=1nmiMi=Mmi

    xi=1nriMi1Mi(modm)

posted @   Zimo_666  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示