📜  在 Z*n 中求逆 (1)

📅  最后修改于: 2023-12-03 15:37:34.066000             🧑  作者: Mango

在 Z*n 中求逆

在数学中,我们知道,对于一个正整数 n,Z*n 是关于模 n 的所有非零剩余类的集合。在这个集合中,我们可以进行加、减、乘、除等运算,但是同时也必须遵守模运算的规则。那么在这个集合中,如何求一个数的乘法逆元呢?本文就来介绍一下。

求解

根据欧几里得算法的扩展,我们可以求出对于 Z*n 中的一个数 a,它的乘法逆元 a-1。具体步骤如下:

  1. 求解 ax + ny = 1 中的 x 和 y。这可以使用扩展欧几里得算法来完成。其中,x 就是 a 在 Z*n 中的乘法逆元。
  2. 如果 x 是负数,则需要将它加上 n,直到它变成正数。

经过这两个步骤,我们就可以求出 a 在 Z*n 中的乘法逆元。

代码实现

实现乘法逆元的算法,代码如下:

def multiplicative_inverse(a, n):
    """
    Find x such that a * x ≡ 1 (mod n).
    :param a: integer
    :param n: integer
    :return: integer or None if no inverse exists
    """
    # Apply the Extended Euclidean algorithm
    s_prev, s = 0, 1
    r_prev, r = n, a
    while r:
        q = r_prev // r
        r_prev, r = r, r_prev - q * r
        s_prev, s = s, s_prev - q * s
    # Ensure that r_prev = gcd(a, n) = 1
    if r_prev != 1:
        return None
    # Ensure that 0 <= s < n
    if s < 0:
        s += n
    return s

以上代码使用了扩展欧几里得算法求解 a 和 n 的最大公约数,并计算了一个逆元 x。如果最大公约数不是1,就说明这两个数不互质,无法求解乘法逆元。如果求出的逆元 x 是负数,就需要将其加上 n,直到它变成正数。

总结

本文介绍了在 Z*n 中求解乘法逆元的方法。通过扩展欧几里得算法,我们可以求出在 Z*n 中一个数的乘法逆元。如果求出的逆元是负数,就需要将其加上 n。