求原根

来源:互联网 发布:r语言查看源码 编辑:程序博客网 时间:2024/06/06 06:48
#include <iostream>#include <conio.h>#include <cstring>// m^n % kint quickpow(int a,int b,int n){     int t = 1;    if (b == 0)        return 1;    if (b == 1)        return a%n;    t = quickpow(a, b>>1, n);    t = t*t % n;    if (b&0x1)    {        t = t*a % n;    }    return t;}using namespace std;int main(){    int p;    //100以内素数表    int prime[25]= {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97};    int pi[25];    int i=0,j=0;    int m;    cout<<"请输入奇素数p"<<endl;    while(cin>>p)    {        //标准素因子分解        m=p-1;        for(i=0; i<25; i++)        {            if(m%prime[i]==0)            {                while(m%prime[i]==0)                {                    m=m/prime[i];                }                //记录因数有哪些素数                pi[j]=prime[i];                j++;            }        }        int num=j;        //取整数pi   开始试      /*  for(j=0; j<num; j++)        {            cout<<pi[j]<<endl;        }        getch();*/        i=0,j=0;        while(1)        {            if(quickpow(prime[i],(p-1)/pi[j],p)==1)            {                i++;                j=0;               // cout<<"failed!"<<endl;            }            else            {                //cout<<quickpow(prime[i],(p-1)/pi[j],p)<<endl;                j++;            }            if(j==num)            break;        }        cout<<"a="<<prime[i]<<"是p="<<p<<"的一个原根"<<endl;        memset(pi,0,25*sizeof(int));        j=0;    }    return 0;}

原创粉丝点击