用途1:
- 可以将模p系统下的一些数转化为原根表示,即,将每个数出现的次数作为系数。这样就可以表示一个多项式,可以配合FFT。
【一个素数的原根求法】
素数p的欧拉函数值为p-1
#include<bits/stdc++.h>
using namespace std;
ll qpow(ll n,ll m,ll p)
{
ll ans=1;
n%=p;
for(;m;m>>=1,n=n*n%p)
if(m&1)ans=ans*n%p;
return ans;
}
int pri[MAX],tot;
ll getRoot(ll p) //求质数p的最小原根
{
tot=0;
ll n=p-1,sq=sqrt(p+0.5);
for(int i=2;i<=sq;i++)if(n%i==0)
{
pri[tot++]=i;
while(n%i==0)n/=i;
}
if(n>1)pri[tot++]=n;
for(int g=2;g<=p-1;g++) //试探每一个g是否原根
{
int flag=1;
for(int i=0;i<tot;i++)if(qpow(g,(p-1)/pri[i],p)==1)
{
flag=0; break;
}
if(flag)return g;
}
return -1; //没有原根
}
int main()
{
int p;
cin>>p;
cout<<"原根="<<getRoot(p)<<endl;
}