【学习笔记】简单数论-最大公约数

发布时间 2023-08-18 16:54:02作者: The_Shadow_Dragon
  • 一个整数 \(N\) 的约数上界为 \(2\sqrt{N}\)
    • \(1 \sim N\) 每个数的约数个数的总和大约为 \(N \times logN\)
    • 取模运算性质
      • \((a+b) \bmod p=((a \bmod p)+(b \mod p)) \mod p\) ,反之亦成立。
      • \((a-b) \bmod p=((a \bmod p)-(b \mod p)) \mod p\) ,反之亦成立。
      • \((a \times b) \bmod p=((a \bmod p) \times (b \mod p)) \mod p\) ,反之亦成立。
      • 引流两篇讲解负数取模的文章 link1 link2
    • \(\forall a,b \in \mathbb{N}\) ,则 \(\gcd (a,b) \times \operatorname{lcm} (a,b)=a \times b\)
    • \(\gcd(a,b)\) 用符号记作 \((a,b)\)\(\operatorname{lcm}(a,b)\) 用符号记作 \([a,b]\)
    • 特别地,有 \(\gcd(a,0)=a\)
    • 九章算术·更相减损法
      • \(\forall a,b \in \mathbb{N},a \le b\) ,则 \(\gcd (a,b)= \gcd (a,b-a)= \gcd (b,b-a)\)
        • 证明:设 \(d= \gcd(a,b),k_1= \frac{a}{d},k_2= \frac{b}{d}\) ,移项得 \(a=k_1 d,b=k_2 d\) ,又因为 \(d|(b-a),b-a=(k_2-k_1)d\) ,故 \(\gcd(a,b-a)= \gcd(k_1 d,(k_2-k_1)d)=d\)\(b\)\(b-a\) 同理。
      • \(\forall a,b \in \mathbb{N}\) ,则 \(\gcd(2a,2b)= 2\gcd(a,b)\)
      • 优化:luogu P2152 [SDOI2009] SuperGCD
        • 考虑对更相减损法进行优化:
          • \(a,b\) 均为偶数时,有 \(\gcd(a,b)=2 \times \gcd(\dfrac{a}{2},\dfrac{b}{2})\)
          • \(a\) 为偶数, \(b\) 为奇数时,有 \(\gcd(a,b)= \gcd(\dfrac{a}{2},b)\)
          • \(b\) 为偶数, \(a\) 为奇数时,有 \(\gcd(a,b)= \gcd(a,\dfrac{b}{2})\)
        • 不压位高精TLE 压位高精AC
    • 欧几里得算法
      • \(\forall a,b \in \mathbb{N}\) ,则 \(\gcd(a,b)= \gcd(b,a \bmod b)\)
        • 证明
          • \(a<b\) ,则 \(\gcd(b,a \bmod b)=\gcd(b,a)=\gcd(a,b)\)
          • \(a \ge b\) ,设 \(d= \gcd(a,b),a=q \times b+r(0 \le r <b)\) ,则 \(r=a \bmod b=a-q \times b\) ,又因为 \(d|a,d|b,d|(q \times b)\) ,则 \(d|(a-q \times b)\) ,即 \(d|r\) ,故 \(\gcd(a,b)=\gcd(b,r)=\gcd(b,a \bmod b)\)
      • 时间复杂度为 \(O(\log \max(a,b))\)
      • 代码实现
        int gcd(int a, int b)
        {
        	return b?gcd(b,a%b):a;
        }
        
    • 扩展欧几里得算法
      • 裴蜀定理(贝祖定理, \(Bézout\) 定理)
        • 对于任意整数 \(a,b\) ,存在一对整数 \(x,y\) ,满足 \(ax+by= \gcd(a,b)\)
          • 证明:
            • \(b=0\) 时,有一对整数 \(x=1,y=0\) 满足 \(a \times 1+0 \times 0= \gcd(a,0)\)
            • \(b>0\) ,则 \(\gcd(a,b)= \gcd(b,a \bmod b)\) 。假设存在一对整数 \(x,y\) ,满足 \(b \times x+(a \bmod b) \times y= \gcd(b,a \bmod b)\) ,又因为 \(b \times x+(a \bmod b) \times y=b \times x+(a-b \times \left\lfloor\dfrac{a}{b}\right\rfloor) \times y=a \times y+b \times (x-\left\lfloor\dfrac{a}{b}\right\rfloor \times y)\) ,所以令 \(x'=y,y'=x-\left\lfloor\dfrac{a}{b}\right\rfloor \times y\) ,此时有 \(ax'+by'= \gcd(a,b)\)
          • 例题:luogu P3951 [NOIP2017 提高组] 小凯的疑惑 / [蓝桥杯 2013 省] 买不到的数目
          • 推广
            • 对于任意整数 \(a_1,a_2,a_3,...a_n\) ,存在与之相对应的整数 \(x_1,x_2,x_3,...,x_n\) ,满足 \(a_1 x_1+a_2 x_2+a_3 x_3+...= \gcd(a_1,a_2,a_3,...,a_n)\)
            • 例题:luogu P4549 【模板】裴蜀定理
      • 代码实现
        int exgcd(int a,int b,int &x,int &y)
        {
        	if(b==0)
        	{
        		x=1;
        		y=0;
        		return a;
        	}
        	else
        	{
        		int d=exgcd(b,a%b,y,x);
        		y-=a/b*x;
        		return d;
        	}
        }
        
        • 上述程序求出方程 \(ax+by= \gcd(a,b)\) 的一组特解 \(x_0,y_0\) ,并返回 \(a,b\) 的最大公因数 \(d\)
      • 对于更为一般的方程 \(ax+by=c\) ,它有整数解当且仅当 \(d|c\)
        • \(\gcd(a,b)=d,p=\dfrac{b}{d},q=\dfrac{a}{d}\)
        • 特解:先求出 \(ax+by=d\) 的一组特解 \(x_0,y_0\) ,然后将 \(x_0,y_0\) 各乘上 \(\dfrac{c}{d}\) ,此时就得到了 \(ax+by=c\) 的一组特解 \(x'=\dfrac{c}{d} \times x_0,y'=\dfrac{c}{d} \times y_0\)
          • \(x\) 的最小正整数解为 \(x_{min}=x'+\left\lceil\dfrac{1-x}{p}\right\rceil \times p\) ,此时 \(y''=y'-\left\lceil\dfrac{1-x}{p}\right\rceil \times q\)
            • \(y''>0\) ,即存在正整数解时,正整数解的数量为 \(\left\lfloor\dfrac{y''-1}{q}\right\rfloor +1\)\(x\) 的最大正整数解为 \(x_{max}=x'+\left\lfloor\dfrac{y''-1}{q}\right\rfloor \times p\)\(y\) 的最小正整数解为 \(y_{min}=((y''-1) \bmod q)+1\)\(y\) 的最大正整数解为 \(y_{max}=y'\)
            • \(y'' \le 0\) ,即不存在正整数解时,所有整数解中 \(x\) 的最小正整数值为 \(x_{min}\)\(y\) 的最小正整数值为 \(y_{min}=y'+\left\lceil\dfrac{1-y}{q}\right\rceil \times q\)
          • 例题:luogu P5656 【模板】二元一次不定方程 (exgcd)
        • 通解: \(x'=\dfrac{c}{d} \times x_0+pk,y'=\dfrac{c}{d} \times y_0-qk(k \in \mathbb{Z})\) 。其中 \(x_0,y_0,d\) 的定义同上, \(k\) 取遍整数集合。