zoukankan      html  css  js  c++  java
  • 逆元

    我们需要考虑如何求解线性方程axb(mod m)。对于实数运算下的方程ax=b我们既然已经知道了a的倒数,那我们可以直接通过a的倒数乘b求得方程的解,如果在(mod m)的运算下,也有类似于a的倒数一样的数存在,方程就可以解了。如果存在ay1(mod m)我们把这样的数y叫做a的逆元,记作a-1。如果能求解逆元,那么就有x=a-1*xa=a-1*b这样也就求出x了,由于方程ax1(mod m)等价于存在整数k使得ax=1+mk,因此可以推出ax-mk=1x的问题,所以我们可以用扩展欧几里得算法extgcd(已在前文中说过),同时也可以知道如果gcd(a,m)!=1,逆元是不存在的。

    伪代码如下:

    int mod_inverse(int a,int m){

    int x,y;

    extgcd(a,m,x,y);

    return (m+x%m)%m;

    }

    如果am不互质那么axb(mod m)就等价于(a/gcd(a,m))x(b/gcd(a,m))(mod m/gcd(a,m))

    不难看出,如果b不含有gcd(a,m)时方程无解,在有解的情况下,我们有

    x(a/gcd(a,m))-1*(b/gcd(a,m))(mod m/gcd(a,m))

    所以,原方程的解为x(a/gcd(a,m))-1×(b/gcd(a,m))+(m/gcd(a,m))×k(mod m)

    求逆元的话除了这种“定义法”,还可以用欧拉定理和费马小定理来求解

  • 相关阅读:
    springboot整合swagger2
    关于lombok
    RSA加密和AES加密
    守护进程监控tomcat并自启
    java按照目录结构压缩文件夹以及文件夹内内容
    wxx
    附加作业
    软工作业3
    软工作业2
    软工作业一 201621123070陈伟杰
  • 原文地址:https://www.cnblogs.com/543Studio/p/5162332.html
Copyright © 2011-2022 走看看