乘法逆元一

乘法逆元一乘法逆元一导入 分数取模考虑一个式子 x equiv dfrac 1 2 mod 7 即求一个数 x 它与 dfrac 1 2 模 7 的结果相同 称为 x 与 dfrac 1 2 对模 7 同余 分数取模不同于整数取模 但我们仍可以利用模运算的性质解决此题 模运算时两边同乘相同的数 两边仍然同余 所以将两边同乘

乘法逆元一

导入:分数取模

考虑一个式子 \(x \equiv \dfrac{1}{2}\ (mod\ 7)\) ,即求一个数 \(x\) ,它与 \(\dfrac{1}{2}\) 模 7 的结果相同,称为 \(x\)\(\dfrac{1}{2}\) 对模 7 同余。

分数取模不同于整数取模,但我们仍可以利用模运算的性质解决此题。

模运算时两边同乘相同的数, 两边仍然同余。

所以将两边同乘 2,原式即化简为 \(2x\equiv 1\ (mod\ 7)\) ,即求解方程组 \(2x-7y = 1\)

因为 \(gcd(2,7)=1\),所以接下来使用扩展欧几里得算法就可以解决。

简述:乘法逆元的定义

如果在一个群 \(G\) 中,对于一个数 \(b\) , 存在乘法逆元且为 \(x\) , 那么就有 \(bx=xb=e\) ,其中 \(e\) 为群 \(G\) 的单位元。

对于单位元 \(e\) 我们有 \(eb=be=b\)

定义太多不看版:

就是说如果 \(x\) 是数 \(b\) 的乘法逆元,那么 \(a*b*x=a\)

考虑有理数域(理解为全体有理数构成的集合,所有选择的数都是里面的),对于一个数 \(b\) ,它的逆元就是 \(\dfrac{1}{b}\) (注意这里不是模运算意义下的逆元),而这里的单位元就是数字 1.

主线:模运算意义下的乘法逆元

首先,我们假设模数为一个质数,记为 \(p\) 。(模数为质数这个条件非常重要,在求解乘法逆元时我们会看到)

然后,接下来的讨论,我们都是在模意义下。(注意,之后的单个字母,表示的都是整数)

那么,我们定义一个数 \(b\) 的乘法逆元为\(x\) ,当且仅当 \(bx\equiv1\ (mod\ p)\)

为什么会这么定义呢?

显然,我们有 \(a*b*x\equiv a\ (mod\ p)\) ,这不就是乘法逆元的定义吗,只不过是在模运算下的。

这样有什么用呢?

考虑式 \(x\equiv \dfrac{1}{b}\ (mod\ p)\)

两边同乘 \(a\) ,得到 \(ax\equiv \dfrac{a}{b}\ (mod\ p)\)

…对比一下分数取模中的式子,是不是感觉有点熟悉…

最简单的,我们发现了,数 \(b\) 的乘法逆元 \(x\) ,在模意义下,同余于 \(\dfrac{1}{b}\) ,即前文的 \(x\equiv \dfrac{1}{b} \ (mod\ p)\)

进一步,我们发现,这样就可以清楚地定义分数取模的解决方法了。

对于式子 \(c\equiv \dfrac{a}{b}\ (mod\ p)\) ,我们只需要计算 \(b\) 的乘法逆元 \(x\) ,那么原式就可以化简为 \(c\equiv ax\ (mod\ p)\)

前行:关于乘法逆元的求解

如果模数 \(p\) 为质数

首先,根据费马小定理,我们有 \(b^{p-1}\equiv 1\ (mod\ p)\)

…显然,数 \(b\) 的逆元即为 \(b^{p-2}\)

如果 \(p\) 不为质数呢

费马小定理只适用于 \(p\) 为质数的情况,但是,我们有更通用的算法,欧拉定理。

如果 \(p\)\(b\) 互质,那么我们就可以使用欧拉定理来求解。

欧拉定理的表示如下 \(b^{\varphi(p)-1}\equiv1\ (mod\ p)\)

其中 \(\varphi(x)\) 定义为 1 到 \(x\) 之间与 \(x\) 互质的数的个数。

当然,也可以使用扩展欧几里得算法。

那么,如果 \(p\)\(b\) 不互质呢?

往下看。

深入:关于模意义下乘法逆元更深层的一些讨论

