标签:des style blog http io os ar for sp
贾怡@pku
题目大意:p是奇素数,如果{x^i % p | 1 <= i <= p - 1} = {1,2,...,p-1},则称x是p的原根。
给出一个p,问它的原根有多少个。
思路:
{x^i% p | 1 <= i <= p - 1} = {1,2,...,p-1} 等价于
{x^i%(p-1) | 1 <= i <= p - 1} = {0,1,2,...,p-2},
即{x^1,x^2,x^3,…,x^(p-1)}为p的完全剩余系等价于
若x与p-1互质(gcd(x, p-1) = 1),则{x^0,x^1,x^2,…,x^(p-2)}为(p-1)的完全剩余系
下边证明:
如果x^i != x^j (mod p-1),那么 x*x^i != x*x^j (mod p-1),则gcd(x, p-1) != 0,与上边相悖。
则x^i = x^j(mod p-1)。
根据费马定理和欧拉定理知:i = φ(p-1)。
关于欧拉函数、费马定理和欧拉定理参考另一篇欧拉函数的题解:
http://blog.csdn.net/lianai911/article/details/40114675
参考博文:http://www.cnblogs.com/lnever/p/3969117.html
顺便膜拜推理出来的大神
#include <stdio.h> #include <math.h> int Euler(int n) { int i, ret = n; for(i = 2; i <= sqrt(1.0*n); i++) { if(n % i == 0) { n /= i; ret = ret - ret/i; } while(n % i == 0) n /= i; } if(n > 1) { ret = ret - ret/n; } return ret; } int main() { int p; while(~scanf("%d",&p)) { printf("%d\n",Euler(p-1)); //如果p为素数,Euler(Euler(p)) == Euler(p-1) } return 0; }
标签:des style blog http io os ar for sp
原文地址:http://blog.csdn.net/lianai911/article/details/40114903