[pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=60802734

1 离散对数

离散对数定义

大步小步走

2 元根

一些概念

阶和元根

例题

1离散对数

定义

给定a,b,m,其中a与m互素,求最小的非负(正)整数x,使得:

a^x≡b (mod m)

我们称x为模m意义下,以a为底的b的离散对数,记作ind a b。

那么,给出a,b,m,(假设a与m互素)如何求x?

大步小步走

这有一个技巧:显然,任何数x都可以分解为 x=i*c+j(i,j为正整数,c为某固定数)

我们先在[2,m-1]内选一个数c,计算出:a^0,a^1,a^2,a^3,……,a^c-1

如果发现其中某个值是b,就找到答案了

如果没有,我们将已计算出的值放入数据结构中(平衡二叉树(map),哈希表都可以),以便快速通过a^i的值得到i。然后再依次计算出:

b*a^-c, b*a^-2c, … , b*a^-kc

每算完一个b*a^-c,我们就看数据结构中是否有一个值a^j等于它,如果有,那么它们满足:

a^j≡b*a^-ic (mod m)

易证等价于:

a^(ic+j)≡b (mod m)

分析复杂度:如果我们上面用哈希表存,那么可以o(1)判断某个值是否存在。

那么我们总共需要计算的个数是o(b+m/b),我们取b=√m,可以得到o(√m)的复杂度。

注意:上面的方法不限于整数,还可以是矩阵,但都要求a存在逆元。

意义

想想平时数学课上的log,我们是怎么灵活运用的?

ind可以看做是模意义下的log。在一些换底的运用中还是很重要的。

2元根

一些概念

剩余系:

对于给定模数m(m>0),如果有一组数{ai}:a1,a2,a3,…,am 对于任何数a,存在唯一数ai满足:a≡ai (mod m) ,那么我们将{ai}称作模m的一组完全剩余系

(好吧,这是学长讲稿上的定义,我仍然理解不了。。。)

既约剩余系:对于给定模数m(m>0),如果有一组数{ai}:a1,a2,a3,…,ak 满足:gcd(ai,m)=1且对于任何和m互质的数a,有唯一的ai满足:a≡ai(mod m) 那么我们将{ai}称作模m的一组既约剩余系,也叫做缩系。

容易看出,这概念像极了欧拉函数。模m的既约剩余系的个数记作φ(m)

阶和元根

阶:

给定一个与m互素的a,则最小的一个满足:a^r≡1 (mod m) 的正整数r叫做a模m的阶,一般记作 r=δm(a)

显然,r可以用离散对数求出。

元根:

对于模数m,如果存在一个数g,满足:δm(g)=φ(m) 我们则称g为模m的一个元根

那么元根有什么用呢?

我们先从定义的本质去理解一下:

1、阶是什么?“最小的r“,再大一点,a^r模m的值就会出现循环,直到a^2r≡1(mod m)

一组数据模拟一下:7^r(mod 9)

r : 1 2 3 4 5 6 7

ans:7 4 1 7 4 1 7

由此可见,r=3是阶,而过了之后就是循环

2、元根相对于阶有什么特殊的地方? g^φ(m)≡1 (mod m) 结合上面的结论,即φ(m)次方后就是循环,即g^r≡a (mod m)的a有φ(m)个不同的。因为g与m是互质的,所以所有的”a”都与m互质。我们发现这一组不同的”a”就是m的缩系。

在明白了上面两点后,我们就发现了元根的作用了:

对于任意一个缩系中的元素,都与一个g^i这种形式对应起来。假如我们找到了一个模m的元根g,想求其缩系中的某元素a对应的指数是什么,我们就可以用离散对数找到满足:g^i≡a (mod m) 的i。(还理解不清楚的,后面的例题可能会有些帮助)(讲道理我也没太清楚,题做少了。。。)

那么怎么求元根呢?

先明确几点:

1、不是所有数都有元根。只有形如: 1,2,4,p^a,2p^a 的数存在元根(其中 a>=1 且p 是奇素数).

2、在109 范围内的所有素数的最小的元根都很小(最大的不过一百多)

然后就可以暴力枚举,判断是否是元根

如何判断呢?

如果存在正数a,b,m, 且gcd(a,m) = 1, 满足

a^b≡1 (mod m)

那么有: δm(a) | b

通过上面这个定理可以证明:

对于给定的与m>=2 互素的一个数g, g 是m 的一个元根当且仅当对于φ(m) 的所有素因子pi , 有:g^(φ(m)/pi)≡/(不同余)1 (mod m)

复杂度小于o(log)

例题

例1

给你a,b,m, 都是正整数, 其中m 是素数, 求:

a^x≡b (mod m)

其中:2<=m<=2*10^9,1<=a,b < m

很容易离散对数就可以秒了对不对

例2

给你a1,b1,a2,b2,m, 都是正整数, 其中m 是素数, 求满足下面条件的x:

ai^x≡bi (mod m) (i =1,2)

其中:2<=m<=2*10^9 且1<=ai,bi < m.

先找到m 的一个元根, 然后找到ai 和bi 的离散对数:

g^ci≡ai (mod m)

g^di≡bi (mod m)

然后就把问题化简成了:

g^(x*ci)≡g^di (mod m)

因为g 是模m 的元根, 所以上面的方程等价于:

x*ci≡di (mod m-1)

从而把问题转化为解一元一次同余方程组的问题.

例3

给你三个正整数a,b,m, 其中m 是质数, 求x 满足:

x^a≡b (mod m)

其中:1<=x,b < m

找到元根进行替换: g^(x*a)≡g^b (mod m),就可以转化为 x*a≡b(mod m-1) ,就很容易啦

嘛,就这么结束吧。(本来还有反演的,人太懒就不写了吧)

数论day2——离散对数、元根的更多相关文章

  1. 51Nod 1135:元根(数论)

    1135 原根  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 设m是正整数,a是整数,若a模m的阶等于φ(m),则称a为模m的一个原根.(其中φ(m) ...

  2. 【BZOJ3601】一个人的数论 高斯消元+莫比乌斯反演

    [BZOJ3601]一个人的数论 题解:本题的做法还是很神的~ 那么g(n)如何求呢?显然它的常数项=0,我们可以用待定系数法,将n=1...d+1的情况代入式子中解方程,有d+1个方程和d+1个未知 ...

  3. BZOJ3601 一个人的数论 【数论 + 高斯消元】

    题目链接 BZOJ3601 题解 挺神的 首先有 \[ \begin{aligned} f(n) &= \sum\limits_{x = 1}^{n} x^{d} [(x,n) = 1] \\ ...

  4. HDU 5833 Zhu and 772002 (数论+高斯消元)

    题目链接 题意:给定n个数,这n个数的素因子值不超过2000,从中取任意个数使其乘积为完全平方数,问有多少种取法. 题解:开始用素筛枚举写了半天TLE了,后来队友说高斯消元才想起来,果断用模板.赛后又 ...

  5. CH Round #49 - Streaming #4 (NOIP模拟赛Day2)

    A.二叉树的的根 题目:http://www.contesthunter.org/contest/CH%20Round%20%2349%20-%20Streaming%20%234%20(NOIP 模 ...

  6. sgu 261

    学习了元根的一些知识,哈哈. 总结一下: 几个概念: 阶:对于模数m和整数a,并且gcd(m,a)==1,那么定义a在模m下的阶r为满足ar=1 mod m的最小正整数. 性质1:r in [1,ph ...

  7. 【HDU1402】【FNT版】A * B Problem Plus

    Problem Description Calculate A * B.   Input Each line will contain two integers A and B. Process to ...

  8. Https握手协议以及证书认证

    1. 什么是https Https = http + 加密 + 认证 https是对http的安全强化,在http的基础上引入了加密和认证过程.通过加密和认证构建一条安全的传输通道.所以https可以 ...

  9. 【密码学】Https握手协议以及证书认证

    1. 什么是https Https = http + 加密 + 认证 https是对http的安全强化,在http的基础上引入了加密和认证过程.通过加密和认证构建一条安全的传输通道.所以https可以 ...

随机推荐

  1. Linux静态ip设置及一些网络设置

    网络服务配置文件 /etc/sysconfig/network 网络接口配置文件 /etc/sysconfig/network-scripts/ifcfg-INTERFACE_NAME 修改IP永久生 ...

  2. SPOJ 362 Ignore the Garbage 转7进制+简单大数除法

    显然正着倒着看仍然是数字的只有7个数:0,1,2,5,6,8,9 所以就是用这7个数组合成不同的数. 将n转换成7进制,对应位输出即可. #include <cstdio> #includ ...

  3. java语言基础第二讲 课程作业02 总结

    一.编程的好习惯 1.注释习惯.单行注释://,  多行注释:/*   */ . 2.程序中添加适当的空白:4个空格. 3.文件名必须与公有类名一致,即public class 类名. 4.java中 ...

  4. Nginx出现500错误解决办法

    查看错误日志D:\nginx\logs\error.log 得知:Nginx配置文件中会将路径中的 \t 默认转义成 空格 改为双斜杠就可以了

  5. JAVA 基础开发环境 vscode 搭建 Windows下VSCode编译运行简单java

    JAVA 基础开发环境 vscode 搭建 来源 https://www.cnblogs.com/freewsf/p/7744728.html 对于使用 Visual Studio Code 的 Ja ...

  6. GYM - 101620 J.Justified Jungle

    题意: 给出一棵树,删掉其中一些边,要求生成的每个子树节点数一样.输出所有可以删掉的边数. 题解: 以节点1为根,预处理每个子树的大小.对于每个n的因数x,还需满足子树为他倍数的点够n/x个,那么删的 ...

  7. BZOJ1233 [Usaco2009Open]干草堆tower 【单调队列优化dp】

    题目链接 BZOJ1233 题解 有一个贪心策略:同样的干草集合,底长小的一定不比底长大的矮 设\(f[i]\)表示\(i...N\)形成的干草堆的最小底长,同时用\(g[i]\)记录此时的高度 那么 ...

  8. 《R语言实战》读书笔记 第七章--基本统计分析

    在导入数据并且将数据进行组织和初步可视化以后,需要对数据进行分布探索和两两关系分析等.主要内容有描述性统计分析.频数表和列联表.相关系数和协方差.t检验.非参数统计. 7.1描述性统计分析 7.1.1 ...

  9. C中堆和栈的区别

    C++中堆和栈的完全解析 内存分配方面: 堆: 操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删 除,并 ...

  10. openstack内外网ip实现

    类似于阿里云ECS主机的内外网(双网卡不通网段)的结构,最终实现内外网区分隔离. https://www.aliyun.com/product/ecs/?utm_medium=text&utm ...