#include <iostream>
#include <vector>
#include <cmath>
#include “BigNum.h”
using namespace std;
int euclid(int d,int f) //欧几里得算法(最大公约数)
{
int m = d;
int y = f;
int r;
while(1){
if(y==0) return m;
r = m % y;
m = y;
y = r;
}
}
void benyy(int m) //清翔兔编写,本原元算法
{
vector<int> vec1,vec2;
//求出小于m且与m互素的所有正整数,存入vec1中
for(int i=1;i<=m;i++)
if( euclid(m,i)==1 )
vec1.push_back(i);
int num = int(vec1.size());
//判断是否是本原元
for(int i=1;i<num;i++)
{
int j=2; //一阶不用算,所以首次即为二阶
int flag=1;
BigNum bignum(vec1[i]);
BigNum temp = bignum;
//求出在模m下的各数的阶(最小正整数)
while(flag)
{
bignum = bignum * temp;
BigNum mod = bignum%m;
if(mod.isValueOne()) {
flag=0;
break;
}
if(j>num) break;
j++;
}
// 数的阶等于m时,存入vec2中
if(j==num)
vec2.push_back(vec1[i]);
}
for(size_t i=0;i<vec2.size();i++)
{
cout << vec2[i]<<endl;
}
}
void main()
{
cout <<“清翔兔@2006/n本原元计算,请输入一个数:”;
int a;
cin >> a;
cout << “它的本原元如下:” <<endl;
benyy(a); //示例,求出19的所有本原元
}
// down exe file: http://i1984.com/x/page53_ex4-5.exe