数论基础总?结?

  • \(gcd\):

    inline int gcd(int a,int b){ return b?gcd(b,a%b):a;}
  • 扩展欧几里得:求\(ax+by=gcd(a,b)\)的一组整数解。
    inline int Exgcd(int a,int b,int &x,int &y)
    {
      if(!b) {x=1,y=0;return a;}
      int Gcd=Exgcd(b,a%b,y,x);
      y-=a/b*x;return Gcd;
    }
  • 费马小定理:\(a^{p-1}\equiv 1\mod p\)(\(p\)为质数)
  • 欧拉定理(\(gcd(a,n)\ne 1\)):(無駄?)
    \[
    a^b\equiv \left\{\begin{array}{ll} a^b & b<\varphi(n)\\a^{b\mod\varphi(n)+\varphi(n)} & b\geq \varphi(n)\end{array}\right.\mod n
    \]
  • 欧拉定理(\(gcd(a,n)=1\)):\(a^{\varphi(n)}\equiv 1\mod n\)(無駄?)
  • 中国剩余定理(孙子定理):\(p_1,p_2,p_3...p_k\)两两互质,求一下方程组的最小整数解
    \[
    \left\{\begin{array}{ll}x\equiv a_1\mod p_1\\x\equiv a_2\mod p_2\\...\\x\equiv a_k\mod p_k\end{array}\right.
    \]
    令\(P=\prod p_i\),\(P_i=\frac{P}{p_i}\),\(t_i,P_i\)满足\(t_iP_i\equiv1\mod p_i\)。

    所以最小整数解为:\(x=\sum a_iP_it_i \mod P\)。

    inline int Exgcd(int a,int b,int &x,int &y)
    {
      if(!b) {x=1,y=0;return a;}
      int Gcd=Exgcd(b,a%b,y,x);
      y-=a/b*x;return Gcd;
    }
    int main(){
      n=read();
      for(int i=1;i<=n;i++) p[i]=read(),a[i]=read(),P*=p[i];
      for(int i=1;i<=n;i++)
      {
          int Pi=P/p[i],x,y;Exgcd(Pi,p[i],x,y);
          ans=(ans+a[i]*Pi*((x%p[i]+p[i])%p[i]))%P;
      }
      printf("%lld",ans);
    }
  • 扩展中国剩余定理(儿子定理)\(p_1,p_2,p_3...p_k\)不一定两两互质,求一下方程组的最小整数解
    \[
    \left\{\begin{array}{ll}x\equiv a_1\mod p_1\\x\equiv a_2\mod p_2\\...\\x\equiv a_k\mod p_k\end{array}\right.
    \]
    考虑两个式子:\(x\equiv a_1 \mod p_1,x\equiv a_2\mod p_2\)合并(这里是完整的推导过程注意不同部分的模数因为其来源可能不同

    可以合并成:\(x\equiv a'\mod m'\)。其中\(a'=p_1[inv(\frac{p_1}{gcd},\frac{p_2}{gcd})\frac{a_2-a_1}{gcd}\%\frac{p_2}{gcd}]+a_1,m'=\frac{p_1p_2}{gcd}\)(\(gcd=gcd(p_1,p_2),inv(x,y)\)表示\(x\)在模\(y\)意义下的逆元,\(y\)不一定为质数,所以要用\(Exgcd\)求)

    inline int gcd(int x,int b) {return b?gcd(b,x%b):x;}
    inline int Exgcd(int a,int b,int &x,int &y)
    {
      if(!b) {x=1,y=0;return a;}
      int Gcd=Exgcd(b,a%b,y,x);
      y-=a/b*x;return Gcd;
    }
    inline int Inv(int a,int b){int x,y;Exgcd(a,b,x,y);return (x%b+b)%b;}
    signed main(){
      int Jud=0;n=read();
      for(int i=1;i<=n;i++) p[i]=read(),a[i]=read();
      for(int i=2;i<=n;i++)
      {
          int Gcd=gcd(p[i],p[i-1]),Now,p1=p[i-1],p2=p[i],a1=a[i-1],a2=a[i];
          Now=Inv(p1/Gcd,p2/Gcd)%(p2/Gcd);
          Now=(Now*(((a2-a1)/Gcd)%(p2/Gcd))%(p2/Gcd)+(p2/Gcd))%(p2/Gcd);
          Now=((Now%(p2*p1/Gcd)*p1%(p2*p1/Gcd))%(p2*p1/Gcd)+(p2*p1/Gcd))%(p2*p1/Gcd);
          Now=(Now%(p2*p1/Gcd)+a1%(p2*p1/Gcd))%(p2*p1/Gcd);
          p[i]=p2*p1/gcd(p2,p1); a[i]=(Now%p[i]+p[i])%p[i];
      }
      print(Jud?-1:a[n]);
    }
  • \(BSGS\):求\(A^x\equiv B\mod C\)的\(x\)。(满足\(gcd(A,C)=1\))

    设\(m=\sqrt{C}\),令\(x=am+b\),所以有\(A^{am}\equiv A^bB\mod C\),预处理\(A^b\),暴力枚举\(a\)即可。

    int m=sqrt(C)+1,now=1;
    for(int i=0;i<m;i++)mp[(now*B)%C]=i,now=((now%C)*(A%C))%C;
    k=((k%C)*(now%C))%C;
    for(int i=1;i<=m;i++)
    {
        if(mp[k]) return ((i%C)*(m%C)-mp[k]+C)%C;
        k=((k%C)*(now%C))%C;
    }
  • 扩展\(BSGS\):求\(A^x\equiv B\mod C\)的\(x\)。(不一定满足\(gcd(A,C)=1\))

    令\(d=gcd(A,C)\),则我们可以除掉\(d\),原始变为\(\frac{A}{d}A^{x-1}\equiv \frac{B}{d}\mod \frac{C}{d}\),不断检查\(gcd(\frac{z}{d},y)\),一直除到互质为止,最后将减掉的补回来就行了。

    inline int EXBSGS(int A,int B,int C)
    {
      int cnt=0,d,k=1;
      while((d=gcd(A,C))^1)
      {
          if(B%d) return -1;
          B/=d;C/=d;++cnt;
          k=(k*(A/d))%C;
          if(k==B) return cnt;
      }
      mp.clear();int m=sqrt(C)+1,now=1;
      for(int i=0;i<m;i++) mp[(now*B)%C]=i,now=(now*A)%C;
      k=(k*now)%C;
      for(int i=1;i<=m;i++)
      {
          if(mp[k]) return (cnt+i*m-mp[k]+C)%C;
          k=(k*now)%C;
      }
      return -1;
    }
  • 线性筛:(不多讲,直接上)
    inline void Make_Prime(int T)
    {
        Vis[1]=1;
        for(int i=2;i<=T;i++)
        {
            if(!Vis[i]) Pri[++Cnt]=i;
            for(int j=1;j<=Cnt&&i*Pri[j]<=T;j++)
            {
                Vis[i*Pri[j]]=1;
              if(!(i%Pri[j])) break;
            }
        }
    }
  • \(Miller\) \(Rabin\):

    前置定理:费马小定理,二次探测:若\(a^2\equiv 1\mod p\)且\(p\)为质数,则\(a\equiv1\)或\(p-1\mod p\)。

    假设我们判定\(x\),将其拆为\(x=2^kt\)形式,随即一个\(a\)并求出\(a^t\),然后依次将\(2\)乘上去,用二次探测即可。

    最好我们多测几次\(Miller\) \(Rabin\)。

    int Tex[4]={2,3,5,7};
    inline int ksm(int b,int k,int p)
    {
      int a=b; k--;
      while(k)
      {
          if(k&1) a=(a%p*b%p+p)%p;
          b=(b%p*b%p+p)%p;k>>=1;
      }
      return a%p;
    }
    inline bool Miller_Rabin(int x)
    {
      if(x==1) return 0;
      int Now=x-1,k=0;
      while(!(Now&1)) Now>>=1,k++;
      for(int i=0;i<4;i++)
      {
          int a=ksm(Tex[i],Now,x)%x,Nex=a;
          if(x==Tex[i]) return 1;
          for(int j=1;j<=k;j++)
          {
              Nex=(a%x*a%x+x)%x;
              if(Nex==1&&a!=1&&a!=x-1) return 0;
              a=Nex;
          }
          if(a!=1) return 0;
      }
      return 1;
    }
  • \(Lucas\):懒得证明了,记着:\({n \choose m}\%p={n\%p \choose m\%p}*{n/p \choose m/p}\%p\)
    inline int ksm(int b,int k)
    {
      int a=b;k--;
      while(k)
      {
          if(k&1) a=(a%p*b%p)%p;
          b=(b%p*b%p)%p;k>>=1;
      }
      return a%p;
    }
    inline int C(int n,int m)
    {
      if(m>n) return 0;
      return (Fac[n]%p*ksm((Fac[m]%p*Fac[n-m]%p)%p,p-2)%p)%p;
    }
    inline int Lucas(int n,int m)
    {
      if(!m) return 1;
      return (C(n%p,m%p)%p*Lucas(n/p,m/p)%p)%p;
    }

至此,一些常用的数论基础都在这儿了,还有什么后面再补。

原文地址:https://www.cnblogs.com/wo-shi-zhen-de-cai/p/11623355.html

时间: 2024-08-02 12:45:42

数论基础总?结?的相关文章

find &amp; grep 总 结

find & grep 总 结 前言 关于本文 总 结 了 find.grep常 规 用 法,正 则 表 达 式,find与 grep合 用 以 及 自 定 义 搜 索 函 数 等 什么是find和grep find 和 grep 是 linux中 最 常 用 的 两 个 搜 索 函 数,本 文 将 会 介 绍 并 例 示 这 两 个 函 数 的 用 法. 为什么要用find和grep 对 其 的 熟 练 掌 握 可 以 明 显 提 高 搜 索 效 率,尤 其 是 面 对 动 辄 几 十 G 源

kuangbin带你飞---数论基础

又是几天过去,最近在刷数论基础和dp基础.kuangbin数论专题刷了差不多一大半吧.深深感jio到自己的菜.唉,温故而知新,所以决定在踩一遍坑点. Bi-shoe and Phi-shoe https://vjudge.net/problem/LightOJ-1370 题目大意:给出一些数字,对于每个数字找到一个欧拉函数值大于等于这个数的数,求找到的所有数的最小和. 分析:其实用欧拉筛打表欧拉函数值可以发现一个规律,质数的欧拉函数上升增加的速度远比其他数字快,所以此题只用找到第一个大于n的数即

转 A?B?A?P?_?E?x?c?e?l? ?处?理?总?结

gui_download怎么下载复杂的ALV表头为EXCEL http://blog.csdn.net/iamah/article/details/7497309 ABAP EXCEL文件上传与下载 http://blog.csdn.net/yuqinying112/article/details/7557805 A?B?A?P?_?E?x?c?e?l? ?处?理?总?结 http://wenku.baidu.com/link?url=-vgXjbL8OH1E38dYCVx6avGp5mFMsM

W?o?r?d?P?r?e?s?s?常?用?标?签?和?调?用?总?结

调用头部模板<?php get_header();?> 调用尾部模板<?php get_footer();?> 调用侧边栏<?php get_sidebar();?> 放在head标签内,方便插件调用:<?php wp_head(); ?> 放在footer里,body结束之前,方便插件调用:<?php wp_footer(); ?> --------------------------------------------------------

数论基础的补充讲解

数论基础的补充讲解 整除的一些性质: (1)能被2整除的数,个位上的数都能被2整除 (2*)能被4整除的数,个位和十位所组成的两位数能被4整除 (3*)能被8整除的数,百位.十位和个位所组成的三位数能被8整除 (4)能被5整除的数,末尾是0或5 (5*)能被25整除的数,十位和个位所组成的两位数能被25整除 (6*)能被125整除的数,百位.十位和个位所组成的三位数能被125整除 (7)能被3整除的数,各个数位上的数字之和能被3整除 (8*)能被9整除的数,各个数位上的数字和能被 9 整除 (9

数论基础题目八题【欧几里得】【筛法素数】【中国剩余定理】

之前看的数论的知识,现在做几道题目找找感觉..... poj 1061 传送门 题目大意,给你x,y,m,n,L.代表青蛙a的坐标x,青蛙b的坐标y,青蛙a一次跳的距离m,青蛙b一次跳的距离n,以及mod的值L,求经过多少次跳相遇.即求:(m-n)*x0=(x-y)(mod L);  模线性方程的解,不过要注意处理,因为(m-n)和(x-y)有可能是负的,如果(m-n)是负的,则直接对俩数取负数,下面就是对 ((x-y)+L)%L. 然后就能用modular_linear_equation(LL

数论基础的补充解说

数论基础的补充解说 整除的一些性质: (1)能被2整除的数,个位上的数都能被2整除 (2*)能被4整除的数,个位和十位所组成的两位数能被4整除 (3*)能被8整除的数,百位.十位和个位所组成的三位数能被8整除 (4)能被5整除的数.末尾是0或5 (5*)能被25整除的数.十位和个位所组成的两位数能被25整除 (6*)能被125整除的数.百位.十位和个位所组成的三位数能被125整除 (7)能被3整除的数,各个数位上的数字之和能被3整除 (8*)能被9整除的数.各个数位上的数字和能被 9 整除 (9

「数论基础」欧拉定理(费马小定理)

在阅读本篇之前,如果还不熟悉欧拉函数,可以参见另一篇介绍欧拉函数的「数论基础」欧拉函数. 定义:对于互质的两个正整数$a, n$,满足$a^{φ(n)} ≡ 1\  (mod\ n)$ 证明: 设集合$S$包含所有$n$以内与$n$互质的数,共有$φ(n)$个:     $S = \{ x_1, x_2, ..., x_{φ(n)} \} $ 再设集合$T$: $T = \{ a * x_1 \% n, a * x_2 \% n, ..., a * x_{φ(n)} \% n \} $ 由于$

你也可以手绘二维码(二)纠错码字算法:数论基础及伽罗瓦域GF(2^8)

摘要:本文讲解二维码纠错码字生成使用到的数学数论基础知识,伽罗瓦域(Galois Field)GF(2^8),这是手绘二维码填格子理论基础,不想深究可以直接跳过.同时数论基础也是Hash算法,RSA算法等密码学的入门基础. 二维码生成算法最为核心的就是编码规则和纠错码字的生成.本篇专门讲解纠错涉及到的伽罗瓦域(Galois Field).本文内容大部分是阅读<密码编码学与网络安全>后参考相关PPT编写,如有遗漏或不严谨地方请参考专业书籍. 数论基础 整除,因数,素数 设 a , b(b≠0)