数学--数论--原根(循环群生成元)
突然今天,我想不起什么是原根来了,查了一下定义,哎~这货不是离散数学,循环群生成元吗??不是<a+>而是<a∗>是乘法而不是加法<a_+>而是<a_*>是乘法而不是加法<a+>而是<a∗>是乘法而不是加法
嘛玩意是原根:?
对于素数 p,如果存在一个正整数 1<a<p,使得 a1,a2,…,ap−1 模 p 的值取遍 1,2,…,p−1 的所有整数,称 a 是 p 的一个原根(primitive root),其实就是循环群的生成元。
如果aj≡ai(modp),则i≡j(modp−1)。这里有两个例子:如果 aj≡ai(mod p),则 i≡j(mod p−1)。这里有两个例子:如果aj≡ai(modp),则i≡j(modp−1)。这里有两个例子:
5是7的原根,因为5–>3–>1–>6–>4–>2–>0,然后开始循环
2不是7的原根,因为2–>4–>1–>2–>4…,过早的循环了
说人话:好的
如果g是P的原根,就是(gP−1)≡1(modP)(g^P-1) ≡1 (mod P)(gP−1)≡1(modP)当且仅当指数为P-1的时候成立.(这里P是素数).
即 设m是正整数,a是整数,若a模m的阶等于φ(m),则称a为模m的一个原根。
φ(m):这货是欧拉函数
定理:
定理一:
设p是奇素数,则模p的原根存在; [3]
定理二:
设g是模p的原根,则g或者g+p是模的原根;
定理三:
设p是奇素数,则对任意,模的原根存在;
定理四:
设1,则g是模的一个原根,则g与g+中的奇数是模2的一个原根。
性质:
性质一:
对于任意正整数a,m,如果(a,m) = 1,存在最小的正整数 d 满足a^d≡1(mod m),则有 d 整除 φ(m),因此Ordm(a)整除φ(m)。这里的d被称为a模m的阶,记为Ordm(a)。
例如:求3模7的阶时,我们仅需要验证 3 的 1 、2、3 和 6 次方模 7 的余数即可。
19的原根有2,2-4-8-16-13-7-14-9-。。。。
19的原根就一定有4, 4-16-7-9-。。。。。
有8,16所以也就是说如果一个数的原根没有k也就不存在k的幂。
性质二:
记δ = Ordm(a),则a1,……a(δ-1)模 m 两两不同余。因此当a是模m的原根时,a0a1,……a(δ-1)构成模 m 的简化剩余系。
性质三:
模m有原根的充要条件是
m=1,2,4,p,2∗p,pn,2∗pn其中p是奇质数,n是任意正整数。m= 1,2,4,p,2*p,p^n,2*p^n其中p是奇质数,n是任意正整数。m=1,2,4,p,2∗p,pn,2∗pn其中p是奇质数,n是任意正整数。
性质四:
对正整数(a,m) = 1,如果 a 是模 m 的原根,那么 a 是整数模n乘法群(即加法群 Z/mZ的可逆元,也就是所有与 m 互素的正整数构成的等价类构成的乘法群)Zn的一个生成元。由于Zn有 φ(m)个元素,而它的生成元的个数就是它的可逆元个数,即 φ(φ(m))个,因此当模m有原根时,它有φ(φ(m))个原根。
模m有原根的充要条件:
m=2 m=4 m=P^a m=2*P^a
怎么求?
我是笨逼枚举
- 将P-1进行质因数分解
- 枚举i,并判断对于每个i是否都有(可以应用快速幂)
第一个符合条件的i就是P的最小原根
对于合数,只要将2.中的p−1替换成φ(p)即可.对于合数,只要将 2. 中的p-1替换成φ(p)即可.对于合数,只要将2.中的p−1替换成φ(p)即可.
#include<cstdio>
#include<cmath>
inline int phi(int n)
{int zc=n,all=sqrt(n);for(int i=2;i<=all;i++){if(n%i!=0)continue;zc=zc/i*(i-1);while(n%i==0)n/=i;}if(n>1)zc=zc/n*(n-1);return zc;
}
inline int pow(int x,const int y,const int mod)
{int res=1;for(int i=1;i<=y;i<<=1,x=x*x%mod)if(i&y)res=res*x%mod;return res;
}
inline int G(const int m)
{const int PHI=phi(m);for(int g=2;;g++){bool fla=1;if(pow(g,PHI,m)!=1)continue;for(int i=1;i<PHI;i++)if(pow(g,i,m)==1){fla=0;break;}if(fla)return g;}
}
int m,g;
int main()
{scanf("%d",&m);g=G(m);printf("%d",g);return 0;
}
在上面的代码中,容易发现,枚举的i并不是每个每个都有用的, 由性质1可得 枚举i只需要枚举φ(m)的因数就好了
#include<cstdio>
#include<cmath>
inline int phi(int n)
{int zc=n,all=sqrt(n);for(int i=2;i<=all;i++){if(n%i!=0)continue;zc=zc/i*(i-1);while(n%i==0)n/=i;}if(n>1)zc=zc/n*(n-1);return zc;
}
inline int pow(int x,const int y,const int mod)
{int res=1;for(int i=1;i<=y;i<<=1,x=(long long)x*x%mod)if(i&y)res=(long long)res*x%mod;return res;
}
int q[200001];
inline int G(const int m)
{const int PHI=phi(m);q[0]=0;for(int i=2;i<PHI;i++)if(PHI%i==0)q[++q[0]]=i;for(int g=2;;g++){bool fla=1;if(pow(g,PHI,m)!=1)continue;for(int i=1;i<=q[0];i++)if(pow(g,q[i],m)==1){fla=0;break;}if(fla)return g;}
}
int m,g;
int main()
{scanf("%d",&m);g=G(m);printf("%d",g);return 0;
}
最快的代码:
#include<cstdio>
#include<cmath>
inline int phi(int n)
{int zc=n,all=sqrt(n);for(int i=2;i<=all;i++){if(n%i!=0)continue;zc=zc/i*(i-1);while(n%i==0)n/=i;}if(n>1)zc=zc/n*(n-1);return zc;
}
inline int pow(int x,const int y,const int mod)
{int res=1;for(int i=1;i<=y;i<<=1,x=(long long)x*x%mod)if(i&y)res=(long long)res*x%mod;return res;
}
int q[100001];
inline int G(const int m)
{const int PHI=phi(m);q[0]=0;const int limit=sqrt(PHI);int zc=PHI;for(int i=2;i<=limit;i++)if(zc%i==0){q[++q[0]]=PHI/i;while(zc%i==0)zc/=i;}if(zc>1)zc=q[++q[0]]=PHI/zc;for(int g=2;;g++){bool fla=1;if(pow(g,PHI,m)!=1)continue;for(int i=1;i<=q[0];i++)if(pow(g,q[i],m)==1){fla=0;break;}if(fla)return g;}
}
int m,g;
int main()
{scanf("%d",&m);g=G(m);printf("%d",g);return 0;
}
代码怕写错,参考了一下。
数学--数论--原根(循环群生成元)相关推荐
- 信奥中的数学 数论篇 相关资料汇总(2022.07.07)
数论入门书籍推荐 数论入门书籍推荐_dllglvzhenfeng的博客-CSDN博客_数论入门应该看什么书 数学女孩系列书籍 数学女孩系列书籍_dllglvzhenfeng的博客-CSDN博客 信息学 ...
- 各种模板(数学数论字符串)
文章目录 数学&数论 线性求逆元 exgcd excrt FFT NTT 矩阵乘法 线性筛素数 杜教筛 字符串 Trie KMP hash Manacher AC自动机 PAM SAM 广义S ...
- 数学/数论专题-学习笔记:狄利克雷卷积
数学/数论专题-学习笔记:狄利克雷卷积 1. 前言 2. 一些基础函数 3. 积性函数 4. 狄利克雷卷积 5. 总结 6. 参考资料 1. 前言 狄利克雷卷积,是学习与继续探究 μ\muμ 函数和 ...
- 信奥中的数学 数论 第2讲 奇数和偶数
28.891.数的奇偶 (课程6) 难度:1 登录 29.892.同奇偶 (课程6) 难度:1 登录 30.893.奇数个数 (课程6) 难度:1 登录 35.898.2位偶数 (课程7) 难度:1 ...
- 数学/数论专题:莫比乌斯函数与欧拉函数
数学/数论专题:莫比乌斯函数与欧拉函数(进阶) 0. 前言 1. 前置知识 2. 正文 3. 总结 4. 参考资料 0. 前言 本篇文章会从狄利克雷卷积的角度,讨论莫比乌斯函数与欧拉函数的相关性质. ...
- 洛谷---数学---数论
洛谷---数学---数论 http://www.luogu.org 单看 数学 数论 的书,纯理论,看不进,决定还是从做题开始,不明白的地方再看书,以上机训练,促进看书,同样 从 简单--->难 ...
- 数学--数论--HDU 2104 丢手绢(离散数学 mod N+ 剩余类 生成元)+(最大公约数)
The Children's Day has passed for some days .Has you remembered something happened at your childhood ...
- 模板 - 数学 - 数论 - 莫比乌斯反演 - 2
新东西: 求$\sum\limits_{i=1}^{n}|\mu(i)|$ 根据莫比乌斯函数的性质,实际上就是求$\sum\limits_{i=1}^{\lfloor\sqrt{n}\rfloor}\ ...
- 数学--数论--HDU - 6395 Let us define a sequence as below 分段矩阵快速幂
Your job is simple, for each task, you should output Fn module 109+7. Input The first line has only ...
最新文章
- Tensorflow BatchNormalization详解:4_使用tf.nn.batch_normalization函数实现Batch Normalization操作...
- 段寄存器和8种地址寻址方式
- opencv实现分水岭算法
- 拼音开头有什么字_语文基础 孩子刚上一年级学习拼音太难了?家长在家这样教真不比老师差!...
- 为什么TCP连接至少3次握手
- 静态方法+工厂方法(静态方法用途)
- html两个div间有白线,html-在特定浏览器宽度下,白线出现在渐变填充div的末尾
- Homework2-project review score of each team
- android启动效果
- CrossApp环境搭建
- 中医教你按摩手指,治疗百病
- 企业微信逆向分析之——自己二维码——静态分析
- 『Others』markdown简历制作
- matlab 深度网络,深度信念网络matlab代码
- 【图像压缩】基于余弦变换及霍夫曼编码实现jpeg压缩和解压附matlab代码
- 实现ucGUI界面中的拼音汉字输入法(T9)
- 【Errors】Errors during downloading metadata for repository ‘AppStream‘:
- python入门教程陈孟林_适用于小白的 python 快速入门教程
- 查询mysql数据库中表的所有字段名
- localhost可以访问,使用ip地址失败
热门文章
- mysql dba管理_Mysql DBA 高级运维学习之路-mysql数据库常用管理应用
- c linux time微秒_qt linux系统获取当前时间(精确到毫秒、微秒)-Go语言中文社区...
- python之美_Python之美[从菜鸟到高手]--生成器之全景分析
- 试题 E: 迷宫 第十届蓝桥杯
- 正确使用stl map的erase方法
- Python 单元测试(unittest)
- gradle项目搭建
- 以HANA为核心 SAP实时数据平台详解
- 2504(多项式求和)
- RED5 安装及问题