设m是正整数,a是整数,若a模m的阶等于φ(m),则称a为模m的一个原根。(其中φ(m)表示m的欧拉函数)
给出1个质数P,找出P最小的原根。
Input
输入1个质数P(3 <= P <= 10^9)
Output
输出P最小的原根。
Input示例
3
Output示例
2
成立,则
求原根目前的做法只能是从2开始枚举,然后暴力判断g^(P-1) = 1 (mod P)是否当且仅当指数为P-1的时候成立。而由于原根一般都不大,所以可以暴力得到。
#include<stdio.h>
using namespace std;
int pi[100010];
int j=0;
int mod_pow(long long x,long long n,long long mod)
{//快速幂求模
long long res=1;
while(n>0)
{
if(n&1)
res=res*x%mod;
x=x*x%mod;
n>>=1;
}
return res;
}
void GetPi(long long x)
{//分解质因子
for(int i=2;i*i<=x;i++)
{
if(x%i==0)
{
pi[j++]=i;
while(x%i==0) x/=i;
}
}
}
bool Judge(long long tmp,long long p)
{//判断
for(int t=0;t<j;t++)
{
if(mod_pow(tmp,(p-1)/pi[t],p)==1)
return false;
}
return true;
}
int main()
{
long long n;
scanf("%ld",&n);
GetPi(n-1);
for(int i=2;i<n;i++)
{
if(Judge(i,n))
{
printf("%d\n",i);
break;
}
}
return 0;
}