POJ 1284 : Primitive Roots - 欧拉函数,原根

来源:互联网 发布:义乌淘宝网店摄影培训 编辑:程序博客网 时间:2024/06/16 05:19
题意:
整数x是奇素数p的原根,当且仅当~~~blabla时叫做原根;
给出一个奇素数p(3<=p<65536),编程求出p的原根的个数。
分析:
这里需要应用到一个结论: p是素数,则p有phi(p-1)个原根。
利用该结论知道,只要算出欧拉函数就行了。


**拓展知识:

在数论,特别是整除理论中,原根是一个很重要的概念。

对于两个正整数(a,m) = 1,由欧拉定理可知,存在正整数, 比如说欧拉函数d = φ(m),即小于等于 m 的正整数中与 m 互质的正整数的个数,使得。

由此,在(a,m) = 1时,定义a对模m的指数Ordm(a)为使成立的最小的正整数d。由前知Ordm(a) 一定小于等于 φ(m),若Ordm(a) = φ(m),则称a是模m的原根。


可以证明,如果正整数(a,m) = 1和正整数 d 满足,则 d 整除 φ(m)。因此Ordm(a)整除φ(m)。在例子中,当a = 3时,我们仅需要验证 3 的 1 、2、3 和 6 次方模 7 的余数即可。


记δ = Ordm(a),则模 m 两两不同余。因此当a是模m的原根时,构成模 m 的简化剩余系。


模m有原根的充要条件是m = 1,2,4,pn,2pn,其中p是奇质数,n是任意正整数。


对正整数(a,m) = 1,如果 a 是模 m 的原根,那么 a 是整数模n乘法群(即加法群 Z/mZ 的可逆元,也就是所有与 m 互素的正整数构成的等价类构成的乘法群)Zn×的一个生成元。由于Zn×有 φ(m)个元素,而它的生成元的个数就是它的可逆元个数,即 φ(φ(m))个,因此当模m有原根时,它有φ(φ(m))个原根。


#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
int main(){
int p,i;
while(~scanf("%d",&p)){
p--;
int re=p;
for(i=2;i*i<=p;i++)
if(p%i==0){
re-=re/i;
while(p%i==0)
p/=i;
}
if(p>1)
re-=re/p;
printf("%d\n",re);
}
return 0;
}



0 0
原创粉丝点击