基础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的更多相关文章

  1. BSGS&EXBSGS 大手拉小手,大步小步走

    大步小步走算法处理这样的问题: A^x = B (mod C) 求满足条件的最小的x(可能无解) 其中,A/B/C都可以是很大的数(long long以内) 先分类考虑一下: 当(A,C)==1 即A ...

  2. BSGS&ExBSGS

    BSGS&ExBSGS 求解形如 \[a^x\equiv b\pmod p\] 的高次同余方程 BSGS 假装\(gcd(a,p)=1\). 设\(m=\lceil\sqrt p \rceil ...

  3. [note]BSGS & exBSGS

    BSGS (感觉这东西还是要写一下) BSGS主要用于求解形如\(x^k=y\pmod p\)(注意这里p与x互质)这样的方程的最小正整数解的问题 设\(m=\lceil\sqrt p\rceil,k ...

  4. 算法笔记--BSGS && exBSGS 模板

    https://www.cnblogs.com/sdzwyq/p/9900650.html 模板: unordered_map<int, int> mp; LL q_pow(LL n, L ...

  5. BSGS+exBSGS POJ2417+POJ3243

    a^x=b(mod p)求x,利用分块的思想根号p的复杂度求答案,枚举同余式两端的变量,用hash的方法去找最小的答案(PS:hash看上去很像链式前向星就很有好感).然后如果p不是质数时,就利用同余 ...

  6. Noip前的大抱佛脚----数论

    目录 数论 知识点 Exgcd 逆元 gcd 欧拉函数\(\varphi(x)\) CRT&EXCRT BSGS&EXBSGS FFT/NTT/MTT/FWT 组合公式 斯特林数 卡塔 ...

  7. 各种友(e)善(xin)数论总集(未完待续),从入门到绝望

    目录 快速幂 扩展欧几里得 GCD 扩展欧几里得 同余系列 同余方程 同余方程组 一点想法 高次同余方程 BSGS exBSGS 线性筛素数 埃式筛 欧拉筛 欧拉函数 讲解 两道水题 法雷级数 可见点 ...

  8. REHの收藏列表

    搬运自本人的AcWing,所以那里的文章会挺多. 友链(同类文章) :bztMinamoto 世外明月 mlystdcall 新人手册:AcWing入门使用指南 前言 有看到好文欢迎推荐(毛遂自荐也可 ...

  9. ZROI 2019 暑期游记

    ZROI 游记 在自闭中度过了17天 挖了无数坑,填了一点坑 所以还是有好多坑啊zblzbl 挖坑总集: 时间分治 差分约束 Prufer序列 容斥 树上数据结构 例题C (和后面的例题) 点分 最大 ...

随机推荐

  1. Your name ?

    序言 才发觉自己有许多名字 ··································································· 言归正传 今天才发现,自己在不同地方 ...

  2. 《深入理解Java虚拟机》读书笔记一

    第二章 Java内存区域与内存溢出异常 1.运行时数据区域 程序计数器: 当前线程所执行的字节码的行号指示器,用于存放下一条需要运行的指令. 运行速度最快位于处理器内部. 线程私有. 虚拟机栈: 描述 ...

  3. sql 应用记录

    SELECT * FROM (select aa.*,bb.mentalvisitid, ' then '家庭访视' else '电话' end as BCSFXS ,bb.visitdate, ' ...

  4. memcached和redis对比

    关于memcached和redis的使用场景,总结如下:两者对比: redis提供数据持久化功能,memcached无持久化. redis的数据结构比memcached要丰富,能完成场景以外的事情: ...

  5. git 卡住推不上去

    luoxu@lenovo:~/testGit/.git$ env | grep -i proxy 查看有没有设置代理 ALL_PROXY=socks://127.0.0.1:1080/ no_prox ...

  6. jmeter 登陆--查询存在否-->新建客户-->查询存在否 + 压测

    1.登陆 正则表达式提取器和json提取器,都是后置处理器提取token(都可以在响应中以regexp tester 和 json path tester查看提取的对不对) beanshell 后置处 ...

  7. mysql之case..when ..then..else..end as..用法

    1.示例1 查询1: SELECT CASE main_xm_sam31 WHEN '02' THEN 2 ELSE 1 END AS SPDJ FROM SR_MAIN_BG A WHERE A.P ...

  8. php基础系列之 数据的存储和读取

    ·文件处理 ·写入一个文件 1,打开这个文件.如果这个文件不存在,需要先创建它 2,将数据写入这个文件 3,关闭这个文件 ·从一个文件读出数据 1,打开这个文件.如果这个文件不能打开(例如,文件不存在 ...

  9. 什么是nuget?nuget包是如何管理

    本文链接:https://blog.csdn.net/Microsoft_Mao/article/details/101159800做windows开发的,迟早会接触到nuget这个东西,那么今天我们 ...

  10. AcWing 4. 多重背包问题

    朴素 数据范围小 //数据范围小 #include<iostream> #include<algorithm> using namespace std ; ; int n,m; ...