感觉标题哪里怪怪的
以下内容难度偏易,相信很多人都知道,这里只是给不知道的人看的
其实就我不知道
很多人学BSGS都是从网上随便搜一个"baby step giant step",然后找到几个讲解来学(包括我),我一年前好像是看这个学的
似乎90%以上有关BSGS的讲解都是像这么说的:
求
ax=b(mod prime)
设
m=√p,x=im+j
于是
aimaj=b(mod p)
aim=b(a−1)j(mod p)
枚举j,存到hash表里,再枚举i,遇到的第一个就是答案
但是这里有一个重要的问题许多人都没有注意到,我以前看到的讲解也都没有注意到这个问题
那就是为什么需要求逆
liangjs今天跟我说他是看这里学的BSGS,根本不需要求逆
我们来思考一下为什么我们要令x=im+j而不是x=im−j呢?
根本没有道理嘛
于是我们令
x=im−j
于是
aim(a−1)j=b(mod p)
aim=baj(mod p)
真的不需要求逆……
前几天n+e留言说4128只用hash就好了,我还以为是那种O(n2p)的做法……我果然太naive
也就是说这种写法BSGS适用于逆存在但是求逆比较麻烦的情况……嗯……比如说矩阵
各种意义上都能完虐需要逆元的BSGS
写这篇文章用来纪念自己一年都没有注意到的问题
没了
2015年6月17日 21:53
简直可怕。为什么不能用来做扩展BSGS呢?
2015年6月17日 21:53
@ydc: 尼玛我是逗逼……求帮忙删掉