乘法逆元之欧几里得和扩展欧几里得
创始人
2025-05-30 21:34:21
0

乘法逆元

文章目录

  • 乘法逆元
    • 一、模运算的性质
    • 二、除法的模运算
      • 1、除法模运算
      • 2、解决除法模运算问题
    • 三、乘法逆元
      • 1、定义
      • 2、**逆元是干什么的呢**
    • 四、求解逆元
        • 1、费马小定理
        • 2、扩展欧几里得(exgcd)
          • (1)裴蜀定理
          • (2)exgcd
          • (3)ax≡1(modn)ax\equiv 1(mod\qquad n)ax≡1(modn)
    • 五、参考文献

一、模运算的性质

  • ( 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)%p=1(b \times b^{p-2})\% p=1(b×bp−2)%p=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、扩展欧几里得(exgcd)

(1)裴蜀定理

​ 若a,b是整数,且gcd(a,b)=d,那么对于任意的整数x,y,ax+by都一定是d的倍数,特别地,一定存在整数x,y,使ax+by=d成立。它的一个重要推论是:a,b互质的充分必要条件是存在整数x,y使ax+by=1.

(2)exgcd

ax+by=d=gcd(a,b)=gcd(b,a%b)=bx0+(a%b)y0因为a%b=a−ab×b所以ax+by=bx0+a%by0=bx0+(a−a/b∗b)y0=bx0+ay0−a/b∗y0∗b=ay0+b(x0−a/b∗y0)(1)由(1)得出:x=y0,y=x0−(a/b)∗y0\begin{aligned} % requires amsmath; align* for no eq. number ax+by& =d \\& =gcd(a,b)=gcd(b,a\%b)\\ & = bx_0+(a\%b)y_0\\ 因为a\%b& = a-\frac{a}{b}\times b\\ 所以ax+by&=bx_0+a\%by_0\\ &=bx_0+(a-a/b*b)y_0\\ &=bx_0+ay_0-a/b*y_0*b\\ &=ay_0+b(x_0-a/b*y_0)&(1)\\ 由(1)得出:x&=y_0,y=x_0-(a/b)*y_0 \end{aligned} ax+by因为a%b所以ax+by由(1)得出:x​=d=gcd(a,b)=gcd(b,a%b)=bx0​+(a%b)y0​=a−ba​×b=bx0​+a%by0​=bx0​+(a−a/b∗b)y0​=bx0​+ay0​−a/b∗y0​∗b=ay0​+b(x0​−a/b∗y0​)=y0​,y=x0​−(a/b)∗y0​​(1)​

C++:

//第一种写法
ll Exgcd1(ll a, ll b, ll &x, ll &y) {if (!b) {x = 1;y = 0;return a;}ll d = Exgcd(b, a % b, x, y);ll t = x;x = y;y = t - (a / b) * y;return d;
}//第二种写法
ll Exgcd2(ll a, ll b, ll &x, ll &y) {if (!b) {x = 1;y = 0;return a;}ll d = Exgcd(b, a % b, y, x);y = y - (a / b) * x;return d;
}ll niyuan(ll a, ll b)   //求a对b取模的逆元
{ll x, y;exgcd(a, b, x, y);return (x + b) % b;
}

Java:

  • 前提条件求ax=1(modmod)ax=1(mod\qquad mod)ax=1(modmod),且aaa和modmodmod互质
public class exgcd {//扩展欧几里得算法public static long x,y; //(d*e)%(p-1)(q-1)=1//ax + my = 1(mod m)public void exgcd(long a,long b){if (b==0) {x = 1;y = 0;return;}exgcd(b,a%b);long xx = x;x = y;y = xx - (a/b)*y;}
}

​ 欧几里得算法只能求解最大公因数,但是扩展的欧几里得算法既可以求出最大公因数,还可以求出ax+by=gcd(a,b)ax+by=gcd(a,b)ax+by=gcd(a,b) 的通解 xxx 和 yyy 。

​ 求解形如 a∗x+b∗y=ca*x +b*y = ca∗x+b∗y=c 的通解,但是一般没有谁会无聊到让你写出一串通解出来,都是让你在通解中选出一些特殊的解,比如一个数对于另一个数的乘法逆元。

​ 分析:

  • gcd函数与exgcd函数相比,只是增加了求解x,y的步骤,其余的没变;

  • a∗x+b∗y=ca*x + b*y = ca∗x+b∗y=c 有解的充要条件:c%gcd(a,b)==0c\% gcd ( a , b )==0c%gcd(a,b)==0。

  • 求 exgcd(a,b,x,y)exgcd(a,b,x,y)exgcd(a,b,x,y) —>利用欧几里得算法不断递归直到x=1,y=0x=1,y=0x=1,y=0—>反向递归求出第一层的 xxx 和 yyy,xxx即为 eee 模 mmm 的逆元。

(3)ax≡1(modn)ax\equiv 1(mod\qquad n)ax≡1(modn)

​ 求解a∗x=1(modm)a*x =1(mod \qquad m)a∗x=1(modm)中的 xxx ?

​ 这里,我们称 xxx 是 aaa 关于 mmm 的乘法逆元。可以等价于这样的表达式: a∗x+m∗y=1a*x + m*y = 1a∗x+m∗y=1,当gcd(a,m)!=1gcd(a , m) != 1gcd(a,m)!=1 的时候是没有解,这也是 a∗x+b∗y=ca*x + b*y = ca∗x+b∗y=c 有解的充要条件:c%gcd(a,b)==0c\%gcd(a,b)==0c%gcd(a,b)==0。

​ 利用 exgcd(a,b,x,y)exgcd(a,b,x,y)exgcd(a,b,x,y) 求解 xxx 和 yyy ,然后 (x+m)(x+m)%m(x+m) 就是所求结果了。

典型例题:第十届蓝桥杯省赛Java研究生组:试题E:RSA解密


五、参考文献

[1] 乘法逆元超详解

[2]乘法逆元

[3]exgcd知识完善

[4]扩展欧几里得算法(求逆元)总结

[5]拓展欧几里得定理的应用

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWR报告解读 WORKLOAD REPOSITORY PDB report (PDB snapshots) AW...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
群晖外网访问终极解决方法:IP... 写在前面的话 受够了群晖的quickconnet的小水管了,急需一个新的解决方法&#x...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
Azure构建流程(Power... 这可能是由于配置错误导致的问题。请检查构建流程任务中的“发布构建制品”步骤,确保正确配置了“Arti...