您的位置:首页 > 其它

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

2015-01-10 21:44 246 查看
题意:整数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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: