原根定义:假设一个数g对于P来说是原根,那么g^i mod P的结果两两不同,
且有 1<g<P, 1<i<P,那么g可以称为是P的一个原根
简单来说,g^i mod p ≠ g^j mod p (p为素数)
其中i≠j且i, j介於1至(p-1)之间,则g为p的原根。
定理:
如果
为素数,那么素数
一定存在原根,它恰有φ(φ(p))个不同的原根,
因为 p为素数,当然φ(p)=p-1,因此就有φ(p-1)个原根。
题意:给定一个奇素数,求其有多少个原根
可以直接根据上述定理,若给定奇素数n,求
φ(n-1)即可。
代码:
#include<stdio.h>
#include<math.h>
int ol(int n)
{
int s=n,i,m;
m=sqrt(n);
for(i=2;i<=m;i++){
if(n%i==0)
s=s/i*(i-1);
while(n%i==0)
n/=i;
}
if(n>1)
s=s/n*(n-1);
return s;
}
int main()
{
int n,s;
while(scanf("%d",&n)!=EOF){
s=ol(n-1);
printf("%d\n",s);
}
return 0;
}