阶与原根学习笔记
来源:互联网 发布:鲁迅文学院2017网络班 编辑:程序博客网 时间:2024/06/03 01:53
1.阶的定义:
(a,m)=1,则最小的正整数r使得a^r=1(mod m) 为a模m的阶。(这玩意a好像可是负的。。)
2.阶的性质:
r | φ(m) 。(可用反证法,假设不整除,则……)
3.求阶:(虽然我还不知道这玩意有啥用)
给定互质的a,m,求a模m的阶:
4.原根定义:
若a模m的原根为φ(m),则a为m的一个原根。
5.原根性质:
特别注意:只有m=2,4,p^a,2·p^a时m才有原根(p为奇素数,a≥1)
证明:(太弱了,努力学习中。。)
6.求原根:
首先需要判断一下m是否存在原根(程序中略去,且m仍为奇素数);
然后从2开始枚举每一个与m互质的数,看他模m的阶是否等于φ(m)。
充要条件是:对于正在枚举的i,和φ(m)的每一个不同的质因子p:都有 i^( φ(m)/p )mod m≠1,则i就是m的一个原根! (m的质因数需要预处理出来)
一般原根都会很小,时间复杂度可以理解为O(√m+k·log(m)^2),√m为预处理,k为检验的次数
经测试:10000000以内的数只有:
6252122 101
6497402 115
6933362 113
7871018 101
这四个数的原根大于了100。。
程序中vis[ ]是线性筛素数的bool数组,vis[i]=1表示i非素数。
int pow(int x,int y,int p){int ret=1,now=x;for(;y;y>>=1,now=1ll*now*now%p)if(y&1)ret=1ll*ret*now%p;return ret;}int Find_Root(int m,int phi_m)//if m has no root,then return 0{if(vis[m]&&(m%2==1||vis[m/2]))return 0;int cnt=0,lim=int(sqrt(phi_m)),now=phi_m;for(int i=2;i<=lim;i++)if(now%i==0){tempri[++cnt]=i;while(!(now%i))now/=i;}if(now>1)tempri[++cnt]=now;for(int i=1;;i++){bool flag=1;for(int j=1;j<=cnt;j++)if(pow(i,phi_m/tempri[j],m)<=1){flag=0;break;}if(flag&&pow(i,phi_m,m)==1)return i;}return 0; }
0 0
- 阶与原根学习笔记
- 扩展方法学习笔记[原]
- 软件测试与质量保证学习笔记(英)_UNIT1_Concept of Software Quality Assurance(原)
- 集合类的学习笔记(原)
- shell学习笔记(原书摘录)
- No37-【原】ThinkPHP3.2.3学习笔记
- ajax学习笔记:原生态js创建
- ajax学习笔记:ajax原态-XmlHttpRequest
- 学习笔记 03 --- JUC原子类
- 操作系统学习笔记:PV同步原语
- (离散对数与原根)
- 原根与离散对数
- 《数据挖掘概念与技术》学习笔记第4章(4/10)数据挖掘原语、语言和系统结构
- 《鸟哥的Linux的私房菜》 学习笔记——原码与Tarball套件管理
- JDK核心技术卷II高级特性(原书第八版)学习笔记1——流与文件1
- 阶 和 原根
- ORACLE 学习笔记1 存储过程、触发器_080408_原
- contiki学习笔记-UDP-Client原厂代码分析
- 浅克隆与深克隆
- 诸葛:数据科学家所需具备的技能
- oracle 10g数据类型整理
- 遇到的多条件贝叶斯概率问题
- 使用方法拦截器MethodInterceptor和AOP统一处理log
- 阶与原根学习笔记
- LeetCode 226 Invert Binary Tree
- css sprite的实现
- 正确增加Cloneable接口
- uva10820(简单数学题)
- partition-list
- apache2.4 以上的版本,cgi-bin中的文件不能运行。
- ios tableView性能优化策略
- 我也开博客了……