【Baby-step giant-step Algorithm】poj3243,hdu2815

有方程:a^x mod b = c;

已知a,b,c求一個最小的x

 

把式子變換爲

a^(x'k+y) mod b = c >>

a^y mod b = c / a^(x'k)

 

我們可以枚舉x',然後查找在a^(0~k-1)內是否有 c / a^(x'k) ,複雜度爲 k+n/k,易知k爲sqrt(n)時最優。

接下來的工作就是求a^(x'k)乘法逆元,由於b不是質數,不可以用歐拉函數,不過實際上我們是可以把bc的公因數提取出來的,提取出來之後就進入了一個phi(b/gcd(b,c))的循環節中,可以求逆元了,由於a^x不一定含有這個公因數所以之前要先樸素的運算到大約40左右(43是我學號,純屬蛋疼),在40次運算過後就進入這個循環節了,如果沒有進入就肯定是No Solution 了。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章