计算本原根

这里我不详细解释欧拉函数和本原根。
首先我们先了解求一个数的本原根的过程,以25为例:

25的本原根

1.在计算25的所有本原根时,首先我们要得到25的欧拉函数值可以知道25=5^2,其欧拉函数值=25-5=20
且这20个数为1,2,3,4,6,7,8,9,11,12,13,14,16,17,18,19,21,22,23,24。
2.接着遍历这些数依次求解这些数的1-20次方对25取余,并且这20个数不重复,且均在这些数里,编程里体现为对求得的20个数排序再比较。
3.由于高次幂会溢出,参考了大数计算优化的快速幂取余算法解决了这个问题。

求25的本原根的源代码

#include<iostream>
using namespace std;void bubbleSort(int arr[], int n);//冒泡排序
int power(long int x, long int y, long int n);//快速幂取余实现(x^y%n)int main()
{int i,j,k,flag[20];int n=25,sum=20;int s[20]={1,2,3,4,6,7,8,9,11,12,13,14,16,17,18,19,21,22,23,24}; cout<<"25的所有本原根为:";for(i=0;i<sum;i++){k=0;for(j=1;j<sum+1;j++){//这里要利用快速幂取余,否则数值太大会溢出flag[j-1]=power(s[i],j,n);}bubbleSort(flag,sum);for(j=0;j<sum;j++){if(flag[j]!=s[j])k=1;}if(k==0)cout<<s[i]<<" ";}cout<<endl<<endl;return 0;
}//冒泡排序
void bubbleSort(int arr[], int n)
{for(int i = 0;i < n;i++){  for(int j = 0;j < n-i-1;j++){  if(arr[j] > arr[j+1]){  int t = arr[j];  arr[j] = arr[j+1];  arr[j+1] = t;  }  }  }
}
//快速幂取余实现(x^y%n)
int power(long int x, long int y, long int n)
{long int t = 1;while (y > 0){if (y % 2 == 1){y -= 1;t = t*x%n;} else {y /= 2;x = x*x%n;}}return t%n;
}

结果

扩展为求输入数字的本原根

#include<iostream>
using namespace std;//判断两个数是否互素
int IsPrime(int a, int b)
{int temp;while(b!=0){temp = b;b = a % b;a = temp;}if(a==1)return 1;elsereturn 0;
}//得到欧拉函数的值和取值集合
void Euler(int n,int *s,int &sum)
{int i,flag;for(i=1;i<n;i++){flag=IsPrime(i,n);if(flag==1){s[sum]=i;sum++;}}
}//冒泡排序
void bubbleSort(int arr[], int n)
{for(int i = 0;i < n;i++){  for(int j = 0;j < n-i-1;j++){  if(arr[j] > arr[j+1]){  int t = arr[j];  arr[j] = arr[j+1];  arr[j+1] = t;  }  }  }
}//快速幂取余实现(x^y%n)
int power(long int x, long int y, long int n)
{long int t = 1;while (y > 0){if (y % 2 == 1){y -= 1;t = t*x%n;} else {y /= 2;x = x*x%n;}}return t%n;
}//根据互素集合利用遍历的方法求本原根
void root(int n,int sum,int s[])
{int i,j;int flag[100],k;for(i=0;i<sum;i++){k=0;for(j=1;j<sum+1;j++){//这里要利用快速幂取余,否则数值太大会溢出flag[j-1]=power(s[i],j,n);}bubbleSort(flag,sum);for(j=0;j<sum;j++){if(flag[j]!=s[j])k=1;}if(k==0)cout<<s[i]<<" ";}
}int main()
{int n,sum=0;int s[100];  //用来存储比n小且与n互素的正整数cout<<"请输入你想要求本原根的数:";cin>>n;Euler(n,s,sum);cout<<endl;cout<<n<<"的所有本原根为:";root(n,sum,s);cout<<endl<<endl;return 0;
}

结果:

c++实现求解欧拉函数和本原根相关推荐

  1. AcWing 874. 筛法求欧拉函数

    线性筛法求解欧拉函数 有关线性筛法的介绍,可以参考这道题:868. 筛质数 - AcWing题库 这道题y总采用了线性筛选法来筛选掉指定范围内的合数,筛选出质数.思维利用得极为巧妙. 结合y总讲解视频 ...

  2. poj2480(利用欧拉函数的积性求解)

    题目链接:  http://poj.org/problem?id=2480 题意:∑gcd(i, N) 1<=i <=N,就这个公式,给你一个n,让你求sum=gcd(1,n)+gcd(2 ...

  3. 突然想写一篇有关欧拉函数的博客

    关于欧拉函数: 定义: φ(n)表示1~n中与n互质的数的个数: 求法: 已知n的标准分解式为: (哦对了,这里所有的因子都是质因子) ​那么 然后求欧拉函数的两种方法: 1.按照定义暴力求解: in ...

  4. hdu 4983(欧拉函数)

    题目大意:给出一组n和k,求解满足公式:gcd(n-a,n)*gcd(n-b,n)=n^k的(a,b)的对数,结果对(1e9+7)取模. 先证明:对于1<=x<=n,有gcd(n-x , ...

  5. 欧拉函数和最大公约数的组合应用

    这种问题一般都是给出限制条件:给你一个数N(N一般很大),使得在1~N之间能够找到X使得X满足gcd( X ,  N  ) >= M,然后求解相关的问题.          分析:这是一种统计类 ...

  6. 算个欧拉函数给大家助助兴(米勒拉宾(判断素数)+Pollard_rho(求一个大数的因子 ))

    这篇博客讲的很好: https://www.cnblogs.com/ZERO-/p/9302169.html 题目描述 木南有一天学习了欧拉函数,知道了对正整数n,欧拉函数是小于n的正整数中与n互质的 ...

  7. 数论一之定理证明——裴蜀/威尔逊/费马/扩展欧几里得/[扩展]欧拉/[扩展]中国剩余定理,欧拉函数,逆元,剩余系,筛法

    打死没想到会在H老师处学懂数论 同余,整除 模运算 埃式筛法 欧拉筛法 最大公约数和最小公倍数 辗转相除法 更相减损术 裴蜀定理 威尔逊定理 费马定理 同余等价类.剩余系.缩系 欧拉函数 欧拉定理 扩 ...

  8. 【计蒜客 - 蓝桥训练】欧拉函数(数学,数论,模板)

    题干: 在数论中,对正整数 nn,欧拉函数 \varphi (n)φ(n) 是小于等于 nn 的正整数中与 nn 互质的数的数目. 例如 \varphi (12)=4φ(12)=4,因为 1,5,7, ...

  9. HDU 1286 找新朋友 (欧拉函数)

    找新朋友 http://acm.hdu.edu.cn/game/entry/problem/show.php?chapterid=2&sectionid=1&problemid=8 T ...

最新文章

  1. 独家 | CIKM AnalytiCup 2017冠军团队获胜经验分享(附PPT视频)
  2. 代码审查就是在排大便——你懂的!
  3. ubuntu系统安装和配置
  4. Python MySQLdb模块连接操作mysql数据库实例_python
  5. go语言游戏编程-Ebiten渲染一张图片
  6. java状态机设计模式_设计模式总结-State模式
  7. ajax和for循环谁难,关于“for”循环中jquery $ .ajax的问题
  8. RNN循环神经网络(吴恩达《序列模型》笔记一)
  9. python3 缺少PIP解决办法
  10. c# asp.net 2.0 tableadapter 动态 dynamic sql语句
  11. 产品开发的组织架构和开发管理
  12. 片段中未调用onActivityResult
  13. java计算机毕业设计高考填报信息系统源码+数据库+系统+lw文档+部署
  14. 25个常用Matplotlib图的Python代码
  15. Netd 服务的 netd 套接字创建
  16. sasl java_kafka sasl java api
  17. 语音控制Office
  18. 新拉下来的vue项目怎么跑起来?
  19. “快乐宝宝”风波始末 (三)
  20. 小红书去水印代码_小红书无水印图片,无水印视频解析下载,小红书视频图片去水印代码实现...

热门文章

  1. java jpanel 半透明_java – 透明JPanel
  2. centos下cmake安装caffe
  3. 浅学区块链(2)之solidity
  4. vue使用jqprint调打印机
  5. WordPress最新网站漏洞利用及修复解决方案
  6. 问题 G: 深入浅出学算法007-求佩尔方程的解
  7. 网站SEO优化常见问题汇总2
  8. AI辅助瞄准系统开发与实战(三)-竣工
  9. 使用nginx设置代理服务器
  10. glob php,php使用glob函数遍历文件和目录详解