【学习笔记】离散对数和剩余

Page Views Count

离散对数#

给定 a,p,b,求解:

axb(modp)

BSGS#

gcd(a,p)=1 时,a 在模 p 意义下有逆元,因此可以将 x 视作 cBd,其中 B=p,经过移项等价于:

acBbad(modp)

unordered_map 存等式右边的答案,这样从大到小枚举 c 即可找出最小自然数解。时间复杂度 O(p)。注意 x=0 的情况需要特判。

exBSGS#

gcd(a,p)=d1 时,考虑 ax=kp+b,那么等式同除 d 应当解不变,所以有解必要条件是 db

a=ad,b=bd,p=pd,那么方程变成:

aax1b(modp)

a 求逆元移项,因为 p 不一定是质数,所以要用扩展欧几里得求逆元,变成:

ax1ba1(modp)

gcd(a,p) 未必为 1,需要递归处理子问题直到可以用 BSGS 求解,答案只需要再加上递归轮数。

在过程中需要考虑 pa 以及 b=1 的情况。

递归过程每次至少除去 p 的一个质因子,因此时间复杂度 O(log2p+p)

阶与原根#

称所有与 m 互质的数构成模 m 的简化剩余系,则剩余系的元素构成了模 m 的乘法循环群。

#

定义 a 在模 m 意义下的阶 δm(a) 为时 ax1(modm) 的最小正整数解。发现阶存在的充要条件是 gcd(a,m)=1

阶的一个显然的性质:ax1(modm) 的充要条件是 δm(a)x。充分性显然,必要性即取 0<xmodδm(a) 是更小的指数。

阶的一个比较重要的性质:δm(ak)=δm(a)gcd(δm(a),k)=lcm(δm(a),k)k。第二个等号是显然的,只证明第一个等号。发现 (ak)xakx1(modm),因此 δm(a)kδm(ak),且 δm(ak) 是满足条件的最小值,即 δm(a)gcd(δm(a),k)

原根#

gcd(g,m)=1δm(g)=φ(m),则称 gm 的原根。这说明 g[0,φ(m)) 次恰好取遍模 m 简化剩余系的所有数。因此涉及乘方的问题都可以转成原根的若干次幂,从而忽略底数只考虑指数相等,化简了问题。

原根判定定理#

gm 的原根当且仅当对于 φ(m) 的所有质因子 pgφ(m)p1(modm)。必要性显然,充分性可以由阶的性质得到,因为若 g 不是原根则必定有 δm(g)φ(m)p,其中 p 是某个 φ(m) 的质因子。

与此同时,数学家证明出最小原根的级别在 O(m0.25),因此可以 O(m0.25ω(m)logm) 求出最小的原根,复杂度完全可以接受。

原根存在定理#

不是所有的数 m 都有原根,实际只有 2,4,pc,2pc 才有原根,其中 p 是任意奇素数。证明略。

原根个数#

由于其他原根都被表示成某个原根 g 的幂,所以若 δm(gk)=φ(m),则 gk 也是原根。

根据阶的性质:δm(gk)=δm(g)gcd(δm(g),k)=φ(m)gcd(φ(m),k),因此所有与 φ(m) 互质的 k 都对应一个原根,有 φ(φ(m)) 个原根。

剩余#

给定 a,p,k,求解:

xka(modp)

存在解 x,则称 apk 次剩余,否则称 apk 次非剩余。

这篇博客只介绍用原根求解奇素数高次剩余以及奇素数二次剩余。

利用原根求解#

p 是奇素数,有原根 g,可以将方程写成:

(gc)ab(modp)

这样转成了离散对数问题,容易 BSGS O(p) 求解。

另一个做法是将 b 也转成 gd 之后解 acd(modφ(p)),当然转的过程中也需要 BSGS 找到 d

同时可以求出所有解,解出 c 后容易得到:

xagac+kφ(p)b(modp)

要求 akφ(p),于是 agcd(a,φ(p))k,直接枚举 agcd(a,φ(p)) 的倍数即可。

注意要求 p 是奇素数而不是上面原根存在定理中的所有存在原根的数。原因是 x 能被原根表示就一定要在简化剩余系中,也就是与 p 互质,而 x 作为未知数,就只能 p 是奇素数了。

劣势是单次 O(p) 的复杂度过高。

二次剩余#

给定 a,p,其中 p 是奇素数,求解:

x2a(modp)

欧拉判别法和勒让德符号#

先忽略 pa 的情况,那么 a[1,p1]。取 p 原根 g,记 x=gy,a=gb,应当有 g2ygb(modp),所以 2yb(modφ(p)),而 φ(p)=p1 是偶数,那么有解的充要条件是 2b

所以对于每个二次剩余 a,应当存在两个根互为相反数,因此 [1,p1] 中一对相反数可以得到一个二次剩余,故 p 的二次剩余与非二次剩余各有 p12 个。

欧拉判别法:

ap12{0(modp)pa1(modp)pax,x2a(modp)1(modp)otherwise

这里证明可以先利用费马小定理:

ap11(ap12+1)(ap121)0(modp)

于是 ap1211 中的一个数同余。同时 a=gb,若 a 是二次剩余则 2b,从而 ap12(gp1)b21(modp)。而在其他情况下只能与 1 同余。

勒让德符号:

(ap)={0pa1pax,x2a(modp)1otherwise

所以欧拉判别法的结果和勒让德符号相等。

Cipolla 算法#

Cipolla 算法具有使用的模意义下的复数扩域,具有魔法般的构造。

取一个非二次剩余 ω,记 i=ω,将数域扩充至 {a+bia,b[0,p1]},此时的复数乘法是:(a+bi)(c+di)=(ac+bdω)+(ad+bc)i。注意此时 ω 未必是 1

Cipolla 算法需要找到一个正整数 b 使得 ω=b2a,即 b2a 是非二次剩余,断言此时 (b+i)p+12 就是其中一个根。

证明需要两个引理:

  • ipi(modp),可以直接由 ip1ωp121(modp) 得来。

  • (x+y)pxp+yp(modp),这个是老生常谈了,卢卡斯定理的证明也用到了这个引理,直接二项式展开即可,即便是扩域也可以在取模。

于是可以推导:

((b+i)p+12)2(b+i)p+1(b+i)(bp+ip)(b+i)(bi)b2i2a(modp)

那么现在只需要找这个 b 了,做法是直接 [0,p1] 内随机,因为二次剩余和非二次剩余数量相当,所以期望意义下只需要 2 次左右。时间复杂度 O(logp)

参考资料#

离散对数#

  • OI Wiki

阶与原根#

剩余#

作者:SoyTony

出处:https://www.cnblogs.com/SoyTony/p/17987476/Learning_Notes_about_Discrete_Logarithm_and_Residue

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   SoyTony  阅读(141)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示