原根(详解+代码实现+例题+快速求解一个数的原根)

1.原根定义

假设一个数g对于P来说是原根,那么g^i mod P的结果两两不同,且有 1<g<P, 1<i<P,那么g可以称为是P的一个原根
简单来说,g^i mod p ≠ g^j mod p (p为素数)
其中i≠j且i, j介於1至(p-1)之间
则g为p的原根。
简单的来说,如果g是P的原根,那么g的(1...P-1)次幂mod P的结果一定互不相同。
那么简化一下:
首先看一下欧拉定理:

欧拉定理(也称费马-欧拉定理欧拉{\varphi}函数定理)是一个关于同余的性质。欧拉定理表明,若n,a为正整数,且n,a互素(即\gcd(a,n)=1),则

a^{\varphi(n)} \equiv 1 \pmod n
因此,在gcd(a,m)=1时,定义a对模m的指数Ord_m(a)为使a^d \equiv 1 \pmod{m}成立的最小的正整数d。由前知Ord_m(a) 一定小于等于  \phi (m),若Ord_m (a) = \phi (m),则称a是模m的原根
归根到底,如果g是P的原根,就是g^(P-1) = 1 (mod P)当且仅当指数为P-1的时候成立.(这里P是素数).
例如:
m= 7,则φ(7)等于6。φ(7)表示7的欧拉函数。
a= 2,由于2^3=8≡1(mod 7),而3<6,所以 2 不是模 7 的一个原根。设a= 3,由于3^1≡3(mod 7),3^2≡2(mod 7),3^3≡6(mod 7),3^4≡4(mod 7),3^5≡5(mod 7),3^6≡1(mod 7),所以 3 是模 7 的一个原根。

2.如何求解:

一、枚举

从2开始枚举,然后暴力判断g^(P-1) = 1 (mod P)是否当且当指数为P-1的时候成立

而由于原根一般都不大,所以可以暴力得到.

二、讲究方法

例如求任何一个质数x的任何一个原根,一般就是枚举2到x-1,并检验。有一个方便的方法就是,求出x-1所有不同的质因子p1,p2...pm,对于任何2<=a<=x-1,判定a是否为x的原根,只需要检验a^((x-1)/p1),a^((x-1)/p2),...a^((x-1)/pm)这m个数中,是否存在一个数mod x为1,若存在,a不是x的原根,否则就是x的原根。

原来的复杂度是O(P-1),现在变成O(m)*log(P-1)m为x-1质因子的个数。很明显质因子的个数远远小于x-1。

证明可用欧拉定理和裴蜀定理:

裴蜀定理

说明了对任何整数a、b和它们的最大公约数d,关于未知数x和y的线性丢番图方程(称为裴蜀等式):

ax + by = m 
有解当且仅当m是d的倍数。裴蜀等式有解时必然有无穷多个整数解,每组解x、y都称为裴蜀数,可用辗转相除法求得。

例如,12和42的最大公因子是6,则方程12x + 42y = 6有解。事实上有(-3)×12 + 1×42 = 6及4×12 + (-1)×42 = 6。

特别来说,方程 ax + by = 1 有解当且仅当整数a和b互素。

裴蜀等式也可以用来给最大公约数定义:d其实就是最小的可以写成ax + by形式的正整数。这个定义的本质是整环中“理想”的概念。因此对于多项式整环也有相应的裴蜀定理。

证明

[html] view plaincopy
  1. 若存在,那么显然的事情  
  2.   
  3. 否则,假设存在一个t<phi(x)=x-1使得a^t = 1 (mod x)  
  4.   
  5. 那么由裴蜀定理,一定存在一组k,r使得kt=(x-1)r+gcd(t,x-1)  
  6.   
  7. 而由欧拉定理有,a^(x-1) = 1 (mod x)  
  8.   
  9. 于是1 = a^(kt) = a^(xr-r+gcd(t,x-1)) = a^gcd(t,x-1) (mod x)  
  10.   
  11. 而t<x-1故gcd(t,x-1)<x-1  
  12.   
  13. 又gcd(t,x-1)|x-1 于是gcd(t,x-1)必整除(x-1)/p1,(x-1)/p2...(x-1)/pm其中至少一个,设其一为(x-1)/pi  
  14.   
  15. 那么a^((x-1)/pi) = (a^gcd(t,x-1))^s = 1^s = 1 (mod x)  
  16.   
  17. 这与假设矛盾  

