原根

 

原根

分类: 数论   76人阅读  评论(0)  收藏  举报


定理:如果p为素数,那么素数p一定存在原根,并且p的原根的个数为phi(p-1).

设m是正整数,a是整数,若a模m的阶等于φ(m),则称a为模m的一个原根.


假设一个数g对于P来说是原根,那么g^i mod P的结果两两不同,且有 1<g<P, 0<i<P,那么g可以称为是P的一个原根,归根到底就是g^(P-1) = 1 (mod P)当且

仅当指数为P-1的时候成立.(这里P是素数).

求原根目前的做法只能是从2开始枚举,然后暴力判断g^(P-1) = 1 (mod P)是否当且当指数为P-1的时候成立。而由于原根一般都不大,所以可以暴力得到.

 

求一个奇素数的所有原根方法。

设g是P的平方非剩余,是P-1的标准分解式,若恒有成立,

则g就是P的原根。


[cpp]  view plain copy
  1. #include <iostream>  
  2. #include <string.h>  
  3. #include <algorithm>  
  4. #include <stdio.h>  
  5.   
  6. using namespace std;  
  7.   
  8. #define LL long long  
  9.   
  10. const int N = 1000010;  
  11.   
  12. bool prime[N];  
  13. LL p[N];  
  14. LL pr[N];  
  15. LL k=0,c;  
  16.   
  17. void isprime()  
  18. {  
  19.     LL i,j;  
  20.     memset(prime,true,sizeof(prime));  
  21.     for(i=2;i<N;i++)  
  22.     {  
  23.         if(prime[i])  
  24.         {  
  25.             p[k++]=i;  
  26.             for(j=i+i;j<N;j+=i)  
  27.             {  
  28.                 prime[j]=false;  
  29.             }  
  30.         }  
  31.     }  
  32. }  
  33.   
  34. void cal(LL n)  
  35. {  
  36.     LL t=n,i,a;c=0;  
  37.     for(i=0;p[i]*p[i]<=n;i++)  
  38.     {  
  39.         if(n%p[i]==0)  
  40.         {  
  41.             pr[c]=p[i];  
  42.             while(n%p[i]==0) n/=p[i];  
  43.             c++;  
  44.         }  
  45.     }  
  46.     if(n>1)  
  47.     {  
  48.         pr[c]=n;  
  49.         c++;  
  50.     }  
  51. }  
  52.   
  53. LL quick_mod(LL a,LL b,LL m)  
  54. {  
  55.     LL ans=1;  
  56.     a%=m;  
  57.     while(b)  
  58.     {  
  59.         if(b&1)  
  60.         {  
  61.             ans=ans*a%m;  
  62.             b--;  
  63.         }  
  64.         b>>=1;  
  65.         a=a*a%m;  
  66.     }  
  67.     return ans;  
  68. }  
  69.   
  70. int main()  
  71. {  
  72.     LL P,i,t,g,root;  
  73.     isprime();  
  74.     while(cin>>P)  
  75.     {  
  76.         cal(P-1);  
  77.         for(g=2;g<P;g++)  
  78.         {  
  79.             bool flag=true;  
  80.             for(i=0;i<c;i++)  
  81.             {  
  82.                 t=(P-1)/pr[i];  
  83.                 if(quick_mod(g,t,P)==1)  
  84.                 {  
  85.                    flag=false;  
  86.                    break;  
  87.                 }  
  88.             }  
  89.             if(flag)  
  90.             {  
  91.                 root=g;  
  92.                 cout<<root<<endl;  
  93.             }  
  94.         }  
  95.     }  
  96.     return 0;  
  97. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值