【笔记】数论:同余相关

7.29 数论

扩欧、中国剩余定理、乘法逆元、卢卡斯定理、BSGS、阶和原根的英文名分别是 exGCD, exCRT, Inverse, Lucas, BSGS, Primitive root。

\(a\equiv b\pmod p\Rightarrow \frac{a}{d}\equiv \frac{b}{d}\pmod{\frac{p}{d}},d=\gcd(a,b,p)\)

exGCD

前置知识

  1. 定理:若 \((a,b)=1\),则 \(0\leq x<b\)\(ax\bmod b\) 互不相同,有一个是 \(1\)。证明:\(ax_1\equiv ax_2\pmod b\)\((x_1-x_2)a|b\),因为 \((a,b)=1\),所以 \((x_1-x_2)|b\),但是 \(x_1-x_2\neq 0\land -b<x_1-x_2<b\)
  2. 扩展:若 \((a, b) = d\),则 \(0\leq x<b\)\(ax\bmod b\) 的结果是 \(d\) 个模 \(b/d\) 的剩余系,即结果是 \(\{0, d, 2d, \cdots, b - d\}\) 重复 \(d\) 次。
  3. 推论:若 \((a,b)=1\),则存在 \(ax+by=1\)
  4. 裴蜀定理:\(ax+by=(a,b)\) 有解(两边同除 \((a,b)\),推论)
  5. \(a>b\to a\bmod b\leq a/2\)。所以 \(\gcd\) 的复杂度为 \(O(\log a)\)
  6. \(a\bmod b=a-\left\lfloor\frac{a}{b}\right\rfloor b\) 就是写成了 \(a,b\) 的线性组合(如果 \(\left\lfloor\frac{a}{b}\right\rfloor\) 是常数)

做法

欲求 \(ax+by=(a,b)\) 的解,首先求 \((b,a\bmod b)\) 的解,然后将 \(a\bmod b\) 换成关于 \(a,b\) 的线性组合,这样就能搞出新的 \(x,y\)

\(bx+(a\bmod b)y=bx+(a-\left\lfloor\frac{a}{b}\right\rfloor b)y\),令 $t=\left\lfloor\frac{a}{b}\right\rfloor $,则 \(bx+ay-tby=ay+b(x-ty)\)

细节

