求原根与指标模板

应奇怪的数竞朋友的要求帮忙而复习了下如何求奇素数的原根,以及bsgs求指标。
其实超级简洁的思路。
求原根就是暴力枚举检验,bsgs就是使用了哈希表的暴力枚举检验…
这里就只贴两个函数了。

map<int,int> mp;
int bsgs(int a){
    int now=1,tmp=ksm(G,m);
    mp.clear();
    rep(i,0,m){
        if(mp.count(now))mp[now]=min(mp[now],i);
        else mp[now]=i;
        now=1ll*now*G%mod;
    }
    now=a;
    tmp=1ll*ksm(tmp,mod-2)%mod;
    rep(i,0,m-1){
        if(mp.count(now))return (mp[now]+i*m)%(mod-1);
        now=now*tmp%mod;
    }
    return 0;
}
int get_g(){
    int x=mod-1;tot=0;
    rep(i,1,cnt){
        if(x%p[i])continue;
        if(p[i]>x)break;
        while(x%p[i]==0)x/=p[i];
        q[++tot]=p[i];
    }
    rep(i,2,n){
        bool flag=1;
        rep(j,1,tot){
            if(ksm(i,(mod-1)/q[j])==1){flag=0;break;}
        }
        if(flag)return i;
    }
    return 0;
}
posted @ 2019-06-13 19:20  Sinuok  阅读(251)  评论(0编辑  收藏  举报