BSGS算法初探

前言

$BSGS$算法,全称$Baby Step Giant Step$,即大小步算法。某些奆佬也称其为(Ba)(Shan)(Gai)(Shi)算法。

它的主要作用是求解形式如$x^t\equiv y(mod MOD)$的式子中$t$的值。

而且,它是一个简单易懂的算法(毕竟连我这样的数学渣渣都能理解)。


一个简单的性质

首先,我们需要知道一个简单的性质。

费马小定理可得,$x^{MOD-1}\equiv1(mod MOD)$。

$Link$

费马小定理详见博客筛素数方法(二)—— 费马小定理及MR素数判断

因此,当$t\ge MOD-1$时,会出现一个循环节。

于是我们就能保证答案$t$如果存在,则必然$<MOD-1$

这是一个简单而又重要的性质。


$BSGS$算法的主要思想

$BSGS$算法的主要思想就是两个字:分块(提到分块就要$%$一波分块奆佬$hl666$)。

根据分块思想,我们设一个变量$Size=\sqrt{MOD}$(注意,此处要用$ceil$函数向上取整,这样才能保证$Size*Size\ge MOD$,不然可能会遗漏答案)。

不难发现,此时的$t$可以表示为$i*Size-j$($i,j$均为非负整数且$j<Size$)。

那么原式就被转化成了$x^{i*Size-j}\equiv y(mod MOD)$。

移项得$x^{iSize}\equiv x^jy(mod MOD)$。

然后怎么处理呢?

我们可以对$x^j*y$的值进行一波预处理,用一个$map$存储下来。

然后枚举$i$,判断$x^{i*Size}$的值是否存在即可。

当找到一个合法的$i$后,最终的答案就是$i*Size-j$。


时间复杂度分析

预处理的时间复杂度显然是$O(j)$的,枚举$i$的时间复杂度显然是$O(i)$的。

又由于$i$和$j$都是$O(\sqrt N)$大小的,所以总复杂度也是$O(\sqrt N)$级别的,是一个比较优秀的算法。


代码

map<int,int> s;//定义一个map
inline int BSGS(int x,int y,int MOD)//对于一个式子x^t=y(mod MOD),求出t的值
{
    register int i,t=1,base,Size=ceil(sqrt(MOD));//注意此处要用ceil函数向上取整
    for(i=0;i<=Size;++i) s[1LL*t*y%MOD]=i,base=t,t=1LL*t*x%MOD;//预处理将(x^j)*y的值全部用map存下对应的j,并用base存储下x^Size
    for(i=1;i<=Size;++i,x=1LL*x*base%MOD)//枚举i,每次将t乘上x^Size
        if(s[t]) return i*Size-s[t];//找到一个合法的i,则答案就是i*Size-j
    return 0;//无解返回0
}

原文地址:https://www.cnblogs.com/chenxiaoran666/p/BSGS.html

时间: 2024-08-29 03:43:26

BSGS算法初探的相关文章

bzoj2242: [SDOI2011]计算器 &amp;&amp; BSGS 算法

