原根

2023-11-04

定义

数论,特别是整除理论中,原根是一个很重要的概念。

对于两个正整数 (a,m)=1, 由欧拉定理可知,存在正整数d\leq m-1, 比如说欧拉函数d=\varphi (m),即小于等于m的正整数中与m互素的正整数的个数,使得 a^{d}\equiv 1{\pmod  {m}}

由此,在(a,m)=1时,定义a对模m的指数    \delta m(a)    为使  a^{d}\equiv 1{\pmod  {m}}  成立的最小的正整数  d  。由前知  \delta m(a)   一定小于等于  \varphi (m)  ,若  \delta m(a) = \varphi (m)  ,则称   a 是模 m 的原根。

 

例子

设 m=7  ,则  \varphi (m)  等于6。

  • 设  a=2  ,由于  2^{3}=8\equiv 1{\pmod  {7}}     ,而  \displaystyle 3<6  ,所以 2 不是模 7 的一个原根。
  • 设  a=3  ,由于  3^{1}\equiv 3{\pmod  {7}}  , 3^{2}\equiv 2{\pmod  {7}}  , 3^{3}\equiv 6{\pmod  {7}}  , 3^{4}\equiv 4{\pmod  {7}}  , 3^{5}\equiv 5{\pmod  {7}}  , 3^{6}\equiv 1{\pmod  {7}}  ,因此有 Ord_{7}(3)=6=\varphi (7)  ,所以 3 是模 7 的一个原根。

性质

  • 可以证明,如果正整数 (a,m)=1  和正整数 d 满足 a^{d}\equiv 1{\pmod  {m}},则  Ord_{m}(a) 整除 d。因此 Ord_{m}(a) 整除 \varphi (m) 。在例子中,当 a=3 时,我们仅需要验证 3 的 2、3 次方模 7 的余数即可,如果其中有一个是1,则3就不是原根。
  • 记 \delta =Ord_{m}(a)  ,则 a^{0},a^{1},a^{2}\cdots ,a^{​{\delta -1}} 模 m 两两不同余。因此当a是模{\displaystyle m}m的原根时, a^{0},a^{1},a^{2}\cdots ,a^{​{\delta -1}}  构成模 m 的简化剩余系
  • 模 m 有原根的充要条件是 m=2,4,p^{n},2p^{n} ,其中 p 是奇素数, n 是任意正整数
  • 对正整数 (a,m)=1 ,如果 a 是模 m 的原根,那么 a 是整数模m乘法群(即加法群 Z/mZ 的可逆元,也就是所有与 m 互素的正整数构成的等价类构成的乘法群)Zm×的一个生成元。由于Zm×有  \varphi (m) 个元素,而它的生成元的个数就是它的可逆元个数,即 \varphi (\varphi (m)) 个,因此当模 m 有原根时,它有 \varphi (\varphi (m)) 个原根。

一些数的原根列表

m 模m的原根(有*号的数没有原根,此时是有最大模m周期的数) 周期 (OEISA002322)
1 0 1
2 1 1
3 2 2
4 3 2
5 2, 3, 4 4
6 5 2
7 3, 5 6
8* 3, 5, 7 2
9 2, 5 6
10 3, 7 4
11 2, 6, 7, 8 10
12* 5, 7, 11 2
13 2, 6, 7, 11 12
14 3, 5 6
15* 2, 7, 8, 13 4
16* 3, 5, 11, 13 4
17 3, 5, 6, 7, 10, 11, 12, 14 16
18 5, 11 6
19 2, 3, 10, 13, 14, 15 18
20* 3, 7, 13, 17 4
21* 2, 5, 10, 11, 17, 19 6
22 7, 13, 17, 19 10
23 5, 7, 10, 11, 14, 15, 17, 19, 20, 21 22
24* 5, 7, 11, 13, 17, 19, 23 2
25 2, 3, 8, 12, 13, 17, 22, 23 20
26 7, 11, 15, 19 12
27 2, 5, 11, 14, 20, 23 18
28* 3, 5, 11, 17, 19, 23 6
29 2, 3, 8, 10, 11, 14, 15, 18, 19, 21, 26, 27 28
30* 7, 13, 17, 23 4
31 3, 11, 12, 13, 17, 21, 22, 24 30
32* 3, 5, 11, 13, 19, 21, 27, 29 8
33* 2, 5, 7, 8, 13, 14, 17, 19, 20, 26, 28, 29 10
34 3, 5, 7, 11, 23, 27, 29, 31 16
35* 2, 3, 12, 17, 18, 23, 32, 33 12
36* 5, 7, 11, 23, 29, 31 6

除了直接运算以外,至今还没有一个办法可以找到模特定m时的原根,但假如已知模m有一个原根,则可找出它其他的原根。

 

题目一:求最小的原根

