题意:给一个奇素数,求它原根的数目。
定理:如果p有原根,则他有phi(phi(p))个原根,p为素数是,phi(p) = p-1,原根数量就为phi(p-1);
下面给出原根的求法:
对于数m,先求ϕ(m) 的素幂分解式,即
φ(m) = p1^e1*p2^e2*……*pk^ek;
然后枚举g,若g满足g^(φ(m)/pi )!= 1 (mod m) ,i = 1,2,3……,k;
则g为m的一个原根
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int euler_phi(int n)
{
int m = sqrt(n+0.5);
int ans = n;
for(int i = 2; i <= m; i++)
if(n%i==0)
{
ans = ans/i*(i-1);
while(n%i==0)
n /= i;
}
if(n>1)
ans = ans/n*(n-1);
return ans;
}
int main()
{
int p;
while(cin>>p)
{
int ans = euler_phi(p-1);
cout<<ans<<endl;
}
return 0;
}