求原根與指標模板

應奇怪的數競朋友的要求幫忙而複習了下如何求奇素數的原根,以及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;
}
相關文章
相關標籤/搜索