高次同余方程,可分为两类。
下面来分别介绍这两类方程和解法
一类是
[ 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}))
模板