苍茫大地一剑尽挽破,何处繁华笙歌落。斜倚云端千壶掩寂寞,纵使他人空笑我。

逆元的概念,类似于倒数的性质。

通过上面的引例我们可以粘贴到两个定义:

  1. 单位元:存在一个集合中的元素【e】,使得给定任意一个集合中的元素a,均有a⊙e=e⊙a=a;
  2. 逆元:给定任意一个集合中的元素a,存在集合中的另一个元素b,使得a⊙b=b⊙a=e;

那么接下来引入另一个概念啦:

乘法逆元(在维基百科中也叫倒数,当然是 mod p后的,其实就是倒数不是吗?):

如果ax≡1 (mod p),且gcd(a,p)=1(a与p互质),则称a关于模p的乘法逆元为x。

注意:只有a和p互质的时候,a才有关于p的逆元,所以当有多个p和a互质时,所求的a关于p的逆元也是不同的。

a*x ≡ 1 (mod p)  其中x 叫做 a的关于p的逆元,记为:inv(a) = x

所以a * inv(a) ≡ 1 (mod p)

举个栗子:

若a*x = 1那么x是a的倒数,x = 1/a

但是a如果不是1,那么x就是小数

那数论中,大部分情况都有求余,所以现在问题变了

a*x ≡ 1 (mod p)

那么x一定等于1/a吗?

不一定的!

所以这时候,我们就把x看成a的倒数,只不过加了一个求余条件,所以x叫做    a关于p的逆元

比如2 * 3 % 5 = 1,那么3就是2关于5的逆元,或者说2和3关于5互为逆元

这里3的效果是不是跟1/2的效果一样?所以才叫数论倒数嘛。

所以上面的除法取余改写为:(a  /  b) % p =  (a * inv(b) ) % p = (a % p * inv(b) % p) % p。

所以我们把错误的除法模运算规则改为了正确的乘法模运算规则了?

说了那么多,究竟怎么求逆元呢?学长给我们讲了两种方法。

  1. 费马小定理

首先再次粘贴一个定理,费马小定理:

