21xrx.com
2024-12-23 02:39:52 Monday
登录
文章检索 我的文章 写文章
C++中求解模逆元的原理
2023-06-22 12:52:27 深夜i     --     --
C++ 模逆元 原理

模逆元是指在模运算下,求出一个元素a的乘法逆元b,使得(a * b) % m = 1,其中m为给定的模数。在C++中,求解一个数的模逆元可以使用欧几里得算法或扩展欧几里得算法,具体原理如下:

欧几里得算法:

假设要求a在m下的逆元b,那么a和m互质时,可以通过求gcd(a, m)来得到解。如果d=gcd(a, m),那么有a * x + m * y = d,其中d一定是最大公因数,然后将该式两侧同时除以d,就可以得到一个形如a * x / d + m * y / d = 1的式子,此时因为a和m互质,所以a*x/d一定是m模下的逆元b。

扩展欧几里得算法:

当a和m不互质时,就需要使用扩展欧几里得算法。扩展欧几里得算法基于欧几里得算法,它可以在求出最大公因数的同时,求出d = a*x + m*y中的x和y,也就是求解a在m模下的逆元b。扩展欧几里得算法可以通过递归方式依次求解两个步骤:求解d = a’*x’ + m’*y’(其中a’为m模下的a,m'为a模下的m),然后根据递归深度和之前已经计算出的值来更新x和y的值。具体代码如下:


int exgcd(int a, int b, int &x, int &y) {

  if (!b)

    x = 1;

    y = 0;

    return a;

  

  int d = exgcd(b, a % b, y, x);

  y -= a / b * x;

  return d;

}

int inv(int a, int m) {

  int x, y;

  int d = exgcd(a, m, x, y);

  return d == 1 ? (x + m) % m : -1;

}

在以上代码中,exgcd函数用于求解两个数的最大公因数和x,y的值,inv函数用于求解a在m模下的逆元。如果a和m不互质,返回-1。

综上所述,C++中求解模逆元可以使用欧几里得算法或扩展欧几里得算法。无论哪种方法,都需要求解两个数的最大公因数。如果两个数互质,则可以通过求最大公因数来计算逆元。如果两个数不互质,则需要使用扩展欧几里得算法来计算逆元。熟练掌握求解模逆元的原理可以帮助开发人员更好地应用模运算,提高代码开发效率。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复
    相似文章