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

时间: 2024-10-12 03:28:22

BSGS和EXBSGS的相关文章

BSGS与ExBSGS:大步小步法

BSGS与ExBSGS:大步小步法 朴素BSGS \(BSGS\)也就是\(Baby~ Step~ Giant~ Step\),用以解决形如以下的问题: 求解\(A^x \equiv B (mod~C)\)的最小整数解.其中\(A\)与\(C\)互质. 设\(x = am - b\)则原式变为 \[ A^{am-b}\equiv B(mod~C) \] \[ A^{am}\equiv B\times A^b(mod~C) \] 然后我们假设\(m = \sqrt {C}\)则\(a \in [1

知识点简单总结——BSGS与EXBSGS

知识点简单总结--BSGS与EXBSGS BSGS 给出 $ A,B,C,(A,C)=1 $ ,要你求最小的 $ x $ ,使得 $ A^x \equiv B(mod \ C) $ . 在数论题中经常会看见这样的式子,而它的用处确实也不少,例如: 求指标 ...想不到了(被打) 解题思路 众所周知 $ A^{x} \equiv A^{x \ mod \ \phi (C) }(mod \ C) $ 所以考虑暴力枚举就可以. 但是我们显然要考虑一个更快的. 分块就好了. 设块大小 $ m $ ,预处

省选算法学习-BSGS与exBSGS

前置知识 扩展欧几里得,快速幂 都是很基础的东西 扩展欧几里得 说实话这个东西我学了好几遍都没有懂,最近终于搞明白,可以考场现推了,故放到这里来加深印象 翡蜀定理 方程$ax+by=gcd(a,b)$一定有整数解 证明: 因为$gcd(a,b)=gcd(b,a$ $mod$ $b)$ 所以假设我们已经求出来了$bx+(a$ $mod$ $b)y=gcd(b,a$ $mod$ $b)$的一组整数解$(p,q)$ 因为$a$ $mod$ $b=a-(\lfloor \frac{a}{b} \rflo

BSGS 以及 ExBSGS

BSGS 引入 求解关于\(X\)的方程, \[A^X\equiv B \pmod P\] 其中\(Gcd(A,P)=1\) 求解 我们令\(X=i*\sqrt{P}-j\),其中\(0<=i,j<=\sqrt{P}\) 则原式可以变为: \[A^X\equiv B \pmod P\] \[A^{i*\sqrt{P}-j}\equiv B \pmod P\] 由于\(Gcd(A,P)=1\),则可以恒等变化为: \[A^{i*\sqrt{P}}\equiv B*A^j \pmod P\] 则我

OI知识汇总

以作者的水平为准 基础算法:枚举——>倍增 差分(前缀和)——>二维 贪心 分治:归并排序(逆序对) 二分答案 二分查找 快速排序——>离散化 递归/递推 搜索:深搜(所有方案),宽搜(最优解) DFS优化:迭代 最优性剪枝/可行性剪枝/搜索顺序 记忆化搜索 折半搜索 A*/IDA* BFS优化:双向BFS 判重(康托展开) 优先队列搜索 DP:线性DP(LIS/LCS)  O(nlogn)算法 区间DP 树形DP 背包类DP(01背包,完全背包,多重背包) 数位DP DP优化:排除冗余

BSGS&amp;EXBSGS 大手拉小手,大步小步走

BSGS代码: #include<cstdio> #include<algorithm> #include<cmath> #include<iostream> #include<map> #include<cstring> using namespace std; typedef long long ll; const int N=46349; const int mod=100003; ll p,A,B; ll ni[N]; str

[note]BSGS &amp; exBSGS

BSGS (感觉这东西还是要写一下) BSGS主要用于求解形如\(x^k=y\pmod p\)(注意这里p与x互质)这样的方程的最小正整数解的问题 设\(m=\lceil\sqrt p\rceil,k=am-b,a\in[1,m],b\in[0,m)\) 那么上面的方程可以变形成\(x^{am}=yx^b\pmod p\) 枚举\(b\),计算出右边的值存到\(map\)中,枚举\(a\)查表即可 Q:可以枚举左边存表,右边查嘛? A:可以,但是左边查到表可以直接输出... 顺便一说,map里要

bzoj 3283 扩展BSGS + 快速阶乘

T2  扩展BSGS T3 快速阶乘 给定整数n,质数p和正整数c,求整数s和b,满足n! / pb = s mod pc 考虑每次取出floor(n/p)个p因子,然后将问题转化为子问题. 1 /************************************************************** 2 Problem: 3283 3 User: idy002 4 Language: C++ 5 Result: Accepted 6 Time:1704 ms 7 Memor

【BZOJ1467/2480】Pku3243 clever Y/Spoj3105 Mod EXBSGS

[BZOJ1467/2480]Pku3243 clever Y/Spoj3105 Mod Description 已知数a,p,b,求满足a^x≡b(mod p)的最小自然数x. Input 每个测试文件中最多包含100组测试数据. 每组数据中,每行包含3个正整数a,p,b. 当a=p=b=0时,表示测试数据读入完全. Output 对于每组数据,输出一行. 如果无解,输出“No Solution”(不含引号),否则输出最小自然数解. Sample Input 5 58 33 2 4 3 0 0