开学第一天,有点困,不过天气不错,手脚能放开了。
今天学习了离散对数的几类问题,也是开始涉及密码学的核心:
对于离散对数:
$A^x\equiv B \mod p$
如果要求B,那就是幂模问题,用快速幂求模。
如果未知x,就是一个重要的离散对数/密码学问题,直观的我们想:是不是可以从1枚举到p-1(欧拉函数)?不过这个开销比较大,有一种算法(BSGS,大步小步/北上广深(!?)算法)可以解决这类问题。
将x写成$x=i m+j$,其中$m=\sqrt{p}$,这里为什么是根号m可用费马小定理证明。
现在的等式就是$A^{j+im}\equiv B \mod p$。
移项(数论移项,$r^{-1}$表示逆元,逆元可以用扩展欧几里得算法求,在之前的博文中写过)
$A^j=A^{-im}B\mod c$
首先枚举j,j是不超过m的,将j存放在hash表中(注意,如果用stl的map会tle,这里我参考的哈希除留余数法模拟,个人感觉有点风险,当然哈希算法以后要研究的),然后枚举i,匹配时返回x,这里可以保证返回的是最小的。
蕴含的思想是“相遇”,“分治”,说白了是把暴力搜索变得优雅。
习题是poj的2417,一些细节上的注意点我标了,核心的几点:
1 筛重很重要,否则会tle
2 开根号要变成double