Loading

初等数论漫谈/学习记录

八个月前浅尝辄止地碰了一下初等数论,写了一大堆零零散散的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+(ab×ab)y=gcd(a,b)

bx+ayb×aby=gcd(a,b)

ay+b×(xaby)=gcd(a,b)

(y,xaby) 即为所求。整个递归过程只需要在普通欧几里得算法的基础上稍加修改即可,边界为 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,y0k×ag)

逆元

22.11.12

  • 对于 a,mN,称满足 a×x1(modm)xa1(modm)xa 在膜 m 意义下的逆元。

  • 逆元存在的充要条件:gcd(a,m)=1

解法一:费马小定理 (mP)

  • 费马小定理:对于 pP,有 ap11(modp)

  • 由费马小定理有 a×ap21(modp),即 ap2a 在膜 p 意义下的逆元。

  • 实现:快速幂,O(logp)

解法二:欧拉定理

  • 欧拉定理:对于 gcd(a,m)=1,有 aφ(m)1(modm)

  • 由欧拉定理有 a×aφ(m)11(modm),即 aφ(m)1a 在膜 m 意义下的逆元。

  • 实现:O(m) 预处理 φ,快速幂 O(logφ(m))

  • 模数不统一时需要 O() 预处理 φ

解法三:exgcd

  • 由逆元定义有 a×x1(modm),即有不定方程 ax+my=1,可使用 exgcd 求解。

  • 解出的 x 即为 a 在膜 m 意义下的逆元。

  • 实现:exgcd,均摊 O(1),最坏 O(logm)

线性求逆元

O(n) 时间内打出 1n 在膜 p 意义下的逆元,一般来说 p 为质数。

现在我们要求 k 在膜 p 意义下的逆元 invkinv1=1k>1

a=pkb=pmodk,有 ak+b=p

b×invb1(modp),

(pak)×invb1(modp)

p×invbak×invb1(modp)

ak×invb1(modp)

ak×invpmodk1(modp)

pk×k×invpmodk1(modp)

invkpk×invpmodk(modp)

(ppk)×invpmodk(modp)

CRT+ex

21.11.21

China Remaining Theorem,中国剩余定理,可以在 O(n) 时间内求解形如

{xa1(modm1)xa2(modm2)xan(modmn)ij,gcd(mi,mj)=1

的模数互质的同余方程组。

结论

S=i=1nmi

Mi=Smi

TiMi 在模 mi 意义下的逆元,即 Mi×Ti1(modmi)

我们可以瞎 jb 构造出一个特解

x0=i=1nai×Mi×Ti

通解即为 x=x0+k×S(kZ)

证明

读者自证不难

由特解推通解的过程不用证了吧。。。

对于特解 x0 正确性的证明:

我们设 fi=ai×Mi×Ti

i,有

x0=fi+jifj


ji

mi|Mj=Smj

mi|fj

fj0(modmi)


i,有

x0fi+ji0fi(modmi)


进一步地,

Mi×Ti1(modmi)

fiai×1ai(modmi)


i,有

x0ai(modmi)

证毕。

exCRT

21.11.22

exCRT,即扩展中国剩余定理,是可以在 O(n) 时间内求解形如

{xa1(modm1)xa2(modm2)xan(modmn)

的一次同余方程组的方法,对 mi 间的关系没有特殊要求。

该方法与 CRT 的思路与实现没有任何关系,不需要 CRT 的前置知识。

思路

我们把这 n 个同余方程两两合并起来,即重复一下操作 n1 次:

  • 选择两个未被选过的同余方程,构成一个同余方程组

{xa1(modm1)xa2(modm2)

  • 把这两个同余方程合并,即找到一组 a,m,使得

{xa1(modm1)xa2(modm2)xa(modm)

  • 然后把原来的两个同余方程删去,把合并得到的同余方程 xa(modm) 加入,其可以被选中参与之后的合并。

每次合并都会使同余方程组内的方程个数减少 1 个,因此最后只会剩下一个同余方程

xa(modm)

x=amodm 即为原方程组的最小非负整数解。

合并过程

设我们正在合并一个同余方程组

{xa1(modm1)xa2(modm2)

很明显地,合并后的 m=lcm(m1,m2)

我们设

x=k1m1+a1=k2m2+a2

k1m1k2m2=a2a1

这是一个简单的二元不定方程组,可以直接求解。

解出 (k1,k2) 后,将其代回便能得到 xmodm 的余数,完成合并。

代码实现有一定细节,故放出:

void merge(int i){
    //把第i个同余方程和第i+1个合并 
    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;//对 m' 取模
}

欧拉定理+ex

22.12.02

欧拉定理

结论

对于 gcd(a,m)=1aφ(m)1(modm)

证明

xi,,φ(m) 表示 <m 的正整数中所有与 m 互质的数, pi=a×xi

igcd(a,m)=gcd(xi,m)=1,gcd(pi=a×xi,m)=1


ij

  • pipja×(xixj)

  • xixj0(modm),gcd(a,m)=1

  • pipj0(modm)

ijpipj(modm)


i,由欧几里得,gcd(m,pimodm)=gcd(pi,m)=1

igcd(pimodm,m)=1


综上,有 pimodm 的值为 <m 的整数,两两不同 且 都与 m 互质,

p1,,φ(m)modm x1,,φ(m) 一一对应,

i=1φ(m)pii=1φ(m)xi(modm)

(i=1φ(m)a)×(i=1φ(m)xi)i=1φ(m)xi(modm)

i=1φ(m)a1(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))

abak×φ(m)×ar(aφ(m))k×ar1k×ararabmodφ(m)(modm)

case2:b<φ(m)

略。

case3:bφ(m)

对于任意质数 p


m=pr×srm 含质因子 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)+rpr(modm)


xr

pxpxr×pr

pxr×pφ(m)+r

px+φ(m)(modm)

xrpxpx+k×φ(m)(modm)(kN)


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)+(k1)×φ(m)+y

φ(m)+yrk1N 由 ① 有

pbpφ(m)+yp(bmodφ(m))+φ(m)(modm)


a=pipi 为质数,有

ab=pib

pi(bmodφ(m))+φ(m)

(pi)(bmodφ(m))+φ(m)

a(bmodφ(m))+φ(m)(modm)

BSGS+ex

21.12.06

BSGS

BSGS,全名 Baby-Step Giant-Step,可以在 O(m) 时间内求

axb(modm)(gcd(a,m)=1)

的正整数解。

思路

gcd(a,m)=1,aφ(m)1(modm)

原方程在 [0,φ(m)1] 内有且仅有一个整数解 x0

通解为 x0+k×φ(m)(kN)

所以我们只需以一种优雅的方式枚举 0m 的所有 x,就必然能求出 x0,进而推出原方程的通解。


正如本算法的名字,我们设

{t=mx=i×tj(1it,0jt1,{i,j}Z)

我们先特判 b1(modm):该情况下,显然有 x0=0

对于其他情况,我们枚举所有范围内的 i,j,便能覆盖 [1,m] 之间的所有 x

我们有

ai×tjb(modm)

两边同乘 aj,有

ai×tb×aj(modm)

注意,gcd(a,m)=1 使得这两个式子等价


我们可以枚举 [0,t1] 之间的 j,用哈希表建立起 (b×ajmodm)j 的关系,

然后枚举 [1,t] 之间的 i,判断哈希表中是否有 ai×tj

如果有,那么 i×tjmodφ(m) 即为所求的 x0

exBSGS

咕咕咕……

posted @   Albertvαn  阅读(51)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示