用於求\(a^x \equiv b \pmod\) 高次方程的最小正整數解 \(x\),其中 \(c\) 為素數
引理1:
\[a^ \equiv a^i \pmod p
\]\(p\)為素數,即 \(a^i\) 在模 \(p\) 的意義下會出現迴圈節 (注: \(\varphi(p)\) 可能不是最小迴圈節)
因為 \(a^\equiv 1\pmod p\),則 \(a^ \equiv 1 \pmod p\)
所以 \(a^\times a^ \equiv 1 \pmod p\)
即 \(a^\) 為 \(a^\) 模 \(p\) 意義下的逆元
$ \frac}} \equiv a^\times a^ \equiv a^\times 1 \equiv a^ \pmod p$
即 \(a^ \equiv a^ \pmod p\)
又因為 $i \bmod \varphi(p)=i-k\times (p-1) $
且 \(p\) 為素數,\(i-k\times (p-1)=i-k\times\varphi(p)\)
則 \(a^ \equiv a^ \equiv a^ \pmod p\)
qed根據引理1我們可知只需要列舉至多 \(\varphi(c)\) 個數就能知道方程的解,若列舉完後發現無解,則整個方程無解
考慮構造乙個 \(m\),使得 \(m=\lceil\sqrt\rceil\)
\(x=k\times m-q\),原方程轉化為 \(a^ \equiv b \pmod\)
繼而得到 $ a^ \equiv b\times a^ \pmod$
到了這一步,我們先考慮列舉 \(b*a^\) 中的 \(q\),至多 \(\sqrt\) 次,然後我們把得到的值存入乙個hash表中
接著我們開始列舉 $ a^$ 中的 \(m\),則兩次列舉出來的式子的兩兩組合正好可以得到所有 $a \in [1,x] $,若遇到兩次列舉出來的值相等,則輸出答案,退出迴圈。
code:
#include#include#includeusing namespace std;
#define ll long long
#define int ll
#define hash_mod 76799777ll
maphash;
ll qpow(ll a,ll b,ll c)
ll bsgs(ll a,ll b,ll c)
base=qpow(a,sizes,c);
ll tmp=1;
for(ll i=1;i<=sizes;i++)
return -1;
}ll p,b,n;
signed main()
ll ans=bsgs(b,n,p);
if(ans!=-1) printf("%lld",ans);
else printf("no solution");
}
學習筆記 BSGS 演算法
bsgs baby step giant step 即大步小步演算法,常用於求解離散對數問題。該演算法可以在 o sqrt p 的時間複雜度內求解 a x equiv b pmod p 我們將求解的答案 x 設為 km c c m 的形式,即 a equiv b pmod p 在 a perp p ...
學習筆記 省選演算法 數論 BSGS演算法
浙江省神犇協會 神犇1號 zjoi 2018的題大家都ak了嗎?全體神犇 ak了!神犇1號 7號神犇,你認識那個弱弱的xyz32768嗎?神犇7號 是的,我認識!我現在就去d他!x省y市 神犇7號 告訴你,zj的神犇協會從此有乙個規矩 第1天,協會派我,也就是7號神犇來d人,第2天,協會就派49號神...
(擴充套件)BSGS
texttt 即大步小步法,用於求解關於 x 的形如 a x equiv n bmod p 的高次不定方程的最小非負整數解,其中 a,b,p 為已經給出的常數且 a,p 互質。眾所周知bsgs 北上廣深 拔山蓋世 設 x a lceil sqrt rceil b 其中 0 leq a,b leq l...