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

#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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值