阶与原根 学习笔记

news/2024/11/13 11:57:03/文章来源:https://www.cnblogs.com/dccy/p/18538870

阶与原根

定义:满足 \(a^n\equiv 1\pmod p\) 的最小的正整数 \(n\) 称作 \(a\) 在模 \(p\) 意义下的阶,记作 \(ord_p(a)\)

一些显然的性质:

性质1:对于 \(1\le i\le ord_p(a)\)\(a^i\) 不同余。

性质2:对于 \(a^n \equiv1\pmod p\)\(ord_p(a)\mid n\)

性质3:如果 \(a^n\equiv a^m\pmod p\),则 \(n\equiv m\pmod {ord_p(a)}\)

其他一些性质。

神奇的性质:对于质数 \(p\)\(ord_p(x)=\dfrac{\varphi(p)}{\gcd(\varphi(p),x)}\)

原根

定义:若 \(\gcd(g,m)=1\)\(ord_m(g)=\varphi(m)\),则 \(g\)\(m\) 的原根。原根可能有多个。

性质:当 \(m\) 为质数时,\(g^i\bmod m(0<i<m)\) 互不相同。

原根个数:若 \(m\) 有原根,\(m\) 的原根个数为 \(\varphi(\varphi(m))\)

原根存在:原根存在,当且仅当 \(m=2,4,p^k,2p^k\),其中 \(p\) 为奇质数。

原根判定:对于 \(\gcd(g,m)=1\),若 \(g\)\(m\) 的原根,当且仅当对于 \(\varphi(m)\) 的每个素因子 \(p\),都有 \(g^{\frac{\varphi(m)}{p}}\ne 1\pmod m\)

原根范围:素数的最小原根为 \(O(m^{0.25})\)

求最小原根:由于最小原根的范围,我们可以从小到大枚举每个数暴力地判断是否为原根,复杂度 \(O(\sqrt m)\)

习题

  • P6091 [模板] 原根
  • AT abc212_g

AT abc212_g

求有多少整数对 \((x,y)\) 满足存在一个正整数 \(n\) 使得 \(x^n\equiv y\pmod P\),给定质数 \(P\)\(P\le10^{12}\)

题解

根据质数的原根的性质,我们找到 \(P\) 的原根 \(g\),则 \(x,y\) 可以表示成 \(g^a,g^b\),那么

\[\sum_{a=1}^{P-1}\sum_{b=1}^{P-1}[\exist n,g^{an}\equiv g^b\pmod P] \]

根据欧拉定理,

\[\sum_{a=1}^{P-1}\sum_{b=1}^{P-1}[\exist n,an\equiv b\pmod {P-1}] \]

那么根据同余方程的性质,

\[\sum_{a=1}^{P-1}\sum_{b=1}^{P-1}[\gcd(a,P-1)\mid b] \]

枚举 \(\gcd\) 的值,

\[\sum_{d=1}^{P-1}\Big\lfloor\dfrac {P-1} d\Big\rfloor\sum_{d|a}^{P-1}[\gcd(a,P-1)=d] \]

右边的和式当且仅当 \(d\mid (P-1)\) 时不为 \(0\)

\[\sum_{d=1}^{P-1}\Big\lfloor\dfrac {P-1} d\Big\rfloor [d\mid (P-1)]\sum_{a=1}^{(P-1)/d}[\gcd(a,\dfrac {P-1} d)=1] \]

右边是 \(\varphi\) 的定义,

\[\sum_{d=1}^{P-1}\Big\lfloor\dfrac {P-1} d\Big\rfloor [d\mid(P-1)]\varphi(\dfrac {P-1} d) \]

\(d\)\(P-1\) 的因数时有值,

\[\sum_{d\mid {P-1}}^{P-1}\dfrac {P-1} d \varphi(\dfrac {P-1} d) \]

因数取遍,则

\[\sum_{d\mid P-1} d\times\varphi(d) \]

直接算为 \(O(d(P-1)\sqrt{P-1})\)

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

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

相关文章

CFAT:三角窗口实现图像超分辨率

CFAT:三角窗口实现图像超分辨率基于变换器的模型通过利用其固有的捕获复杂上下文特征的能力,彻底改变了图像超分辨率(SR)的效果。如今,在Transformer架构中使用的重叠矩形移位窗口技术是超分辨率模型中的一种常见做法,可以提高图像放大的质量和鲁棒性。然而,它在边界处存…

CFAT:释放三角窗口实现图像超分辨率

