首页 > 其他分享 >扩展大步小步法(exBSGS)

扩展大步小步法(exBSGS)

时间:2023-01-16 19:57:08浏览次数:62  
标签:cnt frac gcd kd int exBSGS unsigned 大步 步法

从昨天调到今天,刚调过总结一下。
exBSGS是解决\(a^{l}\equiv b(\mod p)(\gcd(a,p)\ne 1)\)求最小非负整数\(l\)的问题。
\(a^{l-1}\times a\equiv b(\mod p)\)
$a^{l-1}\times \frac{a}{\gcd(a,p)}\equiv \frac{b}{\gcd(a,p)}(\mod \frac{p}{\gcd(a,p)}) $
设\(d\)使\(\gcd(a,\frac{p}{d})=1\) 或 \(\frac{a^{cnt}}{d}\equiv \frac{b}{d}(\mod \frac{p}{d})\)
\(a^{l-cnt}\times \frac{a^{cnt}}{d}\equiv \frac{b}{d}(\mod \frac{p}{d})\) 保证\(d\mid b\)
然后就用BSGS解决就可以了。
题目:洛谷P4195
代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<unordered_map>
using namespace std;
inline int kd(){
	unsigned int x=0;
	unsigned int f=1;
	char a=getchar();
	while(a<'0'||a>'9'){
		if(a=='-'){
			f=-1;
		}
		a=getchar();
	}
	while(a>='0'&&a<='9'){
		x=x*10+a-'0';
		a=getchar();
	}
	return x*f;
}
unsigned int a,b,p;
inline unsigned int gcd(unsigned int x,unsigned int y){
	if(y==0){
		return x;
	}
	return gcd(y,x%y);
}
inline unsigned int ksm(unsigned int x,unsigned int y){
	unsigned int ans=1;
	while(y){
		if(y&1){
			ans=1ll*ans*x%p;
		}
		x=1ll*x*x%p;
		y>>=1;
	}
	return ans;
}
int main(){
	a=kd();p=kd();b=kd();
	while(a&&b&&p){
		unordered_map<unsigned int,unsigned int> f;
		unsigned int cun1,cun2;
		b%=p;
		a%=p;
		if(b==1||p==1){
			printf("0\n");
			a=kd();p=kd();b=kd();
			continue;
		}
		unsigned int g=gcd(a,p);
		unsigned int cnt=0;
		unsigned int zong=1;
		while(g!=1){
			if(b%g){
				printf("No Solution\n");
				break;
			}
			cnt++;
			b/=g;
			p/=g;
			zong=1ll*zong*(a/g)%p;
			if(zong%p==b%p){
				printf("%d\n",cnt);
				break;
			}
			g=gcd(a,p);
		}
		if(g!=1){
			a=kd();p=kd();b=kd();
			continue;
		}
		b%=p;
		a%=p;
		unsigned int m=sqrt(p);
		m+=(m*m!=p);
		unsigned int ans=1000000000;
		unsigned int t;
		cun1=zong;
		cun2=ksm(a,m);
		for(unsigned int i=1;i<=m;i++){
			cun1=1ll*cun1*cun2%p;
			f[cun1]=0;
		}
		t=b;
		for(unsigned int i=0;i<m;i++){
			f[b]=0;
			b=1ll*b*a%p;
		}
		b=t;
		cun1=zong;
		for(unsigned int i=1;i<=m;i++){
			cun1=1ll*cun1*cun2%p;
			if(f[cun1]==0){
				f[cun1]=i;
			}
		}
		for(unsigned int i=0;i<m;i++){
			unsigned int w=f[b];
			b=1ll*b*a%p;
			if(w){
				ans=min(ans,w*m-i+cnt);
			}
		}
		if(ans==1000000000){
			printf("No Solution\n");
		}
		else{
			printf("%lld\n",ans);
		}
		a=kd();p=kd();b=kd();
	}
	return 0;
}

标签:cnt,frac,gcd,kd,int,exBSGS,unsigned,大步,步法
From: https://www.cnblogs.com/z-2-we/p/17056188.html

相关文章

  • 2023.1.16[模板]BSGS/exBSGS
    2023.1.16[模板]BSGS/exBSGS全称BoyStepGirlStep给定一个质数p,以及一个整数a,一个整数b,现在要求你计算一个最小的非负整数l,满足\(a^x\equivb(modp)\)算法......
  • BSGS&exBSGS
    BSGS即baby(boy)stepgiant(girl)step算法,用于处理\(a^x\equivb(mod\p)\),给\(a,b,p(a,p互质)\)求所有的\(x\)的问题中本质上有一点点像二分搜索的意味在里面算法......
  • 大步小步算法(BSGS)
    BSGS是解决\(a^{l}\equivb(\modp)\)已知\(a\)、\(b\)、\(p\)的情况下求最小的非负整数\(l\)的算法。设$m=\left\lceil\sqrt{p}\right\rceil$,\(l=x\timesm-y(0\l......
  • R语言EG(Engle-Granger)两步法协整检验、RESET、格兰杰因果检验、VAR模型分析消费者价
    全文链接:http://tecdat.cn/?p=31108原文出处:拓端数据部落公众号作为衡量通货膨胀的基本指标,消费者价格指数CPI和生产者价格指数PPI的作用关系与传导机制一直是宏观经济研......
  • 在今年的数字生态大会上,云原生数据库前进了一大步
    云计算时代,数据库上云已成为产业数字化转型的重要动力。近期,在2022腾讯全球数字生态大会云原生数据库技术探索专场上,腾讯云分享了在云原生数据库领域的技术演进与探索,并就......
  • BSGS算法学习小记(大步小步算法)
    简介先看一个式子xy≡z(modp),z是质数现在只知道x和z,要求y。大步小步算法(BSGS,BabyStepsGiantSteps)就是解决这个问题。算法流程暴搜的枚举范围根据费马小定理:xp−1≡1。......
  • 网络游戏同步法则 -- skywind
    转载出处:http://www.skywind.me/blog/archives/112网路的硬件也有限,而人的创造也无限,在公网平均130ms的Latency下,是不存在“完全的”的同步情况。如何通过消除/隐藏延时,将......
  • 【项目经理--7大步骤轻松跟进项目,让你带项目不再那么累】
    身为项目经理,跟进需求,跟进项目是必备技能,并且经常会遇到各种问题,甚至自己都乱了阵脚,看看项目管理体系指南 PMBOK 吧,感觉又不接地气,离实际较远,那么如何才能更好的跟进项目......
  • 复盘10步法
       ......
  • 5步法助力自动化转型
    手动测试人员应该权衡测试自动化相对于手动测试的好处,并且即可开始行动。下面我介绍一下从手动测试到自动化测试转换的5步指南。步骤1:查找合适的自动化测试用例测试自动......