BSGS和EXBSGS

也許更好的閱讀體驗

DescriptionDescription

給定a,b,pa,b,p,求一個xx使其滿足axb (mod p)a^x\equiv b\ \left(mod\ p\right)

BSGSBSGS

BSGSBSGS可以解決pp質數的情況
m=pm=\lceil \sqrt p\rceil

x=imkx=i\cdot m-k

aimkb (mod p)a^{i\cdot m-k} \equiv b\ (mod\ p)

兩邊同乘 aka^kaimbak (mod p)a^{i\cdot m}\equiv b\cdot a^k\ (mod\ p)

我們先將右邊的 bakb\cdot a^k 全部求出來存到一個表裏,這樣預處理時間複雜度爲 p\sqrt p

之後再枚舉 iip\sqrt p ,看錶裏有沒有 aim mod pa^{i\cdot m}\ mod\ p,有的話就有一組解

再反向求出xx即可

EXBSGSEXBSGS

pp不是質數
g=gcd(a,p)g=gcd(a,p)
ax1aggbgg (mod pgg)a^{x-1}\cdot \dfrac{a}{g}\cdot g \equiv \dfrac{b}{g}\cdot g\ \left(mod\ \dfrac{p}{g}\cdot g\right)
把那個gg除掉
ax1agbg (mod pg)a^{x-1}\cdot \dfrac{a}{g} \equiv \dfrac{b}{g}\ \left(mod\ \dfrac{p}{g} \right)
然後重複這個過程直到a,pa,p互質

pp除掉gcd(a,p)gcd(a,p)後可能仍與aa有公約數,與agcd(a,p)\frac{a}{gcd(a,p)}互質

顯然,在這個過程中如果pp不能被bb整除就無解

到最後會得到這樣的方程
axict (mod p)a^{x-i}\cdot c\equiv t\ \left(mod\ p\right)
cc是由aa的冪除以若干個因子得到的 c,tc,t肯定互質
兩邊乘以c1c^{-1}(逆元)
axitc1 (mod p)a^{x-i}\equiv t\cdot c^{-1}\ \left(mod\ p\right)
BSGSBSGSxix-i求解即可
最後記得加上ii

CodeCode

BSGSBSGS

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;
}
//}}}

EXBSGSEXBSGS

//{{{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;
}
//}}}

如有哪裏講得不是很明白或是有錯誤,歡迎指正
如您喜歡的話不妨點個贊收藏一下吧

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章