清翔兔原创[数的本原元算法]

#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

点赞