BSGS和EXBSGS
\(Description\)
给定\(a,b,p\),求一个\(x\)使其满足\(a^x\equiv b\ \left(mod\ p\right)\)
\(BSGS\)
\(BSGS\)可以解决\(p\)为质数的情况
令 \(m=\lceil \sqrt p\rceil\)
令 \(x=i\cdot m-k\)
有 \(a^{i\cdot m-k} \equiv b\ (mod\ p)\)
两边同乘 \(a^k\) 得 \(a^{i\cdot m}\equiv b\cdot a^k\ (mod\ p)\)
我们先将右边的 \(b\cdot a^k\) 全部求出来存到一个表里,这样预处理时间复杂度为 \(\sqrt p\)
之后再枚举 \(i\) 到 \(\sqrt p\) ,看表里有没有 \(a^{i\cdot m}\ mod\ p\),有的话就有一组解
再反向求出\(x\)即可
\(EXBSGS\)
当\(p\)不是质数时
令 \(g=gcd(a,p)\)
有 \(a^{x-1}\cdot \dfrac{a}{g}\cdot g \equiv \dfrac{b}{g}\cdot g\ \left(mod\ \dfrac{p}{g}\cdot g\right)\)
把那个\(g\)除掉
\(a^{x-1}\cdot \dfrac{a}{g} \equiv \dfrac{b}{g}\ \left(mod\ \dfrac{p}{g} \right)\)
然后重复这个过程直到\(a,p\)互质
\(p\)除掉\(gcd(a,p)\)后可能仍与\(a\)有公约数,与\(\frac{a}{gcd(a,p)}\)互质
显然,在这个过程中如果\(p\)不能被\(b\)整除就无解
到最后会得到这样的方程
\(a^{x-i}\cdot c\equiv t\ \left(mod\ p\right)\)
\(c\)是由\(a\)的幂除以若干个因子得到的 \(c,t\)肯定互质
两边乘以\(c^{-1}\)(逆元)
\(a^{x-i}\equiv t\cdot c^{-1}\ \left(mod\ p\right)\)
用\(BSGS\)对\(x-i\)求解即可
最后记得加上\(i\)
\(Code\)
\(BSGS\)
ksm(a,b);//return a^b
gcd(a,b);//return gcd(a,b)
//{{{bsgs
int bsgs (int a,int b,int p)//return a^x ≡ b mod p 's x
{
a%=p;
if (!a&&!b) return 1;
if (!a) return -1;
int m=sqrt(p);
map <int,int> mp;//这里用的map 也可以自己打个哈希
int t=b%p;
mp[t]=0;
for (int i=1;i<=m;++i) mp[t=1ll*t*a%p]=i;
t=1;
int mi=ksm(a,m);
for (int i=1;1ll*i*i<=p+1;++i){
t=1ll*t*mi%p;
if (mp.count(t)) return ((1ll*i*m%p-mp[t])%p+p)%p;
}
return -1;
}
//}}}
\(EXBSGS\)
//{{{exbsgs
int exbsgs (int a,int b,int p)//a^x ≡ b mod p 's x
{
if (b==1) return 0;
int cnt=0,t=1;
for (int g=gcd(a,p);g!=1;g=gcd(a,p)){
if (b%g) return -1;
++cnt,b/=g,p/=g;
t=1ll*t*a/g%p;
if (b==t) return cnt;
}
int x=bsgs(a,1ll*ksm(t,p-2)*b%p,p);
if (x!=-1) x+=cnt;
return x;
}
//}}}
如有哪里讲得不是很明白或是有错误,欢迎指正
如您喜欢的话不妨点个赞收藏一下吧
原文地址:https://www.cnblogs.com/Morning-Glory/p/11610024.html
- open-falcon ---客户机agent操作
- 双拼域名yansuan.com被木雨林收购
- open-falcon ---安装Dashboard时候报错"SSLError: The read operation timed out"
- Flash/Flex学习笔记(37):不用系统组件(纯AS3)的视频播放器--只有8.82K
- Flash/Flex学习笔记(35):如何正确监听Stage对象的事件
- Flash/Flex学习笔记(34):AS3中的自定义事件
- 字符串处理总结(旧)
- 计算某年某月的某一天是星期几的算法
- Flash/Flex学习笔记(33):如何用As3协同Flash CS IDE控制MovieClip实例
- live writer的折腾
- 用C语言写的万年历---亲手写的。好累哦
- Flash/Flex学习笔记(32):播放音乐并同步显示lyc歌词(适用于Silverlight)
- Flash/Flex学习笔记(31):对象拖拽与投掷
- 如何评价张小龙在2016微信公开课的演讲
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP FileSystem 文件系统常用api整理总结
- laravel框架之数据库查出来的对象实现转化为数组
- php apache开启跨域模式过程详解
- laravel5.6实现数值转换
- python中return不返回值的问题解析
- php装饰者模式简单应用案例分析
- php常用日期时间函数实例小结
- PHP超级全局变量【$GLOBALS,$_SERVER,$_REQUEST等】用法实例分析
- 基于laravel缓冲cache的用法详解
- Python使用sys.exc_info()方法获取异常信息
- laravel通用化的CURD的实现
- Laravel修改验证提示信息为中文的示例
- PHP+redis实现微博的推模型案例分析
- Laravel 解决composer相关操作提示php相关异常的问题
- laravel 实现根据字段不同值做不同查询