BSGS

BSGS

bsgs用于求指数方程 a x ≡ b ( m o d m ) a^x \equiv b \pmod m axb(modm)的解

然后令 x = q ∗ t − r x = q * t - r x=qtr,得到 b ∗ a r = a q t b*a^r = a^{qt} bar=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,t1)

预处理 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 axb(modm)

a ∗ a x − 1 ≡ b ( m o d m ) a*a^{x-1} \equiv b \pmod m aax1b(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}} daax1db(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}} ax1db(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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值