bsgs(数论)

来源:互联网 发布:js strict mode 编辑:程序博客网 时间:2024/05/16 18:55

b(bei)s(shang)g(guang)s(shen)算法
专门用来解决
x^y 同余于 z(mod p)
已知x,z求y
这里写图片描述

这里写代码片#include<cstdio>#include<map>#define ll long longusing namespace std;const ll mod=99842353;map<ll> mp;ll KSM(ll a,ll p,ll mod){    ll t=1;    while (!p)    {        if (p&1)             t=(t*a)%mod;        a=(a*a)%mod;        p>>=1;    }    return t;}void bsgs(ll x,ll z,ll p){    mp.clear();    x%=p;   //    if (x==0&&y==0) return 0;    if (x==0) return -1;  //不存在的     ll m=ceil(sqrt((double)p)),now=1;  //这样计算m肯定没问题     mp[1]=m+1;  //x^0==1,mp的下标x^i,数组里记录的是i,因为mp本身就是0,所以用m+1代表0     for (i=1;i<m;i++)     {        now=(now*x)%p;        if (!mp[now]) mp[now]=i;    }     ll inv=1,tmp=(x,p-m-1,p);  //inv x^km逆元    for (int k=0;k<m;k++)  //枚举k    {        int i=mp[(z*inv)%p];  //z*x^-km         if (i)        {            if (i==m+1) i=0;            return k*m+i;        }        inv=(inv*tmp)%p;    }    return -1;} 
原创粉丝点击