为什么不会爆 int\(|x|\leq b,|y|\leq a\)。注意边界必须是 \(x=1,y=0\),这是归纳基石。假设已求 \(bx+(a\bmod b)y\),那么新的解 \(x'=x,y'=y-tx\)swap 了),前一个明显,后一个 \(|y'|=|y|+|tx|\leq |a\bmod b|+|\left\lfloor\frac{a}{b}\right\rfloor b|\leq |a|\)

解出来的特解 \((x_0,y_0)\),那么解集恰好就是 \(\{(x_0+tb,y-ta)|t\in\bf Z\}\)

一般情况

\(ax+by=c\)

exGCD 可以求出形如 \(ax+by=\gcd(a,b)\) 的一组整数特解 \((x_0,y_0)\)

由裴蜀定理得,如果 \(\gcd(a,b)\not\mid c\) 那么直接跑路。

否则,等式两边同时乘 \(\frac{c}{\gcd(a,b)}\),得到原方程 \(ax+by=c\) 的特解 \((x_1=\frac{c}{\gcd(a,b)}\cdot x_0,y_1=\frac{c}{\gcd(a,b)}\cdot y_0)\)

考虑这么一个式子,它和原方程等价:

\[a(x_1+db)+b(y_1-da)=c. \]

显然 \(d\) 可以取到 \(\frac{1}{\gcd(a,b)}\),所以得到任意一组解 \((x,y)\) 都满足:

\[\begin{cases} x=x_1+s\cdot\frac{b}{\gcd(a,b)},\\ y=y_1-s\cdot\frac{a}{\gcd(a,b)}.\\ \end{cases} \]

所以 \(x\) 的最小的正整数解是 \(x_0\bmod \frac{b}{\gcd(a,b)}\)。我们止步于此。

code

LL mod(LL x, LL m) { return (x % m + m) % m; }
LL exgcd(LL a, LL b, LL c, LL& x, LL& y) {
  if (!b) return x = c / a, y = 0, a;
  LL res = exgcd(b, a % b, c, y, x);
  return y -= a / b * x, res;
}
LL solve(LL a, LL b, LL c) {
  LL x, y, d = exgcd(a, b, c, x, y);
  return c % d == 0 ? mod(x, b / d) : -1;
}

调用 solve(a, b, c) 能求得 \(ax+by=c\)\(x\) 的最小非负整数解,无解返回 \(-1\)

\(n\) 在模 \(P\) 意义下的逆元是 solve(n, P, 1)

(ex)CRT

problem

求这个关于 \(x\) 的方程组的最小正整数解:

\[\begin{cases} x\equiv b_1 \pmod{a_1}\\ x\equiv b_2 \pmod{a_2}\\ x\equiv b_3 \pmod{a_3}\\ \cdots\\ x\equiv b_n \pmod{a_n}\\ \end{cases} \]

CRT

适用范围:\(a_1,a_2,\cdots,a_n\) 两两互质。

做法:令 \(M=\prod a_i,m_i=M/a_i\),然后 \(t_i\) \(m_i\) 在模 \(a_i\) 意义下的逆元

答案是 \(x=\sum b_im_it_i\)。对 \(M\) 取模。

证明:考虑求 \(x\bmod a_i\),对于不是 \(i\) 的项会因为 \(a_i|m_j\) 变为 \(0\),对于 \(i\) 会因为逆元变为 \(b_i\)

逆元请用 exgcd。

exCRT

exCRT 不依赖于两两互质。(ex)CRT 给出的解集一定是 \(\pmod{\text{lcm}}\) 意义下同余某个数的集合。

考虑增量构造,我们合并两个线性同余方程组。

\[\begin{cases} x\equiv a_1\pmod{p_1}\\ x\equiv a_2\pmod{p_2} \end{cases} \Rightarrow x=a_1+m_1p_1=a_2+m_2p_2 \]

所以解方程 \(m_1p_1-m_2p_2=a_2-a_1\),根据裴蜀定理 \((p_1,p_2)|(a_2-a_1)\) 时有解,新的方程为 \(x\equiv a_3\pmod{\text{lcm}}\)。(为什么是 \(\text{lcm}\),因为模出来会有一个循环节,把两个循环周期合并就是 \(lcm\)

以下是另外一种理解方法。考虑暴力增量构造。现在考虑的方程组的 \(a_i\)\(\text{lcm}\)\(L\),当前一个合法答案为 \(x\)。加入一个新的方程组,我们不断地使得 \(x\to x+L\),等到 \(x\equiv b_i\pmod{a_i}\) 时停止。

考虑优化,设要加 \(b\) 次,解一个方程:\(x+bL\equiv b_i\pmod{a_i}\to \boxed{a_i}c+\boxed{L}b=\boxed{b_i-x}\)。等式两边有一些系数可以对 \(a_i\) 取模。然后用 exgcd 求出它的最小非负整数解。

例题

例题:https://www.luogu.com.cn/problem/P4774

因为 \(\text{lcm}(\{p_i\})\leq 10^{12}\),我们要解决若干个形如 \(a_i-xb_i\equiv 0\pmod{p_i}\) 其中 \(b_i\) 是本轮的攻击力,然后解出最小的 \(x\)。一个一个合并,与下界取 \(\max\) 即可。

乘法逆元

定义

\(ax\equiv 1\pmod p\),那么 \(x\)\(a\) 互为逆元。\(x=a^{-1}\)

前置知识

威尔逊定理:\((P-1)!\equiv-1\pmod P\)\(P\) 为质数(\(P=2\) 特判)。证明:\([1,P-1]\) 中的每个数都有自己的逆元,两两配对,除了 \(\pm 1\) 的逆元为自己,那么答案是 \(-1\)

费马小定理:质数 \(P\) 和非 \(0\) 整数 \(a\)\(a^{P-1}\equiv 1\pmod P\)。考虑 \((P-1)!a^{P-1}\equiv(a)(2a)(3a)\cdots((P-1)a)\),根据刚才 exGCD 的前置定理,又因为这里不能有 \(0\),所以这玩意恰好等于 \((P-1)!\)。因为 \((P-1)!\neq 0\),所以 \(a^{P-1}\) 就只能是 \(1\)

欧拉定理:对于 \((a,P)=1\)\(a^{\varphi(P)}\equiv 1\pmod P\)。考虑构造 \(A\) 表示 \([1,P]\) 中与 \(P\) 互质的数的乘积,再次证明 \(A\times a^{\varphi(P)}\equiv A\)。继续进行配对(上面能找到下面,下面能找到上面,就相等了,或者扩展一下 exGCD 前置定理的证明)。

求法和应用

求法:exGCD(与模数互质)或者费马小定理(\(P\) 为质数,\(a^{P-2}\))。

线性求逆元:需要逆元存在,\(x^{-1}\equiv -\left\lfloor P/x\right\rfloor(P\bmod x)^{-1}\pmod P\)。递推即可。如果单点求值,复杂度是 open problem,听说有上界 \(O(m^{1/3})\)

例题:给定质数 \(P\),多次询问 \(\binom n m\bmod P\)\(n,m\leq 10^6,P\leq 10^9\)。预处理阶乘逆元即可。

例题:给 \(10^7\) 个数,求它们对 \(P=998244353\) 的逆元。注意到 \(\frac{1}{x}=\frac{(x-1)!}{x!}\)。类似的定义,做前缀积和前缀积逆元。\(O(n+\log p)\) 只用求最后一项前缀积的逆元。

有一种特殊的求 \(\pmod {2^{32}}\) 的逆元方法,类似牛顿迭代。见下:

对于整数 \(n\),记它在 \(\bmod 2^{2^k}\) 的逆元为 \(I_k\),注意观察,\(nI_k(2-nI_k)\equiv 1\pmod {2^{2^{k+1}}}\),因为若设 \(nI_k=t2^{2^k}+1\),则有 \(nI_k(2-nI_k)\equiv (1+t2^{2^k})(1-t2^{2^k})\equiv 1-t^22^{2^{k+1}}\equiv 1\pmod{2^{2^{k+1}}}\)

Lucas

形式

\[\binom n m\equiv \binom{\left\lfloor n/P\right\rfloor}{\left\lfloor m/P\right\rfloor}\binom{n\bmod P}{m\bmod P}\pmod P. \]

质数 \(P\)。就是把 \(n,m\) 看成 \(P\) 进制,每一位的组合数结果的乘积。如果有上面的小于下面的,整个就是 \(0\) 了。

证明

二项式定理:\(\displaystyle(1+x)^n=\sum\limits_{0\leq i\leq n}\binom n i x^i\)

引理:\((1+x)^P\equiv 1+x^P\pmod P\)。这是因为除了 \(i\in\{0,P\}\) 外,\(\binom P i=\frac{P!}{i!(P-i)!}\),上面有 \(P\),下面没有,那么它是 \(P\) 的倍数,模 \(P\) 等于 \(0\)推广到 \((a+b)^P\equiv a^P+b^P\pmod P\) 也适用,\(a, b\) 不在 \(\mathbb F_{P}\) 上也适用

使用生成函数证明原命题:

\[\binom n m=[x^m](1+x)^n=(1+x)^{n\bmod P}[(1+x)^P]^{\left\lfloor n/P\right\rfloor}\\ \equiv[x^m](1+x)^{n\bmod P}(1+x^P)^{\left\lfloor n/P\right\rfloor}\\ =[x^m]\sum_{i}\binom{n\bmod P}{i}x^i\sum_{j}\binom{\left\lfloor n/P\right\rfloor}{j}x^{jP}\\ =[x^m]\sum_{i}\sum_{j}\binom{n\bmod P}{i}\binom{\left\lfloor n/P\right\rfloor}{j}x^{jP+i}\\ =\sum_{i=m\bmod P}\sum_{j=\left\lfloor m/P\right\rfloor}\binom{n\bmod P}{i}\binom{\left\lfloor n/P\right\rfloor}{j}\\ =\binom{\left\lfloor n/P\right\rfloor}{\left\lfloor m/P\right\rfloor}\binom{n\bmod P}{m\bmod P}\pmod P. \]

应用

\(\binom n m\equiv\) (n & m) == m \(\pmod 2\)。或者认为是 \([m\subseteq n]\),集合幂级数意义下的。

例题:https://www.luogu.com.cn/problem/solution/P2480\(P-1\) 分解质因数之后逐个 Lucas 之后 (ex)CRT 合并。

BSGS

离散对数问题:\(a,b,P\),求 \(a^t\equiv b\pmod P\),或者说 \(t\equiv\log_a b\pmod P\)

\(P\) 为质数时 BSGS(根号分治)即可。好像任意模数直接做到 \(2\varphi(P)\) 就行。这里略过了。本质是对数位两半 meet in the middle。

大概写一下 BSGS 的过程,就是令 \(B=\left\lceil\sqrt P\right\rceil\)\(a^t=a^{Bx-y}\equiv b\implies (a^B)^x\equiv a^yb\),两边各 \(B\) 个值,其中一边插入哈希表,另一边逐个在哈希表中查询。

阶与原根

定义

\(x\)\(m\) 的阶:最小的 \(t\) 使得 \(x^t=1\pmod m\)(一个最小的周期,循环节长度)

\(m\) 的原根:模 \(m\) 的阶为 \(\varphi(m)\) 的数。设为 \(g\)\(m\) 是质数时,\(g^t\)\([1,m-1]\) 形成双射。所以可以取对数了,乘法变加法,\(\log ab=\log a+\log b\)

求法

一个数 \(m\) 存在原根当且仅当 \(m=2,4,p^a,2p^a\) 其中 \(p\) 为奇素数,最小原根的大小为 \(O(m^{\frac{1}{4}})\)

引理:一个数模 \(m\) 的阶存在,那么它一定是 \(\varphi(m)\) 的约数。因为阶就是循环节,证明:\(x=g^t,g^{\varphi(m)}=1,x^a=g^{ta}=1\) 时,\(\varphi(m)|ta\)\(a|\varphi(m)\)。此时 \(a=\frac{\varphi(m)}{\gcd(\varphi(m),t)}\)

\(m\geq 3,(g,m)=1\),则 \(g\) 是模 \(m\) 的原根的充要条件是:对于 \(\varphi(m)\) 的每个素因数 \(p\),都有 \(g^{\frac{\varphi(m)}{p}}\not\equiv 1\pmod m\)。因为如果那个东西一旦成立,说明 \(g\) 的阶是 \(\frac{\varphi(m)}{p}\) 的约数,就一定不是 \(\varphi(m)\) 了。于是暴力判断即可。

推论:若一个数 \(m\) 有原根,则它原根的个数为 \(\varphi(\varphi(m))\)。证明:设最小原根 \(g\),设另一个原根 \(x=g^t\),则 \(g^{ta}=1\) 的最小正整数解应为 \(a=\varphi(m)\),又因为 \(\varphi(m)|ta\),所以 \((t,\varphi(m))=1\),所以合法的 \(t\) 只有 \(\varphi(\varphi(m))\) 个,对应这么多个原根。

auto divide(int m) {
  vector<int> vec;
  for (int i = 2; i * i <= m; i++) {
    if (m % i) continue;
    vec.push_back(i);
    while (m % i == 0) m /= i;
  }
  if (m > 1) vec.push_back(m);
  return vec;
}
template <class mint>
mint findrt() { // mint::mod is a prime
  auto dvs = divide(mint::mod - 1);
  for (int g = 1; g < mint::mod; g++) {
    auto chk = [&]() {
      for (int p : dvs) {
        if (qpow(mint(g), (mint::mod - 1) / p) == 1) {
          return false;
        }
      }
      return true;
    };
    if (chk()) return g;
  }
  throw "No solution";
}

应用

\(998244353\) 的最小原根为 \(3\)\(1004535809\) 的最小原根也为 \(3\)

AGC047C:\(c_k=\sum_{ij\equiv k\pmod m}a_ib_j\) 的卷积,如果 \(m\) 为质数,那么求一个原根,将所有下标同时取离散对数,变为加法卷积。

posted @ 2023-07-29 11:55  caijianhong  阅读(12)  评论(0编辑  收藏  举报