当前位置: 首页 > news >正文

素数求原根

1 模m原根的定义

1.1符号说明:

Z m ∗ Z_m^* Zm:代表满足 1 < = i < = m − 1 , ( i , m ) = 1 1<=i<=m-1,(i,m)=1 1<=i<=m1,(i,m)=1的数字 i i i组成的集合
o r d m ( a ) ord_m(a) ordm(a):代表 a ( m o d m ) a(mod m) a(modm) Z m ∗ Z_m^* Zm中的阶,即使得 a d ≡ 1 a^d \equiv 1 ad1的最小正整数 d d d
φ ( m ) \varphi(m) φ(m):数 m m m简化剩余系中的元素个数,即集合 Z m ∗ Z_m^* Zm中的元素个数。

1.2定义

o r d m ( a ) = φ ( m ) ord_m(a)= \varphi(m) ordm(a)=φ(m),则称 a a a为模 m m m的原根。即在 Z m ∗ Z_m^* Zm乘法上的生成元。

2 素数求原根

2.1 理论基础

φ ( m ) = m − 1 = p i a ∗ p j b . . . p k c ( p i , p j . . . p k \varphi(m)=m-1=p_i^a*p_j^b...p_k^c(p_i,p_j...p_k φ(m)=m1=piapjb...pkc(pi,pj...pk为素数 ) ) )。对于任意一个 p i p_i pi,都满足 a φ ( m ) / p i ≢ 1 ( m o d m ) a^{\varphi(m)/p_i} \not\equiv 1 \pmod m aφ(m)/pi1(modm),则 a a a为模 m m m的原根。
证明: 根据拉个格朗日定理,对于任意一个 a a a ∈ \in Z m ∗ Z_m^* Zm,有 o r d m ( a ) ord_m(a) ordm(a) | φ ( m ) \varphi(m) φ(m),即当且仅当d| φ ( m ) \varphi(m) φ(m)时,才会使得 a d ≡ 1 ( m o d m ) a^d \equiv 1 \pmod m ad1(modm)
根据模m原根的定义,要求 o r d m ( a ) = φ ( m ) ord_m(a)= \varphi(m) ordm(a)=φ(m),即当且仅当 d = φ ( m ) d=\varphi(m) d=φ(m)时,才有 a d ≡ 1 ( m o d m ) a^d \equiv 1 \pmod m ad1(modm)

进一步地推导可知, d ≠ φ ( m ) d\not =\varphi(m) d=φ(m)且d| φ ( m ) \varphi(m) φ(m)时,若对于所有d都满足 a d ≢ 1 ( m o d m ) a^d \not\equiv 1 \pmod m ad1(modm),则a为原根 (条件一)

对于任意一个 d d d,因为 d ≠ φ ( m ) d\not =\varphi(m) d=φ(m)且d| φ ( m ) \varphi(m) φ(m),因此存在i,使得 d ∣ d | d φ ( m ) / p i \varphi(m) / p_i φ(m)/pi,由于 a d ≢ 1 ( m o d m ) a^d \not\equiv 1 \pmod m ad1(modm),因此可以推导出 a φ ( m ) / p i ≢ 1 ( m o d m ) a^{\varphi(m) / p_i} \not\equiv 1 \pmod m aφ(m)/pi1(modm)

因此,若对于所有 p i p_i pi,满足 a φ ( m ) / p i ≢ 1 ( m o d m ) a^{\varphi(m) / p_i} \not\equiv 1 \pmod m aφ(m)/pi1(modm),则a为原根 (条件二)

拉格朗日定理:在有限群 < G , ∗ > <G,*> <G,>中,每个元素的周期是# G G G(集合G的元素的个数)的因子。

2.2 算法流程

算法的整体思路是根据2.1节所述的条件二来制定的。其具体的流程如下:
step1: 使用素数线性筛法,找出 1 1 1 m m m中的所有素数。
step2: 确定m的质因子集合{ p i p_i pi}。
step3: 遍历 2 2 2 m m m中的所有数,假设当前处理的数为a。遍历m的所有质因子,若都满足 a φ ( m ) / p i a^{ \varphi(m) / p_i} aφ(m)/pi ≢ \not\equiv 1 ( m o d m ) \pmod m (modm),则a为模m的原根。

2.3代码实现