#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int Maxn = 1e6+10;
const int N = 1e8+10;
int prime[Maxn];//存储素数
int sprime[Maxn];//存储P-1的素因子
bool check[Maxn];
bitset<Maxn>pri;//结果只有0和1,判断是否为素数
int k;//记录Maxn以内的素数个数
int cnt;//记录素因子的个数
void is_prime(){
    pri.set();//将所有的二进制数都标为1
    for(int i=2; i<Maxn; i++) {
        if(pri[i]) {
            prime[k++]=i;
            for(int j=i+i; j<Maxn; j+=i)
                pri[j]=0;
        }
    }
}
void Divide(int n)//将n分解为素因子
{
    cnt=0;
    int t=(int)sqrt(1.0*n);
    for(int i=0; prime[i]<=t; i++) {
        if(n%prime[i]==0) {
            sprime[cnt++]=prime[i];
            while(n%prime[i]==0)//因为有可能有多个peime[i]
                n/=prime[i];
        }
    }
    if(n>1)
        sprime[cnt++]=n;//可能只有自己一个素因子
}
LL modexp(LL a,LL b,int mod)//快速幂取余
{
    LL res=1;
    while(b>0) {
        a=a%mod;
        if(b&1)
            res=res*a%mod;
        b=b>>1;
        a=a*a%mod;
    }
    return res;
}

int main()
{
    int p;
    Is_prime();
    while(~scanf("%d",&p)) {
        Divide(p-1);
        for(int g=2; g<p; g++) {
            int flag=1;
            for(int i=0; i<cnt; i++) {
                int t=(p-1)/sprime[i];
                if(modexp(g,t,p)==1) {
                    flag=0;
                    break;
                }
            }
            if(flag) {
                int root=g;
                printf("%d\n",root);
                break;//去掉break的话是求所有的原根,加上break是求最小的原根、
            }
        }
    }
    return 0;
}

 

题目二:求原根的个数

#include<bits/stdc++.h>
using namespace std;
#define clr(a) memset(a,0,sizeof(a))

typedef long long ll;
const int maxn = 1e5+10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9+7;

