BSGS
bsgs用于求指数方程 a x ≡ b ( m o d m ) a^x \equiv b \pmod m ax≡b(modm)的解
然后令 x = q ∗ t − r x = q * t - r x=q∗t−r,得到 b ∗ a r = a q t b*a^r = a^{qt} b∗ar=aqt
然后就枚举 : q ∈ ( 0 , m / t + 1 ) , r ∈ ( 0 , t − 1 ) q \in {(0,m/t+1)} , r \in (0,t-1) q∈(0,m/t+1),r∈(0,t−1)
预处理 a q t a^{qt} aqt,枚举 r r r判断 b a r ba^r bar是否有 a q t a^{qt} aqt与其相等(map)
int exbsgs(int a,int b,int p)
{
if (b==1||p==1)return 0; //特殊情况,x=0时最小解
int g=gcd(a,p),k=0,na=1;
while (g>1)
{
if (b%g!=0)return -1; //无法整除则无解
k++;b/=g;p/=g;na=na*(a/g)%p;
if (na==b)return k; //na=b说明前面的a的次数为0,只需要返回k
g=gcd(a,p);
}
int f=bsgs(a,b*inv(na,p)%p,p);
if (f==-1)return -1;
return f+k;
}
EXBSGS
a x ≡ b ( m o d m ) a^x \equiv b \pmod m ax≡b(modm)
a ∗ a x − 1 ≡ b ( m o d m ) a*a^{x-1} \equiv b \pmod m a∗ax−1≡b(modm)
d = ( a , m ) d=(a,m) d=(a,m)
a d ∗ a x − 1 ≡ b d ( m o d m d ) \frac{a}{d}*a^{x-1} \equiv \frac{b}{d} \pmod {\frac{m}{d}} da∗ax−1≡db(moddm),如果d不能整除b则无解
a x − 1 ≡ b d ∗ ( a d ) − 1 ( m o d m d ) a^{x-1} \equiv \frac{b}{d}*(\frac{a}{d})^{-1} \pmod {\frac{m}{d}} ax−1≡db∗(da)−1(moddm)
然后递归,gcd(a,m)=1为质数就BSGS,快乐得很
int exbsgs(int a,int b,int p)
{
if (b==1||p==1)return 0; //特殊情况,x=0时最小解
int g=gcd(a,p),k=0,na=1;
while (g>1)
{
if (b%g!=0)return -1; //无法整除则无解
k++;b/=g;p/=g;na=na*(a/g)%p;
if (na==b)return k; //na=b说明前面的a的次数为0,只需要返回k
g=gcd(a,p);
}
int f=bsgs(a,b*inv(na,p)%p,p);
if (f==-1)return -1;
return f+k;
}