BSGS扩展BSGS
BSGS
給定\(a,b,p\),求\(x\)使得\(a^x\equiv b \pmod p\),或者說明不存在\(x\)
只能求\(\gcd(a,p)=1\)的情況
有一個結論:如果有解則必然存在\(x\in\left\{0\ldots p-1\right\}\)的解
設\(q=\lceil\sqrt p\rceil,x=cq-d\)
\[a^{cq-d}\equiv b\pmod p\]
\[a^{cq}\equiv b\times a^d\pmod p\]
先枚舉\(d\in\left\{1\ldots q\right\}\),把\(b\times a^d \pmod p\)塞進哈希表里
再枚舉\(c\in\left\{1\ldots q\right\}\),查詢\(a^{cq}\)是否在哈希表內
最后\(cq-d\)就是答案
擴展BSGS
能求\(\gcd(a,p)\neq1\)的情況。
設\(s=\gcd(a,p)\)
若\(s\nmid b\)則無解
設\(a'=\frac{a}{s},b'=\frac{s},p'=\frac{p}{s}\)
\[(a's)^x\equiv b's\pmod {p's}\]
\[a'a^{x-1}\equiv b' \pmod {p'}\]
這樣每次\(p\)都會除以一個大于\(2\)的數,這個過程一定會停止(\(O(\log p)\)次)
最后會得到
\[da^{x-k}\equiv b\pmod p\]
把計算出來的\(x\)加上\(k\)輸出就可以了。
但是可能存在小于\(k\)的答案
直接枚舉\(0\)~\(k\),判斷是否合法。
一些其他的東西
sdchr大爺說可以直接按照普通BSGS的方法做,然后把我的隨機數據過掉了,但被我hack了。
表面上看當\(\gcd(a,p)\neq1\)時BSGS也可以做,但是,
\[a^{cq-d}\equiv b\pmod p\Rightarrow a^{cq}\equiv ba^d\pmod p \]
\[a^{cq-d}\equiv b\pmod p\nLeftarrow a^{cq}\equiv ba^d\pmod p\]
1式能推出2式,但2式不能推出1式(要兩邊同時除以\(a\)的逆元)
所以這是不對的
轉載于:https://www.cnblogs.com/ywwyww/p/8510957.html
總結
以上是生活随笔為你收集整理的BSGS扩展BSGS的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: chrome插件下载
- 下一篇: js eval函数