费马小定理(Fermat's little theorem)是数论中的一个重要定理,在1636年提出,其内容为: 假如p是质数,且gcd(a,p)=1,那么 a(p-1)≡1(mod p),即:假如a是整数,p是质数,且a,p互质(即两者只有一个公约数1),那么a的(p-1)次方除以p的余数恒等于1。

定理内容简单来说就是:a^(p-1) ≡1 (mod p)

求逆元:两边同除以a 得到 a^(p-2) ≡1/a (mod p)

什么(,,• ₃ •,,),这可是数论,还敢写1/a 应该是a^(p-2) ≡ inv(a) (mod p)

所以inv(a) = a^(p-2) (mod p).

得到公式:inv(a) = a^(p-2) (mod p).

使用条件: p是质数,并且gcd(a,p) = 1.

代码:

typedef long long ll;
ll qpow(ll a,ll b,ll p)
{ll tmp = 1;a=a%p;while(b){if(1&b) tmp = tmp*a%p;a = a*a%p;b>>=1;}return tmp%p;
}
ll inv(ll a,ll p) //费马小定理求逆元
{return qpow(a,p-2,p);
}

2.扩展欧几里得

一般用来求解不定方程,求解线性同余方程,求解模的逆元等

内容:若gcd(a,b) = d,那么一定存在x,y使得 ax+by = d.

假设当前要求 gcd(a,b),并求出了一组 x 和 y 使得 ax+by=GCD(a,b)

已经求出 gcd(b,a%b) 并求出了一组 tx 和 ty 使得 b×tx+(a%b)×ty =GCD(a,b)

那么这两个相邻的状态之间是否存在某种关系呢?

ax+by=GCD=b×tx+(a%b)×ty

=b×tx+(a−⌊a/b⌋×b)×ty

=b×tx−⌊a/b⌋×b×ty+a×ty

=b×(tx−⌊a/b⌋×ty)+a×ty

所以 x=ty, y=tx−⌊a/b⌋×ty.

代码:

typedef long long ll;
ll exgcd(ll a,ll b,ll &x,ll &y)
{if(b==0){x=1;y=0;// 当b==0时,此时 x=1,y=0,gcd(a,b)=d=a;return a;}ll tx,ty;ll d= exgcd(b,a%b,tx,ty);x=ty;y=tx-(a/b)*ty;return d;
}

那么怎么由扩展欧几里得算法求逆元呢?

很简单~(如果这个词深深的伤害了你,请不要打我?)

使用条件: a,b为正整数,而且gcd(a,b) = 1

证明:

因为a,b 互质,所以一定有 ax+by = 1

两边同时对b 取余

ax%b + by %b = 1%b   ------->   ax%b = 1%b

即 ax ≡ 1 (mod b)

扩展欧几里得中x 就是a关于b的逆元

同理y 就是 b 关于 a的逆元

所以使用完欧几里得算法,我们判断返回值d 是否为1,为1说明 gcd(a,b) = 1

即求得的x就是 a关于b的逆元

void inv(ll a,ll b)
{ll x,y;if(exgcd(a,b,x,y) == 1)cout<<"inv(a):"<<x<<endl;elsecout<<"不存在逆元"<<endl;
}

数论基础----逆元 (数论中的“倒数”)相关推荐

  1. RSA加密原理详解,以及RSA中的数论基础

    文章目录 1. RSA加密算法介绍 2. RSA密钥生成 3. RSA加密和解密 4. RSA的安全性 5.涉及到的数论基础 5.1. 模的逆元 5.1.1. 扩展欧几里得算法计算模逆元 5.1.2. ...

  2. 你也可以手绘二维码(二)纠错码字算法:数论基础及伽罗瓦域GF(2^8)

    摘要:本文讲解二维码纠错码字生成使用到的数学数论基础知识,伽罗瓦域(Galois Field)GF(2^8),这是手绘二维码填格子理论基础,不想深究可以直接跳过.同时数论基础也是 Hash 算法,RS ...

  3. 数论基础,从入门到入门

    数论基础,从入门到入门 文章目录 数论基础,从入门到入门 一.常用算法 1.素数筛法 2.线性筛 3.快速幂 4.矩阵快速幂 5.辗转相除法/欧几里得算法 6.扩展欧几里得 7.中国剩余定理/CRT ...

  4. 数论基础:模奇素数的二次剩余 (1)

    注意: 本文讨论的是模奇素数的二次剩余 目前不打算写二次互反律,不易写明白 什么是二次剩余 求解模小素数的二次同余方程 求解模小素数的二次方程,只需要遍历 Zp⋆\mathbb{Z}_p^{\star ...

  5. 乘法逆元 +数论分块 +平方和公式

    年后准备学习啦,开学还得准备考试. 乘法逆元: 因为涉及到除法,所以取余这个操作就错误. 所以如果我们要求(a/b)%mod,我们可以假设 (a/b)%mod = a*c%mod 那么c就是b的逆元. ...

  6. LeetCode19. Remove Nth Node From End of List 删除链表中的倒数第n个位置的元素

    前言 本文是LeetCode19. Remove Nth Node From End of List解法,这个题目需要删除链表中的倒数第n个位置的元素 代码 # -*- coding: utf-8 - ...

  7. js 判断变量是否有值返回bool_基础 |判断 JS 中的变量类型竟然可以如此简单

    原标题:基础 |判断 JS 中的变量类型竟然可以如此简单 嗨 这里是IMWEB 一个想为更多的前端人 享知识 助发展 觅福利 有情怀有情调的公众号 欢迎关注转发 让更多的前端技友一起学习发展~ 正文 ...

  8. 在 Inno Setup 中实现倒数N秒后激活按钮

    在 Inno Setup 中实现倒数N秒后激活按钮 原文 http://restools.hanzify.org/article.asp?id=67 timectrl.dll 为一个 6.5 KB 的 ...

  9. 《程序员代码面试指南》第二章 链表问题 在单链表和双链表中删除倒数第K个节点...

    题目 在单链表和双链表中删除倒数第K个节点 java代码 /*** @Description:在单链表和双链表中删除倒数第K个节点* @Author: lizhouwei* @CreateDate: ...

  10. UA PHYS515 电磁理论I 麦克斯韦方程组基础4 介质中的麦克斯韦方程

    UA PHYS515 电磁理论I 麦克斯韦方程组基础4 介质中的麦克斯韦方程 推导介质中的麦克斯韦方程 电位移矢量与辅助磁场强度 推导介质中的麦克斯韦方程 前三讲我们介绍了真空中的麦克斯韦方程的建立, ...

最新文章

  1. HNOI2018酱油记
  2. iOS 深拷贝和浅拷贝
  3. python作业6月14日
  4. SSH整合注解版(Spring+Struts2+Hibernate)
  5. log4j配置日志文件log4j.appender.R.File相对路径方法
  6. hdu4608 暴力+大数
  7. SQL server 2008卸载后有残留及彻底卸载
  8. 关于h5页面链接分享到微信的分享样式如何修改成自定义卡片
  9. win10计算机护眼,win10系统设置护眼模式的三种方法
  10. python 时间格式处理
  11. 基督-神[上帝]的道,真理的本真归回
  12. 三国志战略版360区S4服务器合并信息,三国志战略版S3赛季哪些大区合并
  13. vue通过自定义指令 v-py 将名字转拼音
  14. 我的黑马生涯——真实黑马学员感言
  15. Java学习参考书籍
  16. 从了解Linux开始
  17. Winows注册minio为服务器
  18. JavaScript基础第六天数组
  19. 在 OneNote 2010中输入复杂的数学公式
  20. [Bzoj2733][Hnoi2012] 永无乡(BST)(Pb_ds tree)

热门文章

  1. js实现——鼠标单击事件-onclick和双击事件-ondblclick
  2. perl下载与环境安装
  3. 裸片IC的简单介绍以及裸片IC的封装设计
  4. 利用Backtrader进行期权回测之五:用backtrader_plotting查看回测结果
  5. 【MATLAB】MATLAB中format命令的用法
  6. 油猴Tampermonkey安装使用教程
  7. 操作系统与网络实现 之二十三(丙)
  8. 数据库版本管理框架-Flyway
  9. 关于/etc/hosts文件
  10. sorry, unimplemented: non-trivial designated initializers not supported