1. 程式人生 > 其它 >高次同餘方程

高次同餘方程

高次同餘方程,可分為兩類。
下面來分別介紹這兩類方程和解法
一類是

\[ 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 \rceil\)

,這樣上式就變成

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

我們可以由上面暴力演算法可以知道\(x<p\),又因為\(m=\lceil \sqrt{p} \rceil\),所以\(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