八个月前浅尝辄止地碰了一下初等数论,写了一大堆零零散散的blog,想了想最好还是把它们整理一下,顺便补充一点当时没学到/没写到的内容。
以下讨论对象均为整数。
exgcd
21.11.02
即扩展欧几里得,可以以普通欧几里得的复杂度求出关于 x,y 的不定方程 ax+by=gcd(a,b) 的一组特解。
假设我们递归求出了 bx+(amodb)y=gcd(b,amodb) 的一组解 (x′,y′),则
bx′+(amodb)y′=gcd(b,amodb)
欧几里得告诉我们 gcd(a,b)=gcd(b,amodb),所以
bx′+(amodb)y′=gcd(a,b)
bx′+(a−b×⌊ab⌋)y′=gcd(a,b)
bx′+ay′−b×⌊ab⌋y′=gcd(a,b)
ay′+b×(x′−⌊ab⌋y′)=gcd(a,b)
(y′,x′−⌊ab⌋y′) 即为所求。整个递归过程只需要在普通欧几里得算法的基础上稍加修改即可,边界为 b=0 时 (x,y)=(1,0)。
struct pair{
int x,y;
};
pair exgcd(int a,int b){
if(!b) return (pair){1,0};
pair res=exgcd(b,a%b);
return (pair){res.y,res.x-a/b*res.y};
}
二元一次不定方程
22.11.23
解形如 ax+by=c 的二元一次不定方程的通法:
-
设 g=gcd(a,b),原方程有整数解的充要条件为 g|c。
-
使用 exgcd
解出 ax′+by′=g 的整数解 (x′,y′)。
-
原方程的一组特解即为 (x0,y0)=(x′×cg,y′×cg),
-
通解为 (x,y)=(x0+k×bg,y0−k×ag)。
逆元
22.11.12
-
对于 a,m∈N∗,称满足 a×x≡1(modm) 即 x≡a−1(modm) 的 x 为 a 在膜 m 意义下的逆元。
-
逆元存在的充要条件:gcd(a,m)=1。
解法一:费马小定理 (m∈P)
解法二:欧拉定理
-
欧拉定理:对于 gcd(a,m)=1,有 aφ(m)≡1(modm)。
-
由欧拉定理有 a×aφ(m)−1≡1(modm),即 aφ(m)−1 为 a 在膜 m 意义下的逆元。
-
实现:O(√m) 预处理 φ,快速幂 O(logφ(m))。
-
模数不统一时需要 O(模数值域) 预处理 φ。
解法三:exgcd
-
由逆元定义有 a×x≡1(modm),即有不定方程 ax+my=1,可使用 exgcd 求解。
-
解出的 x 即为 a 在膜 m 意义下的逆元。
-
实现:exgcd
,均摊 O(1),最坏 O(logm)。
线性求逆元
在 O(n) 时间内打出 1→n 在膜 p 意义下的逆元,一般来说 p 为质数。
现在我们要求 k 在膜 p 意义下的逆元 invk。inv1=1,∀k>1:
设 a=⌊pk⌋,b=pmodk,有 ak+b=p。
∵b×invb≡1(modp),
∴(p−ak)×invb≡1(modp),
∴p×invb−ak×invb≡1(modp),
∴−ak×invb≡1(modp),
∴−ak×invpmodk≡1(modp),
∴−⌊pk⌋×k×invpmodk≡1(modp),
∴invk≡−⌊pk⌋×invpmodk(modp)
≡(p−⌊pk⌋)×invpmodk(modp)。
CRT+ex
21.11.21
即 China Remaining Theorem
,中国剩余定理,可以在 O(n) 时间内求解形如
⎧⎪
⎪
⎪
⎪
⎪⎨⎪
⎪
⎪
⎪
⎪⎩x≡a1(modm1)x≡a2(modm2)⋯x≡an(modmn)∀i≠j,gcd(mi,mj)=1
的模数互质的同余方程组。
结论
设 S=∏ni=1mi,
Mi=Smi,
Ti 为 Mi 在模 mi 意义下的逆元,即 Mi×Ti≡1(modmi)。
我们可以瞎 jb 构造出一个特解
x0=n∑i=1ai×Mi×Ti
通解即为 x=x0+k×S(k∈Z)。
证明
读者自证不难
由特解推通解的过程不用证了吧。。。
对于特解 x0 正确性的证明:
我们设 fi=ai×Mi×Ti。
则 ∀i,有
x0=fi+∑j≠ifj
∀j≠i,
∵mi|Mj=Smj,
∴mi|fj,
∴fj≡0(modmi),
∴∀i,有
x0≡fi+∑j≠i0≡fi(modmi)
进一步地,
∵Mi×Ti≡1(modmi),
∴fi≡ai×1≡ai(modmi),
∴∀i,有
x0≡ai(modmi)
证毕。
exCRT
21.11.22
exCRT
,即扩展中国剩余定理,是可以在 O(n) 时间内求解形如
⎧⎪
⎪
⎪⎨⎪
⎪
⎪⎩x≡a1(modm1)x≡a2(modm2)⋯x≡an(modmn)
的一次同余方程组的方法,对 mi 间的关系没有特殊要求。
该方法与 CRT
的思路与实现没有任何关系,不需要 CRT
的前置知识。
思路
我们把这 n 个同余方程两两合并起来,即重复一下操作 n−1 次:
{x≡a1(modm1)x≡a2(modm2)
- 把这两个同余方程合并,即找到一组 a′,m′,使得
{x≡a1(modm1)x≡a2(modm2)⟺x≡a′(modm′)
- 然后把原来的两个同余方程删去,把合并得到的同余方程 x≡a′(modm′) 加入,其可以被选中参与之后的合并。
每次合并都会使同余方程组内的方程个数减少 1 个,因此最后只会剩下一个同余方程
x≡a(modm)
x=amodm 即为原方程组的最小非负整数解。
合并过程
设我们正在合并一个同余方程组
{x≡a1(modm1)x≡a2(modm2)
很明显地,合并后的 m′=lcm(m1,m2)。
我们设
x=k1m1+a1=k2m2+a2
有
k1m1−k2m2=a2−a1
这是一个简单的二元不定方程组,可以直接求解。
解出 (k1,k2) 后,将其代回便能得到 xmodm′ 的余数,完成合并。
代码实现有一定细节,故放出:
void merge(int i){
int k=ind_equation(m[i],m[i+1],a[i+1]-a[i]).x;
int d=lcm(m[i],m[i+1]);m[i+1]=d;
a[i+1]=((fmul(k,m[i],d)+a[i])%d+d)%d;
}
欧拉定理+ex
22.12.02
欧拉定理
结论
对于 gcd(a,m)=1,aφ(m)≡1(modm)。
证明
设 xi,⋯,φ(m) 表示 <m 的正整数中所有与 m 互质的数, pi=a×xi,
∀i,∵gcd(a,m)=gcd(xi,m)=1,∴gcd(pi=a×xi,m)=1。
∀i≠j,
-
pi−pj≡a×(xi−xj),
-
∵xi−xj≢0(modm),gcd(a,m)=1,
-
∴pi−pj≢0(modm),
∴∀i≠j,pi≢pj(modm);
∵∀i,由欧几里得,gcd(m,pimodm)=gcd(pi,m)=1,
∴∀i,gcd(pimodm,m)=1。
综上,有 pimodm 的值为 <m 的整数,两两不同 且 都与 m 互质,
即 p1,⋯,φ(m)modm 与 x1,⋯,φ(m) 一一对应,
∴φ(m)∏i=1pi≡φ(m)∏i=1xi(modm)
∴(φ(m)∏i=1a)×(φ(m)∏i=1xi)≡φ(m)∏i=1xi(modm)
∴φ(m)∏i=1a≡1(modm)
∴aφ(m)≡1(modm)
扩展欧拉定理
结论
ab≡⎧⎪⎨⎪⎩abmodφ(m)gcd(a,m)=1abb<φ(m)a(bmodφ(m))+φ(m)b≥φ(m)
证明
case1:gcd(a,m)=1
由普通欧拉定理有 aφ(m)≡1(modm)。
设 b=k×φ(m)+r(k=⌊bφ(m)⌋,r=bmodφ(m)),
则 ab≡ak×φ(m)×ar≡(aφ(m))k×ar≡1k×ar≡ar≡abmodφ(m)(modm)。
case2:b<φ(m)
略。
case3:b≥φ(m)
对于任意质数 p:
设 m=pr×s,r 为 m 含质因子 p 的个数,即 gcd(p,s)=gcd(pr,s)=1。
据普通欧拉定理,有 pφ(s)≡1(mods),
又据欧拉函数性质,φ(m)=φ(s)×φ(pr),
∴pφ(m)=pφ(s)×φ(pr)=(pφ(s))φ(pr)≡1φ(pr)≡1(mods)。
设 pφ(m)=k×s+1,
有 pφ(m)+r=(k×s+1)×pr
=k×s×pr+pr=k×m+pr,
∴pφ(m)+r≡pr(modm)。
∴∀x≥r,
px≡px−r×pr
≡px−r×pφ(m)+r
≡px+φ(m)(modm),
∴∀x≥r,px≡px+k×φ(m)(modm)(k∈N)。①
∵pr|m,∴φ(m)≥φ(pr),
同时有 φ(pr)≥r(这个东西可以感性理解)。
同时考虑到 b≥φ(m),有
b≥φ(m)≥φ(pr)≥r
设 b=k×φ(m)+y(k=⌊bφ(m)⌋≥1,y=bmodφ(m)),
有 b=φ(m)+(k−1)×φ(m)+y,
∵φ(m)+y≥r 且 k−1∈N,∴ 由 ① 有
pb≡pφ(m)+y≡p(bmodφ(m))+φ(m)(modm)。
设 a=∏pi,pi 为质数,有
ab=∏pbi
≡∏p(bmodφ(m))+φ(m)i
≡(∏pi)(bmodφ(m))+φ(m)
≡a(bmodφ(m))+φ(m)(modm)。
BSGS+ex
21.12.06
BSGS
BSGS
,全名 Baby-Step Giant-Step
,可以在 O(√m) 时间内求
ax≡b(modm)(gcd(a,m)=1)
的正整数解。
思路
∵gcd(a,m)=1,aφ(m)≡1(modm),
∴ 原方程在 [0,φ(m)−1] 内有且仅有一个整数解 x0,
通解为 x0+k×φ(m)(k∈N)。
所以我们只需以一种优雅的方式枚举 0→m 的所有 x,就必然能求出 x0,进而推出原方程的通解。
正如本算法的名字,我们设
{t=⌈√m⌉x=i×t−j(1≤i≤t,0≤j≤t−1,{i,j}∈Z)
我们先特判 b≡1(modm):该情况下,显然有 x0=0。
对于其他情况,我们枚举所有范围内的 i,j,便能覆盖 [1,m] 之间的所有 x。
我们有
ai×t−j≡b(modm)
两边同乘 aj,有
ai×t≡b×aj(modm)
注意,gcd(a,m)=1 使得这两个式子等价。
我们可以枚举 [0,t−1] 之间的 j,用哈希表建立起 (b×ajmodm)→j 的关系,
然后枚举 [1,t] 之间的 i,判断哈希表中是否有 ai×t→j,
如果有,那么 i×t−jmodφ(m) 即为所求的 x0。
exBSGS
咕咕咕……
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义