首页 > 其他分享 >大步小步

大步小步

时间:2023-03-17 19:22:28浏览次数:25  
标签:pmod 小步 sqrt 大步 ll 根号 equiv

大步小步算法是一种可以在\(O(\sqrt{p})\)的时间内求出形如 \(a^x \equiv b \pmod{p}\)或 \(x^a \equiv b \pmod{p}\)的算法,其实思想异常的简单,这里介绍一下第一种

我们发现,$a^{\phi(p)} $ ~ \(a^{1}\) 之间的结果包含了所有的可能模数结果,所以我们通过人类智慧进行根号平衡

我们设 \(q=\sqrt{p}+1\),则发现,所有小于根号的结果我们可以直接爆算,所有大于根号的结果我们可以像分块那样预处理出来

所以大步小步其实就是数论意义上的分块?

说一下具体算法流程

我们先暴力预处理一下零散块的答案,然后把他挪到柿子右边,像这样

(这里设总块数为 \(i\),零散块为 \(j\),块长为 \(t\)

\[a^{i*t-j} \equiv b \pmod p\\ a^{i*t} \equiv b \,*\, a^j \]

这一步变形的前提是 \(a\) 与 \(p\) 互质,才能推出来这一步,否则,要用到 EX-BSGS

接下来的事情好办了,我们对于每一个 \(j\) 预处理出来 \(a^j \, * \, b \pmod p\),然后枚举大块的块数,验证一下就好了

复杂度 \(O(\sqrt{p})\)

#include <iostream>
#include <map> 
#define ll long long


using namespace std;
ll a,b,p;
map<ll,ll>hsh;

void bsgs(){
	ll t;
	for(t=1;t*t<=p;++t) ;
	--t;
	ll tmp=1;
	hsh[0]=b;
	for(int i=1;i<t;++i)
		tmp=(tmp*a)%p,hsh[(b*tmp)%p]=i;
	if(a==0){
		if(b==0) cout << 1  << endl;
		else cout << "no solution" << endl;
		return ;
	} 
	tmp=(tmp*a)%p;
	ll q=1;
	for(int i=1;i<=t;++i){
		q=(tmp*q)%p;
		if(hsh.find(q)!=hsh.end()) {
			cout << i*t-hsh[q] << endl;
			return ;
		}
	}
	cout << "no solution" << endl;
		
}

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0); 
	cin >> p >> a >> b;
	bsgs();
	
	return 0;
} 

标签:pmod,小步,sqrt,大步,ll,根号,equiv
From: https://www.cnblogs.com/Benzenesir/p/17227920.html

相关文章

  • 四大步骤,教你彻底关闭Win10自动更新
     参考如下:https://baijiahao.baidu.com/s?id=1732432888882246429&wfr=spider&for=pc 关闭WindowsUpdate服务若您想彻底关闭Win10自动更新,可以在Windows服务中找......
  • 九大步骤带你了解如何通过路由器保护内网安全!
    对于大多数企业来说,路由器已经成为目前最重要的安全设备之一,路由器在经过一定的设置后,几乎能够把所有坏分子阻挡在外,今天给大家分享保护网络安全的9个步骤,以下是详细的......
  • 自注意力机制:8大步骤图解+代码
    以下来自 https://www.sohu.com/a/356558093_473283 来源:towardsdatascience 作者:RaimiKarim 编辑:肖琴https://towardsdatascience.com/illustrated-self-attent......
  • 四大步骤,教你彻底关闭Win10自动更新
     尽管Win11已经发布了一段时间,但目前互联网上大部分电脑用户所使用的的操作系统仍是Win10,对于Win10,笔者相信大部分人应该都不陌生,作为目前市面上占比最高的电脑系统,Win1......
  • 扩展大步小步法(exBSGS)
    从昨天调到今天,刚调过总结一下。exBSGS是解决\(a^{l}\equivb(\modp)(\gcd(a,p)\ne1)\)求最小非负整数\(l\)的问题。\(a^{l-1}\timesa\equivb(\modp)\)$a^{l-1}\ti......
  • 大步小步算法(BSGS)
    BSGS是解决\(a^{l}\equivb(\modp)\)已知\(a\)、\(b\)、\(p\)的情况下求最小的非负整数\(l\)的算法。设$m=\left\lceil\sqrt{p}\right\rceil$,\(l=x\timesm-y(0\l......
  • LeetCode刷题(107)~制造字母异位词的最小步骤数【巧妙】
    题目描述给你两个长度相等的字符串s和t。每一个步骤中,你可以选择将t中的任一字符替换为另一个字符。返回使t成为s的字母异位词的最小步骤数。字母异位词指字母......
  • 在今年的数字生态大会上,云原生数据库前进了一大步
    云计算时代,数据库上云已成为产业数字化转型的重要动力。近期,在2022腾讯全球数字生态大会云原生数据库技术探索专场上,腾讯云分享了在云原生数据库领域的技术演进与探索,并就......
  • BSGS算法学习小记(大步小步算法)
    简介先看一个式子xy≡z(modp),z是质数现在只知道x和z,要求y。大步小步算法(BSGS,BabyStepsGiantSteps)就是解决这个问题。算法流程暴搜的枚举范围根据费马小定理:xp−1≡1。......
  • 数字化转型如何认清本质少被忽悠:小步快跑看到项目效果再推下一步
    这些年,我们见识了太多新概念:数据智能、DataFabric、数据虚拟化还有最著名的“数据中台”。然而,跟几年前疯狂追逐这些热词不同,或者说因为已经踩坑踩到晕厥。动辄一个千万的......