BSGS算法 给定y.z.p,计算满足yx mod p=z的最小非负整数x.p为质数(没法写数学公式,以下内容用心去感受吧) 设 x = i*m + j. 则 y^(j)≡z?y^(-i*m)) (mod p) 则 y^(j)≡z?ine(y^(i*m)) (mod p)(逆元) 由费马小定理y^(p-1)≡1 (mod p) 得 ine(y^m) = y^(p-m-1)  ine(y^(i*m)≡ine(y^((i?1)m))?y^(p-m-1)  1.首先枚举同余符号左面,用一个hash保存

BSGS算法学习小记(大步小步算法)

简介 先看一个式子xy≡z(modp),z是质数 现在只知道x和z,要求y. 大步小步算法(BSGS,Baby Steps Giant Steps)就是解决这个问题. 算法流程 暴搜的枚举范围 根据费马小定理:xz?1≡1. 如果y已经枚举到了z-1了,继续枚举的话就会产生循环. 所以,在暴搜中y的枚举范围就是0--z-1. 如何优化暴搜 我们想一想可不可以用分块来解决枚举的y. 把y分成p?1????√分别枚举行不行? 设m=p?1????√,y=a?m+b,这样枚举a和b就相当于分块枚举了.

BSGS算法+逆元 POJ 2417 Discrete Logging

POJ 2417 Discrete Logging Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 4860   Accepted: 2211 Description Given a prime P, 2 <= P < 231, an integer B, 2 <= B < P, and an integer N, 1 <= N < P, compute the discrete logarith

BSGS算法_Baby steps giant steps算法(无扩展)最强详解,你从未见过的详细

Baby Steps-Varsity Giant Step-Astronauts(May'n?椎名慶治) 阅读时可以听听这两首歌,加深对这个算法的理解.(Baby steps少女时代翻唱过,这个原唱反而不是很有名……Giant Step就比较碉,是一个假面骑士片的插曲,由超碉的May'n和一个人建立的临时组合唱的,怕不怕) 这个主要是用来解决这个题: A^x=B(mod C)(C是质数),都是整数,已知A.B.C求x. 我在网上看了好多介绍,觉得他们写得都不够碉,我看不懂…于是我也来写一发. 先

BSGS算法及拓展

https://www.zybuluo.com/ysner/note/1299836 定义 一种用来求解高次同余方程的算法. 一般问题形式:求使得\(y^x\equiv z(mod\ p)\)的最小非负\(x\). \(BSGS\)算法 要求\(p\)是质数. 由费马小定理可知,\(y^{p-1}\equiv1(mod\ p)\),所以暴力枚举只要枚举到\(p?1\)即可. 但是由于\(p\)一般都很大,所以一般都跑不动... 优化算法\(ing...\) 现在令\(x=mi?j\)(其中\(m

BSGS算法!

求解关于x的方程 a^x=z(mod p),其中gcd(a,p)=1. 做法的话并不难,但是要搞懂细节还蛮多的. bsgs算法是这样的:x可以写成i*m-j的形式(这里m取值随意,但是取√p上取整时跑的最快) a^(im-j)≡z(mod p) 推得  a^im≡z*(a^j) 那么我们枚举j的值从0--(m-1),将算出的z*(a^j)加入map里面 再枚举i从1-m,将每次算出的a^im的结果去map中匹配 若匹配到,x=i*m-j. 细节 1.i的范围从1到m 证明: a ^ x Ξ b

BSGS算法(大小步算法)

$BSGS$ 算法 $Baby\ Steps\ Giant\ Steps$. 致力于解决给定两个互质的数 $a,\ p$ 求一个最小的非负整数 $x$ 使得 $a^x\equiv b(mod\ p)$ 其中 $b$ 为任意正整数,$2≤a<p$,$2≤b<p$ 该算法使用的原理与欧拉定理有关,其中$a,\ p$互质 $a^{\phi (p)}\equiv 1(mod\ p)$ 又因为 $a^0\equiv 1(mod\ p)$ 所以$0到\phi p$是一个循环节,也就是说该算法最多查找$\p

高次不定方程BSGS算法

学习数学真是一件赛艇的事. BSGS名字听起来非常有意思,力拔山兮气盖世,北上广深,小步大步...算法其实更有意思,它是用来求解一个方程的 \(A^x≡B mod P\) 是不是特别眼熟,有几个式子长的特别像,先观察一下: 一:快速幂: 求\(A^B mod P\)的值 二:乘法逆元 \(A*x ≡ 1 (mod P)\) 或者 \(A*x ≡ B (mod P)\) 三:欧拉定理 \(A^{φ(P)}≡ 1 (mod P)\) (A,P互质) 四:费马小定理 \(A^{P-1} ≡ 1 (mo

数据挖掘领域十大经典算法初探

译者:July   二零一一年一月十五日 ----------------------------------------- 参考文献:国际权威的学术组织ICDM,于06年12月年评选出的数据挖掘领域的十大经典算法:C4.5, k-Means, SVM, Apriori, EM, PageRank, AdaBoost, kNN, Naive Bayes, and CART.==============博主说明:1.原文献非最新文章,只是本人向来对算法比较敏感.感兴趣,便把原文细看了下,翻译过程中