1. 程式人生 > >求素數p的原根

求素數p的原根

color push oot tmp mit != nbsp code return

vector<long long >a;
template<class T> T fast_mod(T a,T b,T Mod){
    if(b==0) return 1;
    T ans=1,base=a;
    while(b!=0){
        if(b&1)ans=(ans*base)%Mod;
        base=(base*base)%Mod;
        b>>=1;
    }
    return ans;
}
//求mod p意義下的原根 p為素數
//采用暴力求解,一個一個試p-1的因子即可
bool g_test(long
long g,long long p){ for(long long i=0;i<a.size();i++) if(fast_mod(g,(p-1)/a[i],p)==1) return ; return 1; } long long primitive_root(long long p){ long long tmp=p-1; for(long long i=2;i<=tmp/i;i++) if(tmp%i==0) { a.push_back(i); while(tmp%i==0) tmp/=i; }
if(tmp!=1) a.push_back(tmp); long long g=1; while(1){ if(g_test(g,p)) return g; g++; } }

求素數p的原根