代码:

来至http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1135的一道题目:

题目

设m是正整数,a是整数,若a模m的阶等于φ(m),则称a为模m的一个原根。(其中φ(m)表示m的欧拉函数)
给出1个质数P,找出P最小的原根。
Input
<span id="Showjim86_bnbbbsbl_s39"></span>输入1个质数P(3 <= P <= 10^9)<span id="Showjim86_bnbbbsbl_e39"></span>
Output
<span id="Showjim86_bnbbbsbl_s40"></span>输出P最小的原根。

解答

[cpp] view plaincopy
  1. #include <iostream>  
  2. #include <cstdlib>  
  3. #include <cstring>  
  4. #include <cstdio>  
  5. using namespace std;  
  6. int P;  
  7. const int NUM = 32170;  
  8. int prime[NUM/4];  
  9. bool f[NUM];  
  10. int pNum = 0;  
  11. void getPrime()//线性筛选素数  
  12. {  
  13.     for (int i = 2; i < NUM; ++ i)  
  14.     {  
  15.         if (!f[i])  
  16.         {  
  17.             f[i] = 1;  
  18.             prime[pNum++] = i;  
  19.         }  
  20.         for (int j = 0; j < pNum && i*prime[j] < NUM; ++ j)  
  21.         {  
  22.             f[i*prime[j]] = 1;  
  23.             if (i%prime[j] == 0)  
  24.             {  
  25.                 break;  
  26.             }  
  27.         }  
  28.     }  
  29. }  
  30. __int64 getProduct(int a,int b,int P)//快速求次幂mod  
  31. {  
  32.     __int64 ans = 1;  
  33.     __int64 tmp = a;  
  34.     while (b)  
  35.     {  
  36.         if (b&1)  
  37.         {  
  38.             ans = ans*tmp%P;  
  39.         }  
  40.         tmp = tmp*tmp%P;  
  41.         b>>=1;  
  42.     }  
  43.     return ans;  
  44. }  
  45.   
  46. bool judge(int num)//求num的所有的质因子  
  47. {  
  48.     int elem[1000];  
  49.     int elemNum = 0;  
  50.     int k = P - 1;  
  51.     for (int i = 0; i < pNum; ++ i)  
  52.     {  
  53.         bool flag = false;  
  54.         while (!(k%prime[i]))  
  55.         {  
  56.             flag = true;  
  57.             k /= prime[i];  
  58.         }  
  59.         if (flag)  
  60.         {  
  61.             elem[elemNum ++] = prime[i];  
  62.         }  
  63.         if (k==1)  
  64.         {  
  65.             break;  
  66.         }  
  67.         if (k/prime[i]<prime[i])  
  68.         {  
  69.             elem[elemNum ++] = prime[i];  
  70.             break;  
  71.         }  
  72.     }  
  73.     bool flag = true;  
  74.     for (int i = 0; i < elemNum; ++ i)  
  75.     {  
  76.         if (getProduct(num,(P-1)/elem[i],P) == 1)  
  77.         {  
  78.             flag = false;  
  79.             break;  
  80.         }  
  81.     }  
  82.     return flag;  
  83. }  
  84. int main()  
  85. {  
  86.       
  87.     getPrime();  
  88.     while (cin >> P)  
  89.     {  
  90.         for (int i = 2;;++i)  
  91.         {  
  92.             if (judge(i))  
  93.             {  
  94.                 cout << i<< endl;  
  95.                 break;  
  96.             }  
  97.         }  
  98.     }  
  99.     return 0;  
  100. }  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/510405.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文娱行业搜索最佳实践

