知识点:乘法逆元
创始人
2024-06-01 15:21:43
0次

乘法逆元

文章目录

  • 乘法逆元
    • 一、模运算的性质
    • 二、除法的模运算
      • 1、除法模运算
      • 2、解决除法模运算问题
    • 三、乘法逆元
      • 1、定义
      • 2、**逆元是干什么的呢**
    • 四、求解逆元
        • 1、费马小定理
        • 2、扩展欧几里得
    • 五、参考文献

一、模运算的性质

  • ( a + b ) % p = ( a % p + b % p) % p
  • ( a + b ) % p =( ( a % p + b % p ) % p + p ) % p

注意:此处与上一个不一样,(9-7)%8=(9%8-7%8)%8=-6 ;不是我们要的值,这时要加上p

  • ( a * b ) % p = ( ( a % p ) * ( b % p ) ) % p

二、除法的模运算

1、除法模运算

​ (a/b)%p=(a%p)/(b%p) ,如果我们保证可以整除,它是否成立呢?

取a=8,b=2,p=6; 左式=4,右式=1;也就是说 除法的模运算不一定成立。

2、解决除法模运算问题

​ 能否将除法转化为乘法?找到 binv ,使得 (a/b)%p==(a∗binv)%p(a/b)\%p==(a*b_{inv})\%p(a/b)%p==(a∗binv​)%p ;若能,则称 binvb_{inv}binv​为 b在模p意义下 的乘法逆元 ;

三、乘法逆元

1、定义

​ 若在mod p意义下,对于一个整数a,有(a∗b)(a*b)%p=1(a∗b),那么这个整数b即为a的 乘法逆元,同时a也为b的乘法逆元。一个数有逆元的充分必要条件是gcd(a,p)=1,此时a才有对p的乘法逆元。

2、逆元是干什么的呢

​ 首先对于除法取模不成立,即$ (a/b)%p!=(a%p)/(b%p)$。显然数学家们是不能忍受这种局面的,他们扔出了“逆元”来解决这个问题。因为取模运算对于乘法来说是成立的,逆元就是把除法取模运算转化为乘法取模运算。
(a/b)%p=m(1)(a×x)%p=m(2)(a/b)\%p=m (1)\\ (a \times x)\%p=m (2) (a/b)%p=m(1)(a×x)%p=m(2)
(1)模运算对乘法成立,对①式左右两边同时乘以b,得到
a%p=(m×b)%pa\%p=(m \times b)\%p a%p=(m×b)%p
(2)如果a和b均小于模数p的话,上式得到:
a=m×ba = m \times b a=m×b
(3)等式两边同时乘以xxx,联立②式得到:
(a×x)%p=m%p=(m×b×x)%p(b×x)%p=1(a \times x)\%p = m\%p=(m \times b \times x )\%p \\ (b \times x)\%p = 1 (a×x)%p=m%p=(m×b×x)%p(b×x)%p=1
即x就是b的逆元。(根据逆元的定义可知)总结:求取(a/b)(a/b)%p(a/b)等同于求取a×(b的逆元)a \times (b的逆元)%pa×(b的逆元),因此,求模运算的除法问题就转化为求解一个数的逆元问题。

四、求解逆元

求解一个数的逆元有两种方法:费马定理和扩展欧几里得

1、费马小定理

因为在算法竞赛中模数p总是质数,所以可以使用费马小定理。
bp−1%p=1b^{p-1}\%p=1 bp−1%p=1
可以得到b×bp−2%=1b \times b^{p-2}\%=1b×bp−2%=1,所以bp−2b^{p-2}bp−2是b在mod p条件下的逆元。

public class PowUtil {public static Long quickPow(Long a,Long n,Long p){//结果Long res = 1L;while (n != 0) {//判断 n 的二进制的最后一位是否为0if((n&1)!=0){//当n的二进制最后一位为1时,乘以当前的权重res = (res*a)%p;}//更新n,每次n向右移一位n = n >> 1;//更新每一位的权重a = (a*a)%p;}return res;}}public class InverseElement {/*** 利用b^(n-1)%p=1求解b的逆元* @param a 质数* @param p 模数* @return a的逆元*/public static Long inverseElement(Long a,Long p){//quickPow()是快速幂函数return PowUtil.quickPow(a,p-2,p);}}

2、扩展欧几里得

(1)扩展欧几里得算法:求ax+by=gcd(a,b)的一组x,y

(2)求a在模p意义下的乘法逆元:
(a×ainv)%p=1a×ainv+p×y=1gad(a,p)=1(a \times a_{inv})\%p=1 \\ a \times a_{inv} + p \times y = 1\\ gad(a,p)=1 (a×ainv​)%p=1a×ainv​+p×y=1gad(a,p)=1

代码展示

void exgcd(ll a, ll b, ll &x, ll &y)    //拓展欧几里得算法
{if(!b) x = 1, y = 0;else{exgcd(b, a % b, y, x);y -= x * (a / b);}
}ll niyuan(ll a, ll b)   //求a对b取模的逆元
{ll x, y;exgcd(a, b, x, y);return (x + b) % b;
}



五、参考文献

[1] 乘法逆元超详解

[2]乘法逆元

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...