高次同余方程

高次同余方程,可分为两类。
下面来分别介绍这两类方程和解法
一类是

[ a^x equiv b (mod p ) ]

(a perp p)求一个非负整数解?
首先因为(a perp p),我们由欧拉定理得

[ a^{varphi(p)} equiv 1 (mod p) ]

[ a^{0} equiv 1 (mod p) ]

因此不难得出(0 - varphi(p))是个循坏节,我们可以暴力枚举,期望时间复杂度(O(varphi(p)))

下面介绍BSGS算法(大步小步算法)
(x=i*m-j,m=lceil sqrt p ceil),这样上式就变成

[a^{i*m-j}equiv b (mod p) \ (a^m)^i equiv b *a^j ]

我们可以由上面暴力算法可以知道(x<p),又因为(m=lceil sqrt{p} ceil),所以(i<sqrt m,0<j<sqrt{m})
我们用-j来表示余数,可以方便把j移动到右边。(显然这一步是需要逆元,也就证明了为什么上面要求gcd(a,p)=1)

然后我们枚举j,可以得到一些数对,((j,ba^j))插入哈希表或者map让j作为vaule,(ba^j)作为key。
如果有重复的key,那就用新的更新旧的(希望j大)。

再枚举i,如果在map或者哈希表中找到了一样的,那么就是找到了找到一对(i,j)(希望i小)
这样得出的im-j就是最小的x。期望时间复杂度(O(sqrt{p}))
模板

本文来自博客园,作者:{2519},转载请注明原文链接:https://www.cnblogs.com/QQ2519/p/15112480.html

原文地址:https://www.cnblogs.com/QQ2519/p/15112480.html