内容搜索的价值主要体现在两个方面&#xff1a; 对用户而言&#xff0c;用户将搜索作为寻找内容的工具&#xff0c;目标是“搜的到&#xff0c;搜的准”。用户更关心搜索结果的相关性、时效性和多样性。 对平台而言&#xff0c;搜索是内容消费、流量引导的核心入口&#xff0…

一文搞懂 SAE 日志采集架构

日志&#xff0c;对于一个程序的重要程度不言而喻。无论是作为排查问题的手段&#xff0c;记录关键节点信息&#xff0c;或者是预警&#xff0c;配置监控大盘等等&#xff0c;都扮演着至关重要的角色。是每一类&#xff0c;甚至每一个应用程序都需要记录和查看的重要内容。而在…

无需编写一行代码,实现任何方法的流量防护能力

背景 微服务的稳定性一直是开发者非常关注的话题。随着业务从单体架构向分布式架构演进以及部署方式的变化&#xff0c;服务之间的依赖关系变得越来越复杂&#xff0c;业务系统也面临着巨大的高可用挑战。疫情期间&#xff0c;大家可能都经历过以下的场景&#xff1a; 线上预…

使用日志上下文聚合插件使能上下文查询及 Livetail

背景 在排查业务故障时&#xff0c;用户往往需要查看业务日志文件来定位问题。然而&#xff0c;当用户在使用SLS收集业务日志时&#xff0c;同一个Logstore中往往存放着不同的日志&#xff08;例如同一台主机上不同目录下的文件&#xff0c;抑或是同一个K8S集群节点上不同容器…

Koordinator v0.7: 为任务调度领域注入新活力

Koordinator[1]继上次v0.6版本[2]发布后&#xff0c;经过 Koordinator 社区的努力&#xff0c;我们迎来了具有重大意义的 v0.7 版本。在这个版本中着重建设了机器学习、大数据场景需要的任务调度能力&#xff0c;例如 Coscheduling、ElasticQuota 和精细化的 GPU 共享调度能力。…

聊聊日志硬扫描,阿里 Log Scan 的设计与实践

日志 Scan 的发展与背景 大数据快速增长的需要 泛日志&#xff08;Log/Trace/Metric&#xff09;是大数据的重要组成&#xff0c;伴随着每一年业务峰值的新脉冲&#xff0c;日志数据量在快速增长。同时&#xff0c;业务数字化运营、软件可观测性等浪潮又在对日志的存储、计算…

注册配置、微服务治理、云原生网关三箭齐发,阿里云 MSE 持续升级

背景 注册中心是日常使用频率很高的微服务组件&#xff0c;通过较低的资源溢价帮助客户缩短微服务的构建周期、提升可用性&#xff1b;微服务治理实现了 0 门槛就能接入全链路灰度、无损上下线、限流降级、环境隔离、数据库治理等能力&#xff0c;轻松完成开源到稳定生产的跨越…

新零售标杆 SKG 全面拥抱 Serverless,实现敏捷交付

项目背景 SKG 公司是一家专注于高端健康产品的研发、设计与制造的企业。专注为消费者提供精致、时尚的高端产品&#xff0c;以及极致的按摩仪产品体验。 随着市场需求的迅速变化&#xff0c;SKG 的 IT 系统也逐渐面临着库存不准确、线上线下渠道无法协同、部署架构不灵活、IT…

Mobius函数计算 定义+代码模板

Mobius函数定义为&#xff0c;输入一个正整数N&#xff0c;当N1时&#xff0c;函数值为1&#xff0c;当N不为1时&#xff0c;首先在稿纸上将它分解质因数&#xff0c;若某质因数的个数大于1&#xff0c;则函数值为0&#xff0c;如N45&#xff0c;453*3*5,3出现了两次&#xff0…

不仅有0.0075元的深度冷归档,更有对下一代云存储的重新定义

