突然今天,我想不起什么是原根来了,查了一下定义,哎~这货不是离散数学,循环群生成元吗??不是<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

怎么求?

我是笨逼枚举

  1. 将P-1进行质因数分解
  2. 枚举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;
}

代码怕写错,参考了一下。

数学--数论--原根(循环群生成元)相关推荐

  1. 信奥中的数学 数论篇 相关资料汇总(2022.07.07)

    数论入门书籍推荐 数论入门书籍推荐_dllglvzhenfeng的博客-CSDN博客_数论入门应该看什么书 数学女孩系列书籍 数学女孩系列书籍_dllglvzhenfeng的博客-CSDN博客 信息学 ...

  2. 各种模板(数学数论字符串)

    文章目录 数学&数论 线性求逆元 exgcd excrt FFT NTT 矩阵乘法 线性筛素数 杜教筛 字符串 Trie KMP hash Manacher AC自动机 PAM SAM 广义S ...

  3. 数学/数论专题-学习笔记:狄利克雷卷积

    数学/数论专题-学习笔记:狄利克雷卷积 1. 前言 2. 一些基础函数 3. 积性函数 4. 狄利克雷卷积 5. 总结 6. 参考资料 1. 前言 狄利克雷卷积,是学习与继续探究 μ\muμ 函数和 ...

  4. 信奥中的数学 数论 第2讲 奇数和偶数

    28.891.数的奇偶 (课程6) 难度:1 登录 29.892.同奇偶 (课程6) 难度:1 登录 30.893.奇数个数 (课程6) 难度:1 登录 35.898.2位偶数 (课程7) 难度:1 ...

  5. 数学/数论专题:莫比乌斯函数与欧拉函数

    数学/数论专题:莫比乌斯函数与欧拉函数(进阶) 0. 前言 1. 前置知识 2. 正文 3. 总结 4. 参考资料 0. 前言 本篇文章会从狄利克雷卷积的角度,讨论莫比乌斯函数与欧拉函数的相关性质. ...

  6. 洛谷---数学---数论

    洛谷---数学---数论 http://www.luogu.org 单看 数学 数论 的书,纯理论,看不进,决定还是从做题开始,不明白的地方再看书,以上机训练,促进看书,同样 从 简单--->难 ...

  7. 数学--数论--HDU 2104 丢手绢(离散数学 mod N+ 剩余类 生成元)+(最大公约数)

    The Children's Day has passed for some days .Has you remembered something happened at your childhood ...

  8. 模板 - 数学 - 数论 - 莫比乌斯反演 - 2

    新东西: 求$\sum\limits_{i=1}^{n}|\mu(i)|$ 根据莫比乌斯函数的性质,实际上就是求$\sum\limits_{i=1}^{\lfloor\sqrt{n}\rfloor}\ ...

  9. 数学--数论--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 ...

最新文章

  1. Tensorflow BatchNormalization详解:4_使用tf.nn.batch_normalization函数实现Batch Normalization操作...
  2. 段寄存器和8种地址寻址方式
  3. opencv实现分水岭算法
  4. 拼音开头有什么字_语文基础 孩子刚上一年级学习拼音太难了?家长在家这样教真不比老师差!...
  5. 为什么TCP连接至少3次握手
  6. 静态方法+工厂方法(静态方法用途)
  7. html两个div间有白线,html-在特定浏览器宽度下,白线出现在渐变填充div的末尾
  8. Homework2-project review score of each team
  9. android启动效果
  10. CrossApp环境搭建
  11. 中医教你按摩手指,治疗百病
  12. 企业微信逆向分析之——自己二维码——静态分析
  13. 『Others』markdown简历制作
  14. matlab 深度网络,深度信念网络matlab代码
  15. 【图像压缩】基于余弦变换及霍夫曼编码实现jpeg压缩和解压附matlab代码
  16. 实现ucGUI界面中的拼音汉字输入法(T9)
  17. 【Errors】Errors during downloading metadata for repository ‘AppStream‘:
  18. python入门教程陈孟林_适用于小白的 python 快速入门教程
  19. 查询mysql数据库中表的所有字段名
  20. localhost可以访问,使用ip地址失败

热门文章

  1. mysql dba管理_Mysql DBA 高级运维学习之路-mysql数据库常用管理应用
  2. c linux time微秒_qt linux系统获取当前时间(精确到毫秒、微秒)-Go语言中文社区...
  3. python之美_Python之美[从菜鸟到高手]--生成器之全景分析
  4. 试题 E: 迷宫 第十届蓝桥杯
  5. 正确使用stl map的erase方法
  6. Python 单元测试(unittest)
  7. gradle项目搭建
  8. 以HANA为核心 SAP实时数据平台详解
  9. 2504(多项式求和)
  10. RED5 安装及问题