首页 > 其他分享 >BSGS

BSGS

时间:2023-01-28 16:57:26浏览次数:30  
标签:mathbb gcd 原根 cdot varphi delta BSGS

简介

BSGS(baby-step giant-step),即大步小步算法,常用于求解离散对数问题。形式化地说,该算法可以在 \(O(\sqrt{p})\) 的时间内求解 \(a^x \equiv b \pmod p\) (\(a\perp p\)) 方程的解 \(x\) 满足 \(0 \le x < p\)。(在这里需要注意,只要 \(a\perp p\) 就行了,不要求 \(p\) 是素数)

扩展

对于\(a^x \equiv b \pmod p\),\(a,p\)不一定互质,在模 \(p\) 意义下 \(a\) 不一定存在逆元,于是我们想办法让他们变得互质
我们设 \(d_1=\gcd(a,p)\),如果 \(d_1\nmid b\),则原方程无解。否则我们把方程同时除以 \(d_1\),得到

\[\frac{a}{d_1}\cdot a^{x-1}\equiv \frac{b}{d_1} (\mod \frac{p}{d_1}) \]

如果\(a\not\perp \frac{p}{d_1}\),就继续除,设 \(d_2=\gcd\left(a,\frac{p}{d_1}\right)\) ,如果 \(d_2\nmid \frac{b}{d_1}\),则方程无解;否则同时除以 \(d_2\) 得到

\[\frac{a}{d_1\cdot d_2}\cdot a^{x-2}\equiv \frac{b}{d_1\cdot d_2} (\mod \frac{p}{d_1\cdot d_2}) \]

重复上述操作,直到\(a\perp \frac{p}{d_1\cdot d_2 \dots d_k}\)

code

BSGS

il int bsgs(int a,int b,int p){
    if(1%p==b%p) return 0;
    int t=ceil(sqrt(p)),s=1,ss=0;
    mp.clear();
    for(ri int i=0;i<t;++i){
        if(s==b) return i; // a^0=1
        mp[s*b%p]=i,s=s*a%p;
    }
    ss=s;
    for(ri int i=1;i<=t;++i){
        if(mp.count(ss)) return i*t-mp[ss];
        ss=ss*s%p;
    }
    return -1;
}

exBSGS

il int exbsgs(int a,int b,int p){
    int d=1,nxtd=0,as=0,xi=1%p,k=0;
    while(1){
        nxtd=gcd(xi*a%p,p);
        if(d==nxtd) break;
        if(xi==b) return k;
        ++k,xi=xi*a%p,d=nxtd;
    }
    if(b%d) return -1;
    xi/=d,p/=d,b/=d;
    b=b*inv(xi,p)%p,as=bsgs(a,b,p);
    return (~as)?k+as:as;
}

知识点

  • 定义:由欧拉定理可知,对\(a\in \mathbb{Z},m\in\mathbb{N^* }\),若\(gcd(a,m)=1\) ,则 \(a^{\varphi(m)}\equiv 1\pmod m\)
    因此满足同余式\(a^n\equiv 1\pmod m\)的最小正整数\(n\)存在,这个\(n\)称作\(a\)模\(m\)的阶,记作\(\delta_m(a)\)

  • 性质:

  1. \(a^1,a^2,...,a^{\delta_m(a)}\)模\(m\)两两不同余

  2. 若\(a^n\equiv 1\pmod m\),则\(\delta_m(a)\mid n\)
    推论1:若\(a^p\equiv a^q\),则有\(p\equiv q \pmod{\delta_m(a)}\)
    推论2:若\(gcd(a,m)=1\),\(\delta_m(a)\mid\varphi(m)\)

  3. 设\(m\in\mathbb{N^* },a,b\in\mathbb{Z},gcd(a,m)=gcd(b,m)=1\),则\(\delta_m(a\cdot b)=\delta_m(a)\cdot \delta_m(b)\) 的充分条件是\(gcd(\delta_m(a),\delta_m(b))=1\)

  4. 设\(k\in\mathbb{N},m\in\mathbb{N^* },a\in\mathbb{Z},gcd(a,m)=1\),则\(\delta_m(a^k)=\frac{\delta_m(a)}{gcd(\delta_m(a),k)}\)

  5. 若\(p\) 为素数,则\(\delta_p(g^i)=\delta_p(g)\)的充要条件为\(gcd(\delta_p(g),i)=1 (g\in\mathbb{N^* })\)。\(\\g^i\)也可以表示为\(g^{gcd(\delta_p(g),i)\cdot r} (r\in\mathbb{N^* })\)