#include<iostream>
using namespace std;
#define NUM 998244380
bool is_prime[NUM] = { 0 };
#define NMAX 400000
long long prime[NMAX];
long long prime_num = 0;
long long m;//待处理的素数
long long p_factor[NMAX];
long long p_factor_num = 0;
void get_prime(long long n) {for (long long m = 2; m < n; m++) {if (m == 98244379){cout << m << endl;}if (m == 298244379){cout << m << endl;}//数m没有被筛选过if (!is_prime[m]) {if (prime_num > NMAX) {cout << "越界" << endl;}prime[prime_num++] = m;}//筛选掉以prime[i]为最小素因子的合数m*prime[i]for (long long i = 0; i < prime_num; i++) {if ((m * prime[i]) < n) is_prime[m * prime[i]] = 1;if (m % prime[i] == 0) break;//m*prime[j](j>i)的最小素因子为m的最小素因子prime[i]而非prime[j],因此跳出循环}}//打印输出/*for (int i = 0; i < prime_num; i++) {cout << prime[i] << " ";}cout << endl;*/
}
void get_p_factor(long long m) {p_factor_num = 0;for (long long i = 0; i < prime_num; i++) {if ((m - 1) % prime[i] == 0) p_factor[p_factor_num++] = prime[i];}
}
long long ksm(long long a, long long d, long long mod) {long long ret = 1;while (d) {if ((d & 1) == 1) ret = (ret * a) % mod;//按位与为&,而&&代表的是条件与a = (a * a) % mod;d >>= 1;}return ret;
}
int judge(long long a) {for (long long i = 0; i < p_factor_num; i++) {if (ksm(a, (m - 1) / p_factor[i], m) == 1) {return 0;}}return 1;
}
int main() {//1.获取所有的素数get_prime(1000);while (cin >> m) {//获取m的所有质因子get_p_factor(m);//遍历2...m-1进行判断for (long long a = 2; a < m; a++) {if (judge(a)) {cout << a << endl;break;}}}
}

相关文章:

素数求原根

1 模m原根的定义 1.1符号说明: Z m ∗ Z_m^* Zm∗​:代表满足 1 < i < m − 1 , ( i , m ) 1 1<i<m-1,(i,m)1 1<i<m−1,(i,m)1的数字 i i i组成的集合 o r d m ( a ) ord_m(a) ordm​(a):代表 a ( m o d m ) a(mod m) a(modm)在 Z m ∗ Z_m^* Zm∗​中的…...

【Apollo学习笔记】——规划模块TASK之PATH_ASSESSMENT_DECIDER

文章目录 前言PATH_ASSESSMENT_DECIDER功能简介PATH_ASSESSMENT_DECIDER相关信息PATH_ASSESSMENT_DECIDER总体流程1. 去除无效路径2. 分析并加入重要信息给speed决策SetPathInfoSetPathPointType 3. 排序选择最优的路径4. 更新必要的信息 前言 在Apollo星火计划学习笔记——Ap…...

09 mysql fetchSize 所影响的服务器和客户端的交互

前言 这是一个 之前使用 spark 的时候 记一次 spark 读取大数据表 OOM OutOfMemoryError: GC overhead limit exceeded 因为一个 OOM 的问题, 当时使用了 fetchSize 的参数 应用服务 hang 住, 导致服务 503 Service Unavailable 在这个问题的地方, 出现了一个查询 32w 的数据…...

DevEco Studio 配置

首先,打开deveco studio 进入首页 …我知道你们想说什么,我也想说 汉化配置 没办法,老样子,先汉化吧,毕竟母语看起来舒服 首先,点击软件左下角的configure,在配置菜单里选择plugins 进入到插件页面, 输入chinese,找到汉化插件,(有一说一写到这我心里真是很不舒服) 然后点击o…...

Nginx自动探活后端服务状态自动转发,nginx_upstream_check_module的使用

一、三种方案 nginx对后端节点健康检查的方式主要有3种 1. gx_http_proxy_module 模块和ngx_http_upstream_module模块(自带) 官网地址:http://nginx.org/cn/docs/http/ng … proxy_next_upstream 严格来说,nginx自带是没有针对负载均衡后端节点的健康检查的,但是可以通…...

CSS 一个好玩的卡片“开卡效果”

文章目录 一、用到的一些CSS技术二、实现效果三、代码 一、用到的一些CSS技术 渐变 conic-gradientbox-shadowclip-path变换、过渡 transform、transition动画 animation keyframes伪类、伪元素 :hover、::before、::after …绝对布局。。。 clip-path 生成网站 https://techb…...

lintcode 667 · 最长的回文序列【中等 递归到动态规划】

题目 https://www.lintcode.com/problem/667/ 给一字符串 s, 找出在 s 中的最长回文子序列的长度. 你可以假设 s 的最大长度为 1000.样例 样例1输入&#xff1a; "bbbab" 输出&#xff1a; 4 解释&#xff1a; 一个可能的最长回文序列为 "bbbb" 样例2输入…...

oracle sql语言模糊查询

在Where子句中&#xff0c;可以对datetime、char、varchar字段类型的列用Like子句配合通配符选取那些“很像...”的数据记录&#xff0c;以下是可使用的通配符&#xff1a; % 零或者多个字符 _ 单一任何字符&#xff08;下划线&#xff09; / 特殊字符 [] 在某一范…...

【Ubuntu】解决ubuntu虚拟机和物理机之间复制粘贴问题(无需桌面工具)

解决Ubuntu虚拟机和物理机之间复制粘贴问题 第一步 先删除原来的vmware tools&#xff08;如果有的话&#xff09; sudo apt-get autoremove open-vm-tools第二步 安装软件包&#xff0c;一般都是用的desktop版本&#xff08;如果是server换一下&#xff09; sudo apt-get …...

解决ubuntu文件系统变成只读的方法

所欲文件变成只读&#xff0c;这种情况一般是程序执行发生错误&#xff0c;磁盘的一种保护措施 使用fsck修复 方法一&#xff1a; # 切换root sudo su # 修复磁盘错误 fsck -t ext4 -v /dev/sdb6 方法二&#xff1a; fsck.ext4 -y /dev/sdb6 重新用读写挂载 上面两种方法&…...

高数刷题笔记

常见等价无穷小 注意讨论 第二个等价无穷小 夹逼定理&#xff01;&#xff01;&#xff01; 递归数列可以尝试用关系式法 通常用到夹逼定理的时候都会用到放缩构造出一大一小两个函数&#xff0c;将原函数夹在中间&#xff0c;然后使得两端函数极限相同则可推出原函数的极限&am…...

c++入门一

参考&#xff1a;https://www.learncpp.com/cpp-tutorial/ When you finish, you will not only know how to program in C, you will know how NOT to program in C, which is arguably as important. Tired or unhappy programmers make mistakes, and debugging code tends…...

2023年项目进度管理平台排行榜

项目进度管理是项目管理学科中的一门重要课程&#xff0c;通过合理的项目计划&#xff0c;有效控制项目进度&#xff0c;保障项目能够按时交付。 不过&#xff0c;项目进度管理并不是一件简单的工作&#xff0c;不仅需要面对项目过程中各种突发情况&#xff0c;还需要做好团队协…...

【设计模式】面向对象设计八大原则

&#xff08;1&#xff09;依赖倒置原则&#xff08;DIP&#xff09; 高层模块&#xff08;稳定&#xff09;不应该依赖于低层模块&#xff08;变化&#xff09;&#xff0c;二者都应该依赖于抽象&#xff08;稳定&#xff09;。抽象&#xff08;稳定&#xff09;不应该依赖于…...

python数分实战探索霍尔特法之销售预测python代码实现以及预测图绘制

探索霍尔特法:时间序列预测中的线性趋势捕捉 时间序列分析是统计学和数据分析中的一个核心领域。无论是预测股票市场的走势,还是预测未来的销售量,一个精确和可靠的预测模型都是至关重要的。在众多的时间序列预测方法中,霍尔特法(Holts method)脱颖而出,特别是当我们面…...

java线程状态

图形说明: Thread.State源码注释: public enum State {/*** 新生状态&#xff1a;线程对象创建&#xff0c;但是还未start()*/NEW,/*** 线程处于可运行状态&#xff0c;但是这个可运行状态并不代表线程一定在虚拟机中执行。* 需要等待从操作系统获取到资源(比如处理器时间片…...

编译问题:error: ‘printf’ was not declared in this scope

这个错误提示意味着编译器在当前作用域内无法找到 printf 函数的声明。这通常是因为没有包含 <stdio.h> 头文件导致的。 解决方法是在程序中添加 #include <stdio.h> 这一行代码。这个头文件中包含了 printf 函数的声明&#xff0c;告诉编译器如何处理该函数。...

改变C++中私有变量成员的值

1、没有引用的情况&#xff1a; #include <iostream> #include <queue> using namespace std; class Person { public:queue<int>que; public:queue<int> getQueue(){return que;}void push(int a){que.push(a);}void pop(){que.pop();} };int main()…...

线程唯一的单例

经典设计模式的单例模式是指进程唯一的对象实例&#xff0c;实现code如下&#xff1a; package cun.zheng.weng.design.sinstnce;import java.util.concurrent.CountDownLatch; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExec…...

明厨亮灶监控实施方案 opencv

明厨亮灶监控实施方案通过pythonopencv网络模型图像识别算法&#xff0c;一旦发现现场人员没有正确佩戴厨师帽或厨师服&#xff0c;及时发现明火离岗、不戴口罩、厨房抽烟、老鼠出没以及陌生人进入后厨等问题生成告警信息并进行提示。OpenCV是一个基于Apache2.0许可&#xff08…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验

Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...

spring Security对RBAC及其ABAC的支持使用

RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型&#xff0c;它将权限分配给角色&#xff0c;再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...