0
点赞
收藏
分享

微信扫一扫

ACM数论之原根


 

ACM数论之原根_i++

用途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;
}

 

举报

相关推荐

0 条评论