原根

  • 定义:设\(m\in\mathbb{N^* },a\in\mathbb{Z}\),若\(gcd(a,m)=1\),且\(\delta_m(a)=\varphi(m)\),则称\(a\)为\(m\)的原根

  • 定理:

  1. 原根判定定理:设\(m\geqslant3,gcd(a,m)=1\),则\(a\)是模\(m\)的原根的充要条件是,对于\(\varphi(m)\)的每个素因数\(p\),都有
    $a^{\frac{\varphi(m)}{p}}\not\equiv1\pmod m $

  2. 原根个数:若一个数\(m\)有原根,则它原根的个数为\(\varphi(\varphi(m))\)

  3. 原根存在定理:
    引理1:设\(a\)与\(b\)是与\(p\)互素的两个整数,则存在\(c\in\mathbb{Z}\)使得\(\delta_p(c)=lcm(\delta_p(a),\delta_p(b))\)
    定理1:一个数\(m\)存在原根当且仅当\(m=2,4,p^\alpha,2\cdot p^\alpha\),其中\(p\)为奇素数,\(\alpha\in\mathbb{N^* }\)
    引理2:存在模\(p\)的原根\(g\),使得\(g^{p-1}\not\equiv1\pmod{p^2}\)
    定理2:对于奇素数\(p,\alpha\in\mathbb{N^* }\),\(p^\alpha\) 有原根
    定理3:对于奇素数\(p,\alpha\in\mathbb{N^* }\),\(2\cdot p^\alpha\) 的原根存在
    定理4:对于\(m\ne2,4\),且不存在奇素数\(p\)及\(\alpha\in\mathbb{N^* }\)使得\(m=p^\alpha,2\cdot p^\alpha\),模\(m\)的原根不存在

  4. 若\(gcd(g,n)\)且(n>0),则\(g\)为\(n\)的一个原根的充要条件为\(S=\{g^1,g^2...g^{\varphi(n)}\}\)为\(n\)的一组简化剩余系

  5. 若奇素数\(p\)的原根\(g\)满足\(g^{p-1}\not\equiv1\pmod {p^2}\),则对于每一个\(a\geqslant2\),有\(g^{\varphi(p^{a-1})}\not\equiv1\pmod {p^a}\)

  6. 若\(p\)为素数,\(a\)为整数且\(p\nmid a\),则在一个模\(p\)的完全剩余系中恰有\(\varphi(\delta_p(a))\)个数模\(p\)的阶为\(\delta_p(a)\)

  7. 对于任意整数\(h\)使得\(\delta_p(h)=\delta_p(a)\),定存在\(a^{d_i} (i\in[1,\varphi(\delta_p(a))\cap\mathbb{Z}])\)在模\(p\)意义下与\(h\)同余

  8. 若\(p\)为整数且有一个原根\(g\),则\(p\)恰有\(\varphi(\varphi(p))\)个在模\(p\)意义下不同余的原根,它们由集合\(S=\{g^i|1\leqslant i\leqslant\varphi(p),gcd(p,i)=1\}\)中的数给出

标签:mathbb,gcd,原根,cdot,varphi,delta,BSGS
From: https://www.cnblogs.com/windymoon/p/17070831.html

相关文章

  • 【学习笔记】BSGS与原根学习笔记
    参考资料:OI-Wiki\(\text{BSGS}\)(\(\text{Big-Step-Giant-Step}\))最基本的线性同余方程:\[ax\equivb\pmodp\]可以转化成不定方程:\[ax+py=b\]使用扩展欧几里得算法......
  • 扩展大步小步法(exBSGS)
    从昨天调到今天,刚调过总结一下。exBSGS是解决\(a^{l}\equivb(\modp)(\gcd(a,p)\ne1)\)求最小非负整数\(l\)的问题。\(a^{l-1}\timesa\equivb(\modp)\)$a^{l-1}\ti......
  • 算法学习笔记(10): BSGS算法及其扩展算法
    BSGS算法及其扩展算法BSGS算法所谓BabyStep,GiantStep算法,也就是暴力算法的优化用于求出已知\(a,b,p,p为质数\)时\(a^x\equivb\pmodp\)的一个最小正整......
  • 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......
  • BSGS
    BSGS(大步小步法)BSGS可以在\(O(\sqrt{p})\)的时间内求解满足\(a^x\equivb\pmodp\)的\(x\),其中\(a\perpp,x>0\)。实现原理:尝试进行和整除分块异曲同工的......
  • Shank's Baby-Step-Giant_Step Algorithm(BSGS)
    解模方程(\(n\)为素数)\[a^x\equivb(\bmodn)\]因为欧拉定理\(a^{\phi(n)}\equiv1(\bmodn)\)(\(n\)为素数)。有\[0\lex\len-1\]设\(m=\sqrt{n+......
  • BSGS学习笔记
    对于一个式子\(\quad\quadat\equivb(mod\p)\)我们可以用扩展欧几里得算法求解而对于这个式子\(\quad\quada^t\equivb(mod\p),(a,p)=1\)我们就要用\(BSGS\)求......
  • BSGS算法学习小记(大步小步算法)
    简介先看一个式子xy≡z(modp),z是质数现在只知道x和z,要求y。大步小步算法(BSGS,BabyStepsGiantSteps)就是解决这个问题。算法流程暴搜的枚举范围根据费马小定理:xp−1≡1。......