\(BSGS\)

求解\(a^x\equiv b\pmod p\),且\(a\)与\(p\)互质

由\(a^{φ(p)}\equiv1 \pmod p\)和\(a^0\equiv 1\pmod p\)得

\(0\simφ(p)\)为一个循环节,所以若在这个范围内不存在\(x\)满足方程,方程就无解

考虑分块,设\(x=im-k\),其中\(0\leqslant k\leqslant m\)

原方程变为\(a^{im-k}\equiv b\pmod p\)

两边同乘\(a^k\),\(a^{im}\equiv {a^kb}\pmod p\)

那么就可以先计算右边\({a^kb}\ mod\ p\)的值,放入一个\(hash\)表中,再计算左边\(a^{im}\ mod\ p\)的值,从小到大枚举所有可能的\(i\)值,再在\(hash\)表查询

当\(m\)取\(\sqrt p\)时复杂度最小,为\(O(\sqrt p)\)

同时注意\(m\)需要取\(\sqrt p+1\)或是\(ceil(\sqrt p)\)

\(code:\)

ll qp(ll x,ll y,ll m)
{
ll ans=1;
while(y)
{
if(y&1) ans=(ans*x)%m;
x=(x*x)%m;
y>>=1;
}
return ans%m;
}
map<ll,int> ha;
ll bsgs(ll a,ll b,ll p)
{
ll m=ceil(sqrt(p));
for(ll i=0,t=b;i<=m;++i,t=t*a%p) ha[t]=i;
for(ll i=1,tmp=qp(a,m,p),t=tmp;i<=m;++i,t=t*tmp%p)
if(ha[t])
return i*m-ha[t];
return -1;
}

\(exBSGS\)

求解\(a^x\equiv b\pmod p\),不保证\(a\)与\(p\)互质

设\(g=gcd(a,p)\)

带入得\(a^{x-1}\frac{a}{g}\equiv \frac{b}{g}\ (mod\ \frac{p}{g})\)

化简得\(a^{x-1}\equiv \frac{b}{g}×inv(\frac{a}{g})\ (mod\ \frac{p}{g})\)

像这样一直变换下去,当\(a\)与\(\frac{p}{g}\)互质时,即可求解

在变换过程中,当发现\(g\nmid b\)且\(b\ne 1\)时,原方程无解

当\(b=mul\)时说明此时\(a\)的次数为\(0\),这时返回变换次数\(cnt\)

\(code:\)

ll exgcd(ll a,ll b)
{
if(!b)
{
x=1,y=0;
return a;
}
ll ans=exgcd(b,a%b),tmp=x;
x=y,y=tmp-a/b*y;
return ans;
}
ll qp(ll x,ll y,ll m)
{
ll ans=1;
while(y)
{
if(y&1) ans=(ans*x)%m;
x=(x*x)%m;
y>>=1;
}
return ans%m;
}
ll inv(ll a,ll p)
{
exgcd(a,p);
return (x%p+p)%p;
}
unordered_map<ll,int> ha;
ll bsgs(ll a,ll b,ll p)
{
ha.clear();
ll m=ceil(sqrt(p));
for(ll i=0,t=b;i<=m;++i,t=t*a%p) ha[t]=i;
for(ll i=1,tmp=qp(a,m,p),t=tmp;i<=m;++i,t=t*tmp%p)
if(ha[t])
return i*m-ha[t];
return -1;
}
ll exbsgs(ll a,ll b,ll p)
{
if(b==1||p==1) return 0;
ll g,cnt=0,mul=1;
while((g=exgcd(a,p))!=1)
{
if(b%g!=0) return -1;
cnt++,b/=g,p/=g,mul=mul*(a/g)%p;
if(b==mul) return cnt;
}
ll ans=bsgs(a,b*inv(mul,p)%p,p);
if(~ans) return ans+cnt;
return -1;
}

