BSGS && EXBSGS
基础BSGS
用处是什么呢w
大步小步发(Baby-Step-Giant-Step,简称BSGS),可以用来高效求解形如\(A^x≡B(mod C)\)(C为素数)的同余方程。
常用于求解离散对数问题。形式化地说,该算法可以在\(O(\sqrt{n})\)用于求解。
接下来是算法过程
首先我们讨论的都是(A,C) = 1(由于C是素数,所以等价于A不是C倍数)的情况,如果(A,C) > 1(A是C倍数),很容易特判掉。
先引入一个结论:
如果(A,C) = 1,那么对于\(x \in N\),有\(A^{x mod \phi(C)} ≡ A^x (mod C)\)
如下证明过程:
因为(A,C) = 1,根据欧拉定理,可得\(A^{k * \phi(C)} ≡ 1 (mod C)\)
设\(k \in N\),根据同幂性,\(A^{k * \phi(C)} ≡ 1 (mod C)\)
设\(a \in N\) 且 \(a < \phi(C)\),所以\(A^x(mod C)\),得证。
所以如果\(0 \leq x < \phi(C)\)无解,之后肯定也无解,但是\(\phi(C)\)并一定是最小正周期。
其算法本质是根号分治,令\(m=[\sqrt{C}]\),我们假设x = i * m - j,其中\(0 \leq i,j \leq m\),则有\(A^{i*m - j} ≡ B\) ,稍加变换,可以得到\(A^{i*m}≡B*A^j\)
我们现在已知的是\(A,B\),所以我们可以先通过枚举j,算出\(B * A^j\),用hash/map存下来,然后再枚举i,计算出\(A^{i * m}\)寻找是否有与之相等的\(B * A^j\),从而我们可以得到所有的\(x\),\(x = i * m - j\)
因为i,j都小于等于m,所欲复杂度为$ Θ(\sqrt{C})$,用map多一个log
进阶BSGS
问题:求解\(x^a ≡ b\) \(mod\) \(p\) (p为质数)
这个问题可以通过转化变成上面基础BSGS中所说的样子
因为\(p\)是一个质数,所以\(p\)一定存在一个原根\(g\),因此在模\(p\)的意义下的任何数\(x\),有且只有一个数\(i\)满足\(x = g^i\)
方法一:
令\(x = g^c\),\(g\)是\(p\)的原根(肯定存在这个g和c),问题转化为求解\((g^c)^a ≡ b\) \(mod\) \(p\) ,可以转化为
\((g^a)^c ≡ b (mod p)\)
这就转化为基础篇中我们所说的内个式子了,可以在\(O(\sqrt{p})\)解出\(c\),这样可以得到原方程的一个特解 \(x_0 ≡ g^c\) \(mod\) \(p\)
方法二:
我们仍令\(x = g^c\),并且设\(b = g^t\),于是乎我们得到 \(g^{ac}≡ g^t\) \(mod\) \(p\)
方程两边同时取离散对数可以得到 \(ac ≡ t\) \(mod\) \(\phi(p)\)
这样我们可以通过BSGS求解\(g^t ≡ b\) \(mod\) \(p\)得到\(t\),于是这就转化成为一个线性同余方程问题,这样也可以解出\(c\),求出\(x\)的一个特解\(x_0 = g^c ≡ b\) \(mod\) \(p\)
如果要找到\(x\)的所有解而不是特解的话:
我们能求出一个特解\(x_0 ≡ g^c (mod\) \(n)\),我们知道\(g^{\phi(n)} ≡ 1 (mod\) \(n)\),于是可以得到下面这个式子,
\[
\forall t \in Z,x^k ≡ g^{c*k+t*\phi(n)} ≡ a (mod p)$
\]
于是得到所有解为
\[
\forall t \in Z ,k|t * \phi(n),x ≡ g^{c+\frac{t * \phi(n)}{k}} ≡ a (mod p)
\]
然后对于上面这个式子有\(\frac{k}{gcd(k,\phi(n))}|t\)。因此我们设\(t = \frac{k}{gcd(k,\phi(n))}*i\),可以得到
\[
\forall i \in Z,x ≡ g^{c + \frac{\phi(n)}{gcd(k,\phi(n))} * i} (mod p)
\]
这就是原问题的所有解
下面是EXBSGS
与BSGS相类似,这个算法也是解决\(a^x≡b(mod p)\)的问题,只不过C可以不是质数。
我们知道,在\(a\)与\(p\)互质的时候,在模\(p\)的意义下\(a\)存在逆元,我们就可以用BSGS来解决问题,那么在他们不互质的情况下,我们就要使他们变成互质的。
具体来说,我们设\(d_i = gcd(a,p)\),如果\(d_1\)不是b的因子,那么原方程无解,有解的情况下我们将方程两边同时处以\(d_1\),可以得到
\[
\frac{a}{d_1} * a^{x - 1}≡\frac{b}{d_1} mod \frac{p}{d_1}
\]
如果\(a\)和\(\frac{p}{d_1}\)仍然不互质的话设\(d_2 = gcd(a,\frac{p}{d_1})\)。如果\(d_2\)不是\(\frac{b}{d_1}\),则方程无解,有解的情况下将方程两边同时除以\(d_2\),得到
\[
\frac{a^2}{d_1d_2} * a^{x - 2} ≡ \frac{b}{d_1d_2} mod \frac{p}{d_1d_2}
\]
同理,我们不停地这样判断,直到\(a\)与\(\frac{p}{d_1d_2...d_k}\)互质为止。
设\(D = \prod_{i = 1}^{k} d_i\),于是方程就变成了下面这样:
\[
\frac{a^k}{D} * a^{x - k} ≡ \frac{b}{D} mod \frac{p}{D}
\]
因为\(a\)与\(\frac{p}{D}\)互质,于是可是推出\(\frac{a^k}{D}\)与\(\frac{p}{D}\)互质,这样的话\(\frac{a^k}{D}\)就有逆元了,于是把它移到方程的右边,这就变成了一个BSGS问题,于是求解\(x - k\)后再加上\(k\)就是原方程的解了。
值得注意的是,不排除解小于等于k的情况,所以咋消因子前应\(O(k)\)枚举,直接验证\(a^i≡b\) \(mod\) \(p\),这样就能避免这种情况。
BSGS && EXBSGS的更多相关文章
- BSGS&EXBSGS 大手拉小手,大步小步走
大步小步走算法处理这样的问题: A^x = B (mod C) 求满足条件的最小的x(可能无解) 其中,A/B/C都可以是很大的数(long long以内) 先分类考虑一下: 当(A,C)==1 即A ...
- BSGS&ExBSGS
BSGS&ExBSGS 求解形如 \[a^x\equiv b\pmod p\] 的高次同余方程 BSGS 假装\(gcd(a,p)=1\). 设\(m=\lceil\sqrt p \rceil ...
- [note]BSGS & exBSGS
BSGS (感觉这东西还是要写一下) BSGS主要用于求解形如\(x^k=y\pmod p\)(注意这里p与x互质)这样的方程的最小正整数解的问题 设\(m=\lceil\sqrt p\rceil,k ...
- 算法笔记--BSGS && exBSGS 模板
https://www.cnblogs.com/sdzwyq/p/9900650.html 模板: unordered_map<int, int> mp; LL q_pow(LL n, L ...
- BSGS+exBSGS POJ2417+POJ3243
a^x=b(mod p)求x,利用分块的思想根号p的复杂度求答案,枚举同余式两端的变量,用hash的方法去找最小的答案(PS:hash看上去很像链式前向星就很有好感).然后如果p不是质数时,就利用同余 ...
- Noip前的大抱佛脚----数论
目录 数论 知识点 Exgcd 逆元 gcd 欧拉函数\(\varphi(x)\) CRT&EXCRT BSGS&EXBSGS FFT/NTT/MTT/FWT 组合公式 斯特林数 卡塔 ...
- 各种友(e)善(xin)数论总集(未完待续),从入门到绝望
目录 快速幂 扩展欧几里得 GCD 扩展欧几里得 同余系列 同余方程 同余方程组 一点想法 高次同余方程 BSGS exBSGS 线性筛素数 埃式筛 欧拉筛 欧拉函数 讲解 两道水题 法雷级数 可见点 ...
- REHの收藏列表
搬运自本人的AcWing,所以那里的文章会挺多. 友链(同类文章) :bztMinamoto 世外明月 mlystdcall 新人手册:AcWing入门使用指南 前言 有看到好文欢迎推荐(毛遂自荐也可 ...
- ZROI 2019 暑期游记
ZROI 游记 在自闭中度过了17天 挖了无数坑,填了一点坑 所以还是有好多坑啊zblzbl 挖坑总集: 时间分治 差分约束 Prufer序列 容斥 树上数据结构 例题C (和后面的例题) 点分 最大 ...
随机推荐
- WSO2 ESB XML定义语法(1)
1.(基于Apache Synapse的WSO2 ESB实现)参考文件位置: http://synapse.apache.org/userguide/config.html 基于Apache Syna ...
- How to do high impact research + 实事求是
1. develop a strong publications record early, so do what you can to make that happen. 2. 粗读:abstrac ...
- 并查集-D - 畅通工程
D - 畅通工程 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通 ...
- jsp中连接数据库及实现增删改查
导入jdbc工具包 <%@page import="asp.engine.util.PageHelper"%><%@ page import="asp. ...
- Introduction to SQL
目录 SELECTING SELECTing single columns SELECTing multiple columns select all SELECT DISTINCT Learning ...
- day01_2spring3
Bean基于XML和基于注解的装配 一.Bean基于XML的装配 1.生命周期接着day01_1来讲(了解) Bean生命周期的如图所示:用红色框起来的都是我们要研究的! 如图Bean is Read ...
- 安装proxmox VE(PVE)教程
proxmox VE,又叫PVE,全称是 Proxmox Virtual Environment 官网地址:https://www.proxmox.com/en/ 1)在官网下载PVE最新镜像,笔者下 ...
- java基础(三)之面向对象编程
对象的创建方法 语法: class 类名{ 属性; 方法; } 生成对象的方法 类名 对象名 = new 类名(); Dog dog = new Dog(); 对象的使用方法1.对象.变量;2.对象. ...
- python3练习100题——022
为了周末轻松点,多做一些题. 原题链接:http://www.runoob.com/python/python-exercise-example22.html 题目:两个乒乓球队进行比赛,各出三人.甲 ...
- 解决 genymotion 安装apk报错 app contains ARM native code and your Genymotion device cannot run ARM instructions
1.某些APP安装在模拟器时提示“ this probably means that the app contains ARM native code and your Genymotion devi ...