前言&#xff1a;重新定义下一代云存储&#xff0c;需要继续保障稳定、安全、可靠和低成本&#xff0c;进一步演进 Serverless 能力&#xff0c;智能适配负载变化&#xff0c;提供智能数据管理能力以及全场景覆盖不断发展的新负载。 阿里云存储的创新活力&#xff0c;不仅拓展了…

一图看懂镜像

原文链接 本文为阿里云原创内容&#xff0c;未经允许不得转载。

数值方法求积分 详解+模板代码

什么是数值积分 数值积分可以用来求定积分的近似值。对于很多函数来说&#xff0c;我们是可以使用初等函数来表示出其积分的&#xff0c;对于这种函数&#xff0c;只需要求出不定积分然后代入值就能得到定积分了。 可是除此之外还有许多难求的函数和没法使用初等函数表示的函数…

用积木讲运维,这样的IT人太会了

积木的拼搭&#xff0c;是件细致工作。用不同的积木&#xff0c;进行组合变换&#xff0c;小孩子可能会用积木搭高楼、搭汽车、搭公路&#xff0c;而IT人则选择通过搭建小积木&#xff0c;讲解可观测的大乾坤。 大家所熟知的日志服务SLS不只是“日志存储”&#xff0c;更是一个…

再谈数据湖3.0:降本增效背后的创新原动力

前言&#xff1a;2022年3月 31 日&#xff0c;阿里云全球数据湖峰会上&#xff0c;阿里云从“湖管理、湖存储和湖计算“这三个方面&#xff0c;为观众带来了“数据湖 3.0” 的重磅升级方案。在时隔两百多天的云栖大会上&#xff0c;阿里云存储对数据湖的能力&#xff0c;进行了…

原码 反码 补码 详解

一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1、机器数 一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的&#xff0c;在计算机用一个数的最高位存放符号, 正数为0, 负数为1. 比如&#xff0c;十进制中的数 3 &…

谈谈 PolarDB-X 在读写分离场景的实践

在数据库使用过程中经常会遇到一些场景&#xff1a; 业务写流量一直相对比较稳定&#xff0c;但随着时间&#xff0c;数据不断增加&#xff0c;数据库的压力也会越来越大&#xff0c;写操作会影响到读请求的性能&#xff0c;做任何优化可能都达不到最终的效果&#xff1b;在应…

开源数据库 PolarDB 为什么能捕获娃哈哈的心?

一、娃哈哈的需求 娃哈哈已经使用PostgreSQL多年&#xff0c;使用了大量逻辑复制&#xff0c;且备库仅提供一些业务的只读服务。同时&#xff0c;其重要业务的数据库运行在共享SAN存储上。因此&#xff0c;它存在主备库延迟较大、逻辑复制不稳定且延迟大的痛点。 二、使用Pola…

数据库 PolarDB 开源之路该如何走?听听他们怎么说

阿里巴巴集团副总裁、阿里云数据库事业部负责人李飞飞出席了沙龙并致开场辞&#xff1a;PolarDB 是阿里云的明星产品&#xff0c;做出将PolarDB 开源的决策需要非常大的勇气。将最核心的数据库产品对外开源&#xff0c;且使用了最友好的协议&#xff0c;阿里云是全球头部云厂商…

通过定时 SQL 提取阿里云API 网关访问日志指标

背景 阿里云API网关服务提供API托管服务&#xff0c;提供了强大的适配和集成能力&#xff0c;可以将各种不同的业务系统API实现统一管理。API网关同时支持将API访问日志一键存储到日志服务&#xff0c;通过日志服务强大的查询分析能力&#xff0c;用户可以针对访问日志自定义计…

2022云栖现场|体验阿里巴巴工作数字化实践

越来越多的企业主动拥抱数字化转型&#xff0c;借助数字化工具提高企业运营效率&#xff0c;实现企业目标落地、帮助员工成长。 2022云栖大会&#xff0c;阿里巴巴企业智能带来阿里数字化工作方法与企业IT解决方案&#xff0c;展示着阿里内部在办公协同与IT管理上的实际应用场…