c++实现求解欧拉函数和本原根
计算本原根
这里我不详细解释欧拉函数和本原根。
首先我们先了解求一个数的本原根的过程,以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++实现求解欧拉函数和本原根相关推荐
- AcWing 874. 筛法求欧拉函数
线性筛法求解欧拉函数 有关线性筛法的介绍,可以参考这道题:868. 筛质数 - AcWing题库 这道题y总采用了线性筛选法来筛选掉指定范围内的合数,筛选出质数.思维利用得极为巧妙. 结合y总讲解视频 ...
- poj2480(利用欧拉函数的积性求解)
题目链接: http://poj.org/problem?id=2480 题意:∑gcd(i, N) 1<=i <=N,就这个公式,给你一个n,让你求sum=gcd(1,n)+gcd(2 ...
- 突然想写一篇有关欧拉函数的博客
关于欧拉函数: 定义: φ(n)表示1~n中与n互质的数的个数: 求法: 已知n的标准分解式为: (哦对了,这里所有的因子都是质因子) 那么 然后求欧拉函数的两种方法: 1.按照定义暴力求解: in ...
- hdu 4983(欧拉函数)
题目大意:给出一组n和k,求解满足公式:gcd(n-a,n)*gcd(n-b,n)=n^k的(a,b)的对数,结果对(1e9+7)取模. 先证明:对于1<=x<=n,有gcd(n-x , ...
- 欧拉函数和最大公约数的组合应用
这种问题一般都是给出限制条件:给你一个数N(N一般很大),使得在1~N之间能够找到X使得X满足gcd( X , N ) >= M,然后求解相关的问题. 分析:这是一种统计类 ...
- 算个欧拉函数给大家助助兴(米勒拉宾(判断素数)+Pollard_rho(求一个大数的因子 ))
这篇博客讲的很好: https://www.cnblogs.com/ZERO-/p/9302169.html 题目描述 木南有一天学习了欧拉函数,知道了对正整数n,欧拉函数是小于n的正整数中与n互质的 ...
- 数论一之定理证明——裴蜀/威尔逊/费马/扩展欧几里得/[扩展]欧拉/[扩展]中国剩余定理,欧拉函数,逆元,剩余系,筛法
打死没想到会在H老师处学懂数论 同余,整除 模运算 埃式筛法 欧拉筛法 最大公约数和最小公倍数 辗转相除法 更相减损术 裴蜀定理 威尔逊定理 费马定理 同余等价类.剩余系.缩系 欧拉函数 欧拉定理 扩 ...
- 【计蒜客 - 蓝桥训练】欧拉函数(数学,数论,模板)
题干: 在数论中,对正整数 nn,欧拉函数 \varphi (n)φ(n) 是小于等于 nn 的正整数中与 nn 互质的数的数目. 例如 \varphi (12)=4φ(12)=4,因为 1,5,7, ...
- HDU 1286 找新朋友 (欧拉函数)
找新朋友 http://acm.hdu.edu.cn/game/entry/problem/show.php?chapterid=2§ionid=1&problemid=8 T ...
最新文章
- 独家 | CIKM AnalytiCup 2017冠军团队获胜经验分享(附PPT视频)
- 代码审查就是在排大便——你懂的!
- ubuntu系统安装和配置
- Python MySQLdb模块连接操作mysql数据库实例_python
- go语言游戏编程-Ebiten渲染一张图片
- java状态机设计模式_设计模式总结-State模式
- ajax和for循环谁难,关于“for”循环中jquery $ .ajax的问题
- RNN循环神经网络(吴恩达《序列模型》笔记一)
- python3 缺少PIP解决办法
- c# asp.net 2.0 tableadapter 动态 dynamic sql语句
- 产品开发的组织架构和开发管理
- 片段中未调用onActivityResult
- java计算机毕业设计高考填报信息系统源码+数据库+系统+lw文档+部署
- 25个常用Matplotlib图的Python代码
- Netd 服务的 netd 套接字创建
- sasl java_kafka sasl java api
- 语音控制Office
- 新拉下来的vue项目怎么跑起来?
- “快乐宝宝”风波始末 (三)
- 小红书去水印代码_小红书无水印图片,无水印视频解析下载,小红书视频图片去水印代码实现...