Loading

BSGS算法

1BSGS

该算法解决的是下面的问题:

求解一个最小的x,使得:

\[a^x\equiv b\mod p \]

其中p为素数。

2流程

  1. \(m=\sqrt p\),令\(x=m*q-r\),其中\(0\leq r < m\)
  2. 枚举\(a^r\times b\)并把结果存到hash表里。
  3. 枚举 \(q\),因为\(a^p\equiv a\mod p\) 所以我们只用枚举0到m
  4. 在 hash 表里查询 \(a^q\) 即可。

注:注意判断是否整除

一些代码还是得看书上的代码

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<sstream>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<deque>
#include<cstdlib>
#include<ctime>
#define dd double
#define ld long double
#define ll long long
#define int long long
#define ull unsigned long long
#define N 1000007
#define M number
using namespace std;

const int INF=0x3f3f3f3f;

inline int Min(int a,int b){
	return a>b?b:a;
}

inline ll read(){
	ll x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
} 

int p,b,n,ans=INF;

inline int ksm(int a,int b,int mod){
	int res=1;
	while(b){
		if(b&1) (res*=a)%=mod;
		a=a*a%mod;
		b>>=1;
	}
	return res;
}

struct HASH{
	static const int mod=1000007;
	int a[N+2],b[N+2];
	
	inline HASH(){
		memset(a,-1,sizeof(a));
	}
	
	inline int h(int x){
		return x%mod;
	}
	
	inline int find(int x){
		int w=h(x);
		while(a[w]!=-1&&a[w]!=x){
			w++;
			if(w==mod) w=0;
		}
		return w;
	}
	
	inline bool insert(int x,int ci){
		int w=find(x);
		if(a[w]==x) return 0;
		a[w]=x;b[w]=ci;
		return 1;
	}
	
	inline bool ask(int x,int &ci){
		int w=find(x);
		if(a[w]==-1) return 0;
		ci=b[w];
		return 1;
	}
};
HASH ha;

inline int bsgs(int a,int b,int p){
	b%=p;
	int t=(int)sqrt(p)+1;
	for(int j=0;j<t;j++){
		int val=(ll)b*ksm(a,j,p)%p;
		ha.insert(val,j);
	}
	a=ksm(a,t,p);
	if(a==0) return b==0?1:-1;
	for(int i=0;i<=t;i++){
		int val=ksm(a,i,p);
		int j;
		if(ha.ask(val,j)){
			if(j>=0&&i*t-j>=0) return i*t-j;
		}
	}
	return -1;
} 

signed main(){
	p=read();b=read();n=read();
	ans=bsgs(b,n,p);
	if(ans==-1) printf("no solution\n");
	else printf("%lld",ans);
	return 0;
}
posted @ 2021-04-02 15:47  hyl天梦  阅读(46)  评论(0编辑  收藏  举报