BSGS算法,即⼤⼩步算法(Baby-Step-Giant-Step)俗称北上⼴深、拔⼭盖世算法。
⽤途
可以在O(√P)的时间负复杂度求出形如Ax≡B(modP),(Gcd(P,A)=1)的⽅程的最⼩⾮负整数解。
实现
根据费马⼩定理,我们不难证明若最⼩⾮负整数x存在,那么⼀定有x
这样做有什么好处呢?我们发现k、m都是取值范围⼩于√P的正整数,我们想要利⽤好这条性质,就要把式⼦变⼀下形:
Akn−m≡B(modP)Akn≡Am⋅B(modP)
我们令G=An(modP),则
Gk≡Am⋅B(modP)
这样,我们就可以先处理处每⼀个Am⋅B,存进哈希表中,再求出G=An,并依次枚举Gk在哈希表中是否存在,优先取k⼩的即可,最终就有x=kn−m。
扩展
不难看出,以上过程依托费马⼩定理限定了x的取值范围,所以限制是(Gcd(P,A)=1),但如果不是这样呢?我们不妨假设(Gcd(P,A)=d),A=a×d,B=b×d,P=p×d(如果B不是d的倍数则⽅程在整数范围内⽆解)则:
(a⋅d)x≡b⋅d(mod(p⋅d))
根据等式的性质,⼀定有
a⋅(a⋅d)x−1≡b(modp)(a⋅d)x−1≡b⋅a−1(modp)
依照上⽂求解即可
附上SDOI2016计算器的代码
⼤家不要在意我丧⼼病狂的写了个trie树当哈希⽤...
#include
Copyright © 2019- yule263.com 版权所有 湘ICP备2023023988号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务