【笔记】数论:同余相关 2023.7.29

7.29 数论

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

ab(modp)adbd(modpd),d=gcd(a,b,p)

exGCD

前置知识

  1. 定理:若 (a,b)=1,则 0x<baxmodb 互不相同,有一个是 1。证明:ax1ax2(modb)(x1x2)a|b,因为 (a,b)=1,所以 (x1x2)|b,但是 x1x20b<x1x2<b
  2. 扩展:若 (a,b)=d,则 0x<baxmodb 的结果是 d 个模 b/d 的剩余系,即结果是 {0,d,2d,,bd} 重复 d 次。
  3. 推论:若 (a,b)=1,则存在 ax+by=1
  4. 裴蜀定理:ax+by=(a,b) 有解(两边同除 (a,b),推论)
  5. a>bamodba/2。所以 gcd 的复杂度为 O(loga)
  6. amodb=aabb 就是写成了 a,b 的线性组合(如果 ab 是常数)

做法

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

bx+(amodb)y=bx+(aabb)y,令 t=ab,则 bx+aytby=ay+b(xty)

细节

为什么不会爆 int|x|b,|y|a。注意边界必须是 x=1,y=0,这是归纳基石。假设已求 bx+(amodb)y,那么新的解 x=x,y=ytxswap 了),前一个明显,后一个 |y|=|y|+|tx||amodb|+|abb||a|

解出来的特解 (x0,y0),那么解集恰好就是 {(x0+tb,yta)|tZ}

一般情况

ax+by=c

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

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

否则,等式两边同时乘 cgcd(a,b),得到原方程 ax+by=c 的特解 (x1=cgcd(a,b)x0,y1=cgcd(a,b)y0)

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

a(x1+db)+b(y1da)=c.

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

{x=x1+sbgcd(a,b),y=y1sagcd(a,b).

所以 x 的最小的正整数解是 x0modbgcd(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=cx 的最小非负整数解,无解返回 1

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

(ex)CRT

problem

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

{xb1(moda1)xb2(moda2)xb3(moda3)xbn(modan)

CRT

适用范围:a1,a2,,an 两两互质。

做法:令 M=ai,mi=M/ai,然后 ti mi 在模 ai 意义下的逆元

答案是 x=bimiti。对 M 取模。

证明:考虑求 xmodai,对于不是 i 的项会因为 ai|mj 变为 0,对于 i 会因为逆元变为 bi

逆元请用 exgcd。

exCRT

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

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

{xa1(modp1)xa2(modp2)x=a1+m1p1=a2+m2p2

所以解方程 m1p1m2p2=a2a1,根据裴蜀定理 (p1,p2)|(a2a1) 时有解,新的方程为 xa3(modlcm)。(为什么是 lcm,因为模出来会有一个循环节,把两个循环周期合并就是 lcm

以下是另外一种理解方法。考虑暴力增量构造。现在考虑的方程组的 ailcmL,当前一个合法答案为 x。加入一个新的方程组,我们不断地使得 xx+L,等到 xbi(modai) 时停止。

考虑优化,设要加 b 次,解一个方程:x+bLbi(modai)aic+Lb=bix。等式两边有一些系数可以对 ai 取模。然后用 exgcd 求出它的最小非负整数解。

例题

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

因为 lcm({pi})1012,我们要解决若干个形如 aixbi0(modpi) 其中 bi 是本轮的攻击力,然后解出最小的 x。一个一个合并,与下界取 max 即可。

乘法逆元

定义

ax1(modp),那么 xa 互为逆元。x=a1

前置知识

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

费马小定理:质数 P 和非 0 整数 aaP11(modP)。考虑 (P1)!aP1(a)(2a)(3a)((P1)a),根据刚才 exGCD 的前置定理,又因为这里不能有 0,所以这玩意恰好等于 (P1)!。因为 (P1)!0,所以 aP1 就只能是 1

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

求法和应用

求法:exGCD(与模数互质)或者费马小定理(P 为质数,aP2)。

线性求逆元:需要逆元存在,x1P/x(Pmodx)1(modP)。递推即可。如果单点求值,复杂度是 open problem,听说有上界 O(m1/3)

例题:给定质数 P,多次询问 (nm)modPn,m106,P109。预处理阶乘逆元即可。

例题:给 107 个数,求它们对 P=998244353 的逆元。注意到 1x=(x1)!x!。类似的定义,做前缀积和前缀积逆元。O(n+logp) 只用求最后一项前缀积的逆元。

有一种特殊的求 (mod232) 的逆元方法,类似牛顿迭代。见下:

对于整数 n,记它在 mod22k 的逆元为 Ik,注意观察,nIk(2nIk)1(mod22k+1),因为若设 nIk=t22k+1,则有 nIk(2nIk)(1+t22k)(1t22k)1t222k+11(mod22k+1)

Lucas

形式

(nm)(n/Pm/P)(nmodPmmodP)(modP).

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

证明

二项式定理:(1+x)n=0in(ni)xi

引理:(1+x)P1+xP(modP)。这是因为除了 i{0,P} 外,(Pi)=P!i!(Pi)!,上面有 P,下面没有,那么它是 P 的倍数,模 P 等于 0推广到 (a+b)PaP+bP(modP) 也适用,a,b 不在 FP 上也适用

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

(nm)=[xm](1+x)n=(1+x)nmodP[(1+x)P]n/P[xm](1+x)nmodP(1+xP)n/P=[xm]i(nmodPi)xij(n/Pj)xjP=[xm]ij(nmodPi)(n/Pj)xjP+i=i=mmodPj=m/P(nmodPi)(n/Pj)=(n/Pm/P)(nmodPmmodP)(modP).

应用

(nm) (n & m) == m (mod2)。或者认为是 [mn],集合幂级数意义下的。

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

BSGS

离散对数问题:a,b,P,求 atb(modP),或者说 tlogab(modP)

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

大概写一下 BSGS 的过程,就是令 B=Pat=aBxyb(aB)xayb,两边各 B 个值,其中一边插入哈希表,另一边逐个在哈希表中查询。

阶与原根

定义

xm 的阶:最小的 t 使得 xt=1(modm)(一个最小的周期,循环节长度)

m 的原根:模 m 的阶为 φ(m) 的数。设为 gm 是质数时,gt[1,m1] 形成双射。所以可以取对数了,乘法变加法,logab=loga+logb

求法

一个数 m 存在原根当且仅当 m=2,4,pa,2pa 其中 p 为奇素数,最小原根的大小为 O(m14)

引理:一个数模 m 的阶存在,那么它一定是 φ(m) 的约数。因为阶就是循环节,证明:x=gt,gφ(m)=1,xa=gta=1 时,φ(m)|taa|φ(m)。此时 a=φ(m)gcd(φ(m),t)

m3,(g,m)=1,则 g 是模 m 的原根的充要条件是:对于 φ(m) 的每个素因数 p,都有 gφ(m)p1(modm)。因为如果那个东西一旦成立,说明 g 的阶是 φ(m)p 的约数,就一定不是 φ(m) 了。于是暴力判断即可。

推论:若一个数 m 有原根,则它原根的个数为 φ(φ(m))。证明:设最小原根 g,设另一个原根 x=gt,则 gta=1 的最小正整数解应为 a=φ(m),又因为 φ(m)|ta,所以 (t,φ(m))=1,所以合法的 t 只有 φ(φ(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 的最小原根为 31004535809 的最小原根也为 3

AGC047C:ck=ijk(modm)aibj 的卷积,如果 m 为质数,那么求一个原根,将所有下标同时取离散对数,变为加法卷积。

posted @   caijianhong  阅读(45)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示