CFAT:释放三角窗口实现图像超分辨率基于变换器的模型通过利用其固有的捕获复杂上下文特征的能力,彻底改变了图像超分辨率(SR)的效果。如今,在Transformer架构中使用的重叠矩形移位窗口技术是超分辨率模型中的一种常见做法,可以提高图像放大的质量和鲁棒性。然而,它在边界…

读数据工程之道:设计和构建健壮的数据系统34读后总结与感想兼导读

读后总结与感想兼导读1. 基本信息 数据工程之道:设计和构建健壮的数据系统[美]乔里斯(Joe Reis),[美]马特豪斯利(Matt Housley)著机械工业出版社,2024年2月出版1.1. 读薄率 书籍总字数473千字,笔记总字数109584字。 读薄率109584473000≈23.17% 1.2. 读厚方向Data Mesh权威指…

鸿蒙NEXT开发案例:抛硬币

【1】引言(完整代码在最后面) 本项目旨在实现一个简单的“抛硬币”功能,用户可以通过点击屏幕上的地鼠图标来模拟抛硬币的过程。应用会记录并显示硬币正面(地鼠面)和反面(数字100面)出现的次数。为了增强用户体验,我们还添加了动画效果,使抛硬币的过程更加生动有趣。 …

【CodeForces训练记录】Codeforces Round 986 (Div. 2)

训练情况赛后反思 C题逆风翻盘,可能勉强青名了。A题愣神了,我觉得还能再做的快一点。 A题 给定一个字符串,NWSE,重复着字符串走,我们直接模拟即可,用 while 来判断是否走到终点,然后对于不可能走到的终点,我选择了一个不会超时的步数范围,超出就跳出 while 即可,最后…

24. 使用MySQL之使用游标

1. 游标 由前几章可知,MySQL检索操作返回一组称为结果集的行。这组返回的行都是与SQL语句相匹配的行(零行或多行)。 使用简单的SELECT语句,例如,没有办法得到第一行、下一行或前10行,也不存在每次一行地处理所有行的简单方法(相对于成批地处理它们)。 有时,需要在检索…

Python clickhouse-driver 类库使用学习总结

实践环境 python3 .9.13 clickhouse-driver 0.2.9 实践操作 # -*- coding:utf-8 -*-import clickhouse_driverif __name__ == __main__:host = 192.168.88.131port = 9000 # 注意,不能使用默认的8123username = testaccpassword = test1234database = default# 连接方式1# con…

随波逐流工具使用_Week1

跟着大师傅的公众号做题的week1 来源以及说明 (文章主要是了解怎样使用长弓三皮大师傅的随波逐流工具,wp以及附件来自大师傅长弓三皮) (这周主要是做笔记的软件老是出现问题,有一些笔记有点乱,后面慢慢改进) 软件及题目下载 http://www.1o1o.xyz/bo_softdown.html CTF题目wr…

开源 - Ideal库 - 特殊时间扩展方法(三)

分享特殊时间获取的扩展方法,包括当天开始/结束时间、当前周/月/季度/年的第一天和最后一天等,附代码示例和单元测试,库将上传至Nuget,源码在代码库。书接上回,我们继续来分享一些关于特殊时间获取的常用扩展方法。01、获取当天的开始时间 当天的开始时间指00:00:00时刻,…

Vue2: v-for 联合 ref 使用, 对应引用信息为数组

MarkTime: 2024-06-03 00:21:47 LogTime: 2024-11-10 23:25:35说明问题:调用ref引用的时候, 好奇获取的时候为什么 有的返回的是对象, 有的返回的是数组 (如下图)版本:vue: 2.6.14源码 <!--已经省略掉大部分代码 只保留结构为说明 --> <template><div class=&qu…

Debug: setTimeout 使用做定时器时的错误函数传递方式

MarkTime: 2024-05-24 10:41:26 LogTime: 2024-11-10 14:55:53首先复习 setTimeout(): 语法: let timeId = setTimeout(func|code, [delay_millisecond]) 说明: 延时器. 延迟delay_millisecond后, 执行参数1setInterval(): 语法: let timeId = setInterval(func|code, [delay_…

Debug: calc() 未生效 = 内嵌样式表达式需使用空格分隔

MarkTime: 2024-06-25 17:10 LogTime: 2024-11-09 13:58:02结论calc()内的表达式 需要使用 空格分隔符, 即 更正 calc(100%-100px-10px); => calc(100% - 100px - 10px); 即可源<!-- 原错误代码 --> <div class="layout-search" style="width: 100%…