【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 了。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值