1. 模逆元的存在性:当 \(p\)\(b\) 不互质时,模意义下的乘法逆元,不存在

我们回顾一下乘法逆元的定义:我们定义一个数 \(b\) 的乘法逆元为\(x\) ,当且仅当 \(bx\equiv1\ (mod\ p)\)

我们改写一下这个式子: \((kr)*x -1=cr\) ,其中 \(r=gcd(p,b)\neq 1\)\(kr=b\)\(cr=q*p\) ( \(p\) 的某个倍数)

..好了,已经可以发现 \(kr*x\)\(cr\) 都为 \(r\) 的倍数,但是因为 \(r\neq1\) ,所以 \(1\) 不为 \(r\) 的倍数。

这说明等式不成立,即乘法逆元不存在。

2.模逆元 \(x\) 一定为整数吗

首先,模逆元定义为 \(x\) 整数。

其次,定义为分数并没有解决问题,比如我有 \(b*\dfrac{1}{b}\equiv1\ (mod\ p)\)

可以知道的是,模运算对于加减乘三种运算具有很好的性质,但是对于除法却不是很好,所以我们是要将除法化为乘法。

3.在OI中的应用

我们知道,在OI中,通常数据是有限制的,此时出题人一般会给你一个模数 \(p\)

比如计数类问题,还有分数需要保持精度的问题。

而模运算将除法变成乘法后,就可以有效利用乘法在模运算中的性质,举例:

我们要计算 \(\dfrac{a}{b}\ mod\ p\) ,就可以化为 \(((a\ mod\ p)*(x\ mod\ p))\ mod\ p\) ,其中 \(x\)\(a\) 的逆元。

这样就可以大幅度降低数据大小,同时保证除法的精度。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233109.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ringbuffer原理_hashset数据结构

    ringbuffer原理_hashset数据结构本篇介绍一种简单高效的数据缓存结构:RingBuffer,这种结构实现起来只需要几行代码即可,但使用场景却很广泛,比如在Linux内核中网络数据包的缓存,系统日志的存储等多处使用过该结构。同时它也被广泛的应用于异步通信以及嵌入式设备中,提供高效的数据缓存读写操作。1.实现原理RingBufferr实现比较简单,基本上只需要一个数组结构,外加两个用于存储位置信息的变量即可。其中的数组采用固定大小容量,便于重用内存,不会出现动态内存不断分配和销毁的情况,这对于一些GC类编程语言来说,大…

    2022年9月10日
    2
  • WindowManager.LayoutParams.FLAG_SECURE_congestion window

    WindowManager.LayoutParams.FLAG_SECURE_congestion windowpublicstaticclassWindowManager.LayoutParamsextends ViewGroup.LayoutParamsimplements Parcelablejava.lang.Object   ?android.view.ViewGroup.LayoutParams    ?

    2022年9月21日
    2
  • idea中关闭eslint[通俗易懂]

    idea中关闭eslint[通俗易懂]file->setting搜索eslint将Enable选项勾选掉

    2022年6月3日
    100
  • 用Pyinstaller打包时遇到No module named win32timezone问题

    用Pyinstaller打包时遇到No module named win32timezone问题用Pyinstaller打包时遇到Nomodulenamedwin32timezone问题Pyinstaller使用方法我遇到的问题解决办法利用tkinter+python+pyinstaller实现了小工具的项目,没有pyinstaller打包时程序没有问题,打包后运行.exe过程中会在控制台打印错误。Pyinstaller使用方法我们对Markdown编辑器进行了一些功能拓展与语法…

    2025年7月7日
    1
  • 使用 Java DB (Derby) 数据库

    使用 Java DB (Derby) 数据库使用JavaDB(Derby)数据库https://netbeans.org/kb/docs/ide/java-db_zh_CN.html本文档说明了如何在NetBeansIDE中设置与JavaDB数据库的连接。在建立连接之后,即可开始在IDE中使用该数据库,您可以执行的操作包括创建表、用数据填充表、运行SQL语句和查询等。…

    2022年7月8日
    23
  • pycharm导入模块变灰_pycharm新建项目灰色

    pycharm导入模块变灰_pycharm新建项目灰色@PyCharmPyCharmimport导入包变灰是因为还没有用到。

    2022年8月27日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号