离散对数介绍

news/2025/2/12 18:03:10/

前置知识

欧拉函数 ϕ ( n ) \phi(n) ϕ(n)

欧拉函数简介

g g g n n n互质,则令 g x % n = 1 g^x\%n=1 gx%n=1的最小正整数 x x x称为 g g g n n n的阶。

原根

对于互质的两个正整数 g g g n n n,如果 g g g n n n的阶为 ϕ ( n ) \phi(n) ϕ(n),则称 g g g n n n的原根。

求原根

一般的原根都比较小,暴力枚举即可。


离散对数

g g g m m m的原根,则当

g k ≡ x ( m o d m ) g^{k}\equiv x\pmod m gkx(modm)

时,有

Ind g x ≡ k ( m o d ϕ ( m ) ) \text{Ind}_gx\equiv k\pmod{\phi(m)} Indgxk(modϕ(m))

而且能保证 ∀ x ∈ [ 1 , m − 1 ] \forall x\in[1,m-1] x[1,m1],都存在 k ∈ [ 1 , m − 1 ] k\in[1,m-1] k[1,m1]使得 g k = x g^k=x gk=x

证明

∃ x ∈ [ 1 , m − 1 ] \exist x\in[1,m-1] x[1,m1],不存在 k k k使得 g k = x g^k=x gk=x

∃ y ∈ [ 1 , m − 1 ] \exist y\in[1,m-1] y[1,m1],存在至少两个 k ∈ [ 1 , m − 1 ] k\in[1,m-1] k[1,m1]使得 g k = y g^k=y gk=y

设满足条件的 k k k中不同的两个为 k 1 k_1 k1 k 2 k_2 k2 k 1 < k 2 k_1<k_2 k1<k2

g k 1 ≡ g k 2 ( m o d m ) g^{k_1}\equiv g^{k_2}\pmod m gk1gk2(modm)

g k 2 − k 1 ≡ 1 ( m o d m ) g^{k_2-k_1}\equiv 1\pmod m gk2k11(modm)

所以 g g g不为 m m m的原根,矛盾

由此即可得证

离散对数的性质

离散对数的性质与对数函数的性质相似

Ind g ( x y ) = Ind g ( x ) + Ind g ( y ) ( m o d ϕ ( m ) ) \text{Ind}_g(xy)=\text{Ind}_g(x)+\text{Ind}_g(y)\pmod{\phi(m)} Indg(xy)=Indg(x)+Indg(y)(modϕ(m))

Ind g ( x y ) = y ⋅ Ind g ( x ) ( m o d ϕ ( m ) ) \text{Ind}_g(x^y)=y\cdot \text{Ind}_g(x)\pmod{\phi(m)} Indg(xy)=yIndg(x)(modϕ(m))

离散对数的作用

可以将模 m m m意义下的乘法转换为模 ϕ ( m ) \phi(m) ϕ(m)意义下的加法,从而更方便地解决问题。

code

int find(int e){for(int i=2;i<=e;i++){for(int j=1,l=i;j<=e;j++,l=l*i%e){if(l==1){if(j==e-1) return i;break;}}}
}//找原根
void init(){int gt=find(m);for(int i=0,l=1;i<m-1;i++){ind[l]=i;l=l*gt%m;}
}//求离散对数

http://www.ppmy.cn/news/67283.html

相关文章

《c++ primer笔记》第十四章 重载运算与类型转换

文章目录 一、基本概念二、输入和输出运算符2.1重载输出运算符<<2.2重载输入运算符>> 三、算术和关系运算符四、赋值运算符五、下标运算符六、递增和递减运算符七、成员访问运算符八、函数调用运算符8.1lamba函数对象8.2标准库定义的函数对象8.3可调用对象与functi…

安装nvm,解决访问raw.githubusercontent.com出现refused拒绝连接错误

具体的错误信息如下&#xff1a; curl: (7) Failed to connect to raw.githubusercontent.com port 443: 拒绝连接 查询了一下发现是dns污染的问题&#xff0c;设置直连 vi /etc/hosts ###增加下面的解析 199.232.68.133 raw.githubusercontent.com 199.232.68.133 user-ima…

android使用MediaPlayer播放raw目录下的mp3

使用android自带的 MediaPlayer 播放 mp3 时&#xff0c;需要注意的几个点&#xff1a; 1. 使用&#xff1a; ——>初始化&#xff1a; MediaPlayer mediaPlayer MediaPlayer.create(this, R.raw.example_song); ——>播放: mediaPlayer.start(); ——>释放&am…

跑在笔记本里的大语言模型 - GPT4All

何为GPT4All GPT4All 官网给自己的定义是&#xff1a;一款免费使用、本地运行、隐私感知的聊天机器人&#xff0c;无需GPU或互联网。 从官网可以得知其主要特点是&#xff1a; 本地运行&#xff08;可包装成自主知识产权&#x1f436;&#xff09;无需GPU&#xff08;穷人适配…

KubeKey

KubeKey 是一个开源的 Kubernetes 集群自动化部署工具&#xff0c;它可以帮助用户快速、可靠地部署 Kubernetes 集群。KubeKey 支持多种部署场景&#xff0c;包括单节点、多节点、高可用、离线等。可以在 Linux、macOS 和 Windows 等操作系统上使用。 KubeKey 的主要特点包括&…

SoringBoot——pom文件:starter

先来看一看&#xff1a; 这次我们来介绍SpringBoot的pom文件的另一个好玩的地方&#xff1a;starter。 starter的中文含义是启动器&#xff0c;所以有时候我们在Maven仓库找依赖的时候&#xff0c;如果开启了自动翻译就会经常会看见一个奇怪的词叫做某某弹簧启动器&#xff0…

支付系统设计二:统一开发框架

文章目录 前言一、项目分层二、模块职责简介1. API层2. Service层2.1 操作执行服务2.2 操作器2.3 操作执行器2.4 参数校验2.5 操作器实现 3. Domain层4. Infrastructure层4.1 Dal层 三、对应类图四、开发内容3.1 约定请求报文格式3.2 新增交易码与操作器映射枚举类3.3 配置参数…

浅尝Kubernetes

第一节 内容编排与Kubernetes 为什么要用k8s 集群环境容器部署的困境&#xff0c;假设我们有数十台服务器。分别部署Nginx&#xff0c;redis&#xff0c;mysql&#xff0c;业务服务。如何合理的分配这些资源。这里就需要用到容器编排 容器编排 在实际集群环境下&#xff0…