扩展BSGS的更多相关文章

  1. BSGS与扩展BSGS

    BSGS \(BSGS\)算法又称大步小步\((Baby-Step-Giant-Step)\)算法 \(BSGS\)算法主要用于解以下同余方程 \[A^x\equiv B(mod\ p)\]其中\(( ...

  2. BSGS&扩展BSGS

    BSGS 给定\(a,b,p\),求\(x\)使得\(a^x\equiv b \pmod p\),或者说明不存在\(x\) 只能求\(\gcd(a,p)=1\)的情况 有一个结论:如果有解则必然存在\ ...

  3. POJ 3243 Clever Y 扩展BSGS

    http://poj.org/problem?id=3243 这道题的输入数据输入后需要将a和b都%p https://blog.csdn.net/zzkksunboy/article/details ...

  4. bzoj 3283 扩展BSGS + 快速阶乘

    T2  扩展BSGS T3 快速阶乘 给定整数n,质数p和正整数c,求整数s和b,满足n! / pb = s mod pc 考虑每次取出floor(n/p)个p因子,然后将问题转化为子问题. /*** ...

  5. BSGS和扩展BSGS

    BSGS: 求合法的\(x\)使得\(a ^ x \quad mod \quad p = b\) 先暴力预处理出\(a^0,a^1,a^2.....a^{\sqrt{p}}\) 然后把这些都存在map ...

  6. poj 3243 Clever Y && 1467: Pku3243 clever Y【扩展BSGS】

    扩展BSGS的板子 对于gcd(a,p)>1的情况 即扩展BSGS 把式子变成等式的形式: \( a^x+yp=b \) 设 \( g=gcd(a,p) \) 那么两边同时除以g就会变成: \( ...

  7. 扩展BSGS求解离散对数问题

    扩展BSGS用于求解axΞb mod(n) 同余方程中gcd(a,n)≠1的情况 基本思路,将原方程转化为a与n互质的情况后再套用普通的BSGS求解即可 const int maxint=((1< ...

  8. BSGS及扩展BSGS总结(BSGS,map)

    蒟蒻哪里有什么总结,只能点击%YL% 还有这位ZigZagK大佬的blog \(\mbox{BSGS}\) 模板题:洛谷P3846 [TJOI2007]可爱的质数 给定\(a,b\)和模数\(\mbo ...

  9. bzoj 2480——扩展BSGS

    题意 给定 $a,b$ 和模数 $p$,求整数 $x$ 满足 $a^x \equiv  b(mod \ p)$,不保证 $a,p$ 互质. (好像是权限题,可见洛谷P4195 分析 之前讲过,可以通过 ...

  10. bzoj 1467: Pku3243 clever Y 扩展BSGS

    1467: Pku3243 clever Y Time Limit: 4 Sec  Memory Limit: 64 MB[Submit][Status][Discuss] Description 小 ...

随机推荐

  1. JavaWeb网上图书商城完整项目--day02-8.提交注册表单功能之dao、service实现

    1.发送邮件 发送邮件的时候的参数我们都写在了配置文件中,配置文件放在src目录下,可以使用类加载器进行加载该数据 //向注册的用户发送邮件 //1读取配置文件 Properties properti ...

  2. bug和测试报告思维导图

    Bug定义: 1.不符合需求的 2.程序本身的报错 3.不符合用户使用习惯的 Bug生命周期: 当我们测试人员提交一个bug的时候,自始bug就有它的生命周期,从开始到结束, 把测试的过程和结果写成文 ...

  3. Python实用笔记 (26)面向对象高级编程——定制类

    Python的class允许定义许多定制方法,可以让我们非常方便地生成特定的类.以下是集中常见的定制方法: 怎么才能打印得好看呢?只需要定义好__str__()方法,返回一个好看的字符串就可以了: _ ...

  4. MongoDB快速入门教程 (1)

    1.MongoDB初识 1.1.MongoDB是什么? MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于 ...

  5. 【kubeadm初始化报错】failed to run Kubelet: misconfiguration: kubelet cgroup driver: "cgroupfs" is different from docker cgroup driver: "systemd"

    复现场景 环境 系统:Centos7 kubernetes:1.18.5 docker:19.03.9 复现步骤 1.通过 yum 或 rpm 安装 kubelet kubectl kubeadm,并 ...

  6. BZOJ 3573米特运输

    Description 米特是D星球上一种非常神秘的物质,蕴含着巨大的能量.在以米特为主要能源的D星上,这种米特能源的运输和储存一直是一个大问题.D星上有N个城市,我们将其顺序编号为1到N,1号城市为 ...

  7. python中 _、__、__xx__() 区别及使用场景

    1.访问权限(private.public)与继承方式(只有public继承) 在面向对象编程语言中,类的属性与方法都会设置访问控制权限,从而满足我们的设计需求.一般而言,我们通常会将对象的属性设置为 ...

  8. 一次运维-堡垒机多次跳转导出及导入mysql数据库

    1. 场景描述 记录一次运维,朋友公司要从线上环境同步数据到测试环境,因为公司监管问题,导致数据无法从线上获取,需要通过vpn,堡垒机,3次跳转到目标主机,通过命令导出mysql数据文件,然后再将数据 ...

  9. Python——格式化GMT时间

    1.背景 最近在做视频上传去获取大小.时间的功能,视频是存在金山云的,由于金山sdk接口用例执行后返回的结果中的时间是http头部时间,时间格式为‘Tue, 08 May 2018 06:17:00 ...

  10. Idea JAVA开发工具快速上手-常用快捷键汇总

    前言: 之前一直使用Eclipse 系列开发IDE工具,由于eclipse是开源的所以,一般情况,eclipse基本上每一个java入门者的首选开发工具,其次 Myeclipse.不过现在越来越多的人 ...