ll n;
ll get(ll n){
    ll ans = n;
    for(int i=2;i*i<=n;i++){
        if(n %i == 0){
            ans = ans / i * (i - 1);
            while(n %i == 0)
                n /= i;
        }
    }
    if(n > 1)   ans = ans / n * (n - 1);
    return ans ;
}
int main(){
    while(scanf("%lld",&n)!=EOF){
        printf("%lld\n",get(get(n)));
    }
    return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

原根 的相关文章

  • 一文搞懂什么是 PostCSS

    一文搞懂什么是 PostCSS 在 Web 应用开发中 CSS 代码的编写是重要的一部分 CSS 规范从最初的 CSS1 到现在的 CSS3 再到 CSS 规范的下一步版本 规范本身一直在不断的发展演化之中 这给开发人员带来了效率上的提高
  • [转]转型后的BlackBerry“恋上”汽车市场,QNX拿什么与免费的安卓/Linux对抗?

    如果你认为本系列文章对你有所帮助 请大家有钱的捧个钱场 点击此处赞助 赞助额0 1元起步 多少随意 声明 本文只用于个人学习交流 若不慎造成侵权 请及时联系我 立即予以改正 锋影 email 174176320 qq com BlackBe
  • 深信服应用交付管理系统远程命令执行漏洞复现

    文章目录 深信服应用交付管理系统远程命令执行漏洞复现 0x01 前言 0x02 漏洞描述 0x03 影响范围 0x04 漏洞环境 0x05 漏洞复现 1 访问漏洞环境 2 构造POC 3 复现 深信服应用交付管理系统远程命令执行漏洞复现 0
  • springboot 打成jar后读取resources下面的文件

    1 使用idea开发过程中获取resources的路径是使用的这个方法 File file ResourceUtils getFile ResourceUtils CLASSPATH URL PREFIX 文件名称 data 然后就可以获取
  • idea中连接mysql插入成功数据,在navicat中刷新表格没有数据?

    目录 一 出现问题 二 尝试解决 三 发现问题 四 解决方法 一 出现问题 在写一个数据库的大作业时 在idea中连接mysql后 测试insert的dao方法 在控制台没有报错 显示题添加数据成功 但是在navicat中刷新表格却没有数据
  • 开发日记(5) 我们如何让EditText的光标消失呢?

    很多日子没有分享文章 赶项目呢 3人5项目 好烦啊 正题 这是分享的 原文章 http www cnblogs com yejiurui archive 2013 01 02 2841945 html 在我们的应用中 有时候一进入一个页面
  • 安卓混合开发,使用WebView控件展示网页

    页面使用webview控件来实现 WebView是Android系统提供能显示网页的系统控件 它是一个特殊的View 他的作用就是 显示和渲染Web页面 加载网络上或本地assets中的html文件 与JavaScript交互调用 常用于同
  • Win10自带虚拟机Hyper-V安装NOI Linux2.0

    下载NOI Linux ubuntu noi v2 0https noiresources ccf org cn ubuntu noi v2 0 iso速度有亿点慢 建议用下载器 开启Hyper V 注意 win10家庭版没有此功能 可以自
  • Qt5类之QMargins

    QMargins Class include
  • Python——构建多级菜单系统

    构建多级菜单系统 一 一级菜单 首先简单地尝试一下 运行结果 二 二级菜单 稍微要复杂一点 运行结果 以下两种 三 三级菜单 因为嵌套的越来越多了 所以代码看起来冗长复杂 运行了两种结果 总之每多一级 就相当于是多嵌套了一层 级数越多代码就
  • ArcFace/InsightFace使用自己数据训练/验证过程(3)

    分类专栏 人脸识别 InsightFace训练过程 文章标签 insightface自定义数据训练 arcface训练 人脸识别训练过程 版权 人脸识别 同时被 2 个专栏收录 4 篇文章1 订阅 订阅专栏 InsightFace训练过程
  • DWORD类型

    DWORD 类型基本相关 DWORD 宏定义 typedef unsigned long DWORD 1 要使用DWORD要添加头文件
  • 【好题】第九届“图灵杯”NEUQ-ACM程序设计竞赛个人赛 G-Num 思维+推公式

    题 推公式 a b a b a b 1 b a b 1 b 1 1 a 1 b 1 1 因此 令n 若n为质数 说明没有一个 a 1 b 1 可以组成它 就输出No 代码 include
  • Unity入门教程

    一 介绍 目的 通过尝试制作一款使用玩家角色把小球弹飞的简单小游戏 熟悉使用Unity进行游戏开发的基本流程 软件环境 Unity 2017 3 0f3 Visual Studio 2013 二 创建新项目 1 启动Unity后将出现一个并
  • Source Insight 4下载及中文乱码解决

    Source Insight 4 00 0121含补丁和许可证激活码 source insight 4下载链接 https www sdbeta com wg 2019 0621 230136 html 梳理 先配置整个工程为GB2312
  • 知乎越来越无聊了,真是想破了脑袋找可以装逼的地方!

    什么有一个优秀的女友是什么感觉 有个青梅竹马的女友又是什么感觉 你不如说和优秀的女友操B做爱是什么感觉 反正操多了就是那么回事 对不对 最烦这些装逼的家伙
  • Springboot 性能优化(亲测)——SpringBoot学习

    SpringBoot 是一个快速开发框架 能够快速的整合第三方框架 简化XML配置 全部采用注解形式 内置Tomcat容器 帮助开发者能够实现快速开发 SpringBoot的Web组件 默认集成的是SpringMVC框架 尽管 Spring
  • 完整实现 - 通过 DelayQueue 实现延时任务

    一 DelayQueue 的应用原理 二 订单延时任务的实现 三 订单处理 四 优缺点 实现延时任务有很多的方法 网上关于延时任务的实现的文章已经不少了 比如 实现延时任务的 10 种方法等等 但是这些文章基本上都是将方法大概的列举一下 给
  • 树(实现树的从上到下,从左到右遍历)

    具体描述 从上往下打印出二叉树的每个节点 同层节点从左至右打印 整体思想 借助一个队列进行实现 include
  • 开发微服务电商项目演示(五)

    登录方式调整 第1步 从zmall common的pom xml中移除spring session data redis依赖 注意 本章节中不采用spring session方式 改用redis直接存储用户登录信息 主要是为了方便之后的jm

随机推荐

  • 论文阅读笔记:Masked Autoencoders Are Scalable Vision Learners

    论文阅读笔记 Masked Autoencoders Are Scalable Vision Learners 摘要 介绍 实现 MASKING MAE编码器 MAE解码器 简单的实现 在 ImageNet 上的简单测试 Baseline
  • vue el-tabs中的分页 每个互不影响

    tabs展示 重点看分页
  • 冒泡排序+怎么计算时间复杂度

    冒泡排序的基本思想 时间复杂度为O N 2 每次比较两个相邻元素 如果他们的顺序错误就把它们交换过来 举个栗子 例如我们需要将 12 35 99 18 76 5个数进行从大到小排序 既然是从大到小排序 也就是越小越靠后 首先比较第一个数和第
  • vue组件props传值,对象获取不到的问题

    先说问题 父组件利用props向子组件传值 浏览器console有这个值 但是获取不到内部的属性 困了我3个小时 真的 父组件定义了personal这个值 在父组件接口中给这个值重新赋值 子组件接受这个值 浏览器console能看到这个值
  • 韩国100m无限流量服务器,CloudCone:$59/月独立服务器/X3363/8GB/2TB/100M无限流量/洛杉矶机房...

    Intel Xeon X3363 4 Cores 2 83 GHz 8GB RAM 2 TB HDD or 240 GB SSD 100 Mbps Unmetered 29 IPv4 5 IPs 64 IPv6 69 MO Limited
  • Spring Boot 如何处理国际化

    Spring Boot 国际化 在全球化的今天 很多应用程序需要支持多种语言和地区 为了满足不同用户的需求 应用程序需要提供多语言的支持 Spring Boot 提供了强大的国际化支持 使得开发人员能够轻松地为应用程序添加多语言支持 本文将
  • Flutter的Stack和Positioned的控件

    简介 Flutter中的Stack控件是一种可用于将多个子控件重叠在一起的布局控件 Stack将所有子控件放在同一个位置 它们可以根据需要进行定位 缩放或旋转 Stack中的子控件可以是任何类型的控件 例如文本 图像 按钮等 主要属性 St
  • ImageRewrad

    ImageReward Learning and Evaluating Human Preferences for Text to Image Generation https arxiv org pdf 2304 05977 pdf ht
  • 雪花算法实现

    文章目录 原理 引入依赖 SnowflakeManager 生成ID SnowflakeProperties 配置 注册SnowflakeManager snowflake的yaml 测试 原理 分别有三部分 其中第一位保留位 暂时没用 第
  • C++全局变量被多次析构导致程序崩溃的问题

    问题描述 1 在静态库libxxx a中定义了一个全局的string对象 2 有多个so文件都连接了这个静态库 并且引用了这个全局变量 3 有一个程序同时加载了多个上述的so文件 4 在这个程序退出时 全局的string就会被多次析构 5
  • vue正式环境与测试环境压包配置方法

    1 安装cross env cnpm install save dev cross env package json配置修改 这里分别添加env config prod env config dev来控制当前的压包环境 package js
  • 互联网网站的反爬虫策略浅析

    因为搜索引擎的流行 网络爬虫已经成了很普及网络技术 除了专门做搜索的Google Yahoo 微软 百度以外 几乎每个大型门户网站都有自己的搜索引擎 大大小小叫得出来名字得就几十种 还有各种不知名的几千几万种 对于一个内容型驱动的网站来说
  • org.springframework.context.annotation.ConflictingBeanDefinitionException异常处理

    问题描述 项目启动时 报了这个错 org springframework context annotation ConflictingBeanDefinitionException 标记为Bean类 com gaotai zhxy prop
  • 在vmware环境下安装ubuntu

    在vmware环境下安装ubuntu18 04 1 下载VMware workstation16 2 下载ubuntu 18 04 5 3 安装vmware 创建虚拟机 一 VMware workstation16 下载链接 https p
  • 10、CLASSIFIER-FREE DIFFUSION GUIDANCE

    简介 论文 https arxiv org pdf 2207 12598 pdf 分类器指导将扩散模型的得分估计与图像分类器的梯度相结合 因此需要训练与扩散模型分开的图像分类器 实验证明 在没有分类器的情况下 指导确实可以由纯生成模型执行
  • sed全文字符串替换

    sed i s 被替换的内容 要替换成的内容 file sudo sed i s archive ubuntu mirrors aliyun etc apt sources list
  • 抖音rpc调用生成x-gorgon、x-argus签名学习记录

    一 通过jadx gui分析apk 找到签名入口函数如下 先hook下这个函数 能看到有结果 接下来就是构造参数模拟调用就行 有两个参数 第一个是url的拼接 第二个是headers里面的一些参数构成的map 这个参数每个接口可能不一样 我
  • 若依ruoyi改皮肤-主题(二)

    一 风格等基础设置 有深色和浅色风格两种 根据设计图考虑是否需要 如果不需要 去掉一种风格 这里以浅色风格为主 在 布局设置 里 可以设置主题风格 深浅 主题颜色 直接下拉修改主色 隐藏菜单 顶部标签等等 如果想在css里修改 1 主题风格
  • 30套JSP网站源代码合集

    JSP技术是以Java语言作为脚本语言的 JSP网页为整个服务器端的Java库单元提供了一个接口来服务于HTTP的应用程序 我收集了一些JSP开发的网站源代码 从实践中学习 希望对大家有用 资料名称 下载地址 网上购物系统 jsp mysq
  • 原根

    定义 在数论 特别是整除理论中 原根是一个很重要的概念 对于两个正整数 由欧拉定理可知 存在正整数 比如说欧拉函数 即小于等于的正整数中与互素的正整数的个数 使得 由此 在时 定义对模的指数 为使 成立的最小的正整数 由前知 一定小于等于