剩余系和乘法逆

剩余系

通俗的说,模n的完全剩余类系就是${0,1,2, cdots ,n-1}$,而简化剩余类(也称缩系)就是完全剩余类系中与n互素的那些元素。

比如n=12时,缩系中只有4个元素:1,5,7,11。模n的完全剩余类系中最常见的写法是$Z/nZ$,也可以写成$Z/n$或者$Z_n$。为了简单,这里记为$Z_n$,缩系记作$Z_n^*$。

      $Z_n$中的每个元素都代表在模n下所有与它同余的整数。既然$Z_n$中的每个元素代表着一个同余等价类,$Z_n$中的加法自然不是普通的加法,而是“模加法”,乘法也不是普通的乘法,而是“模乘法”。因此,在$Z_5$中3+4=2,在$Z_{12}$中5*7=11.

模乘法的逆

在某些情况下,$Z_n$中的两个元素a和b满足ab=1,比如在$Z_15$中7*13=1.在这种情况次下,我们说a和b互为乘法的逆,记为$b=a^{-1},a=b^{-1}$。这个逆很像“倒数”,因为在剩余类系中,当$a^{-1}$存在时,“除以”一个数等价于乘以它的乘法逆$a^{-1}$。比如在$Z_15$中$7^{-1}=13$,因此$3/7 =  3*7^{-1} = 3 *13 = 9$。

       看到这里,你可能会产生疑问:3/7甚至不是整数,怎么可能等于9?请注意,因为剩余类系中的每个元素对应一个同余等价类。3/7=9的实际含义是“假定有两个整数a和b,其中a/b是整数,且a和b除以15的余数分别为3和7,则a/b除以15的余数等于9”。比如a=528,b=22就是一例。

由于“乘法逆”太重要了,这里给出计算它的完整代码,代码中用到了扩展欧几里得算法:

//ax + by = d,且|x|+|y|最小,其中d=gcd(a,b)
//即使a, b在int范围内,x和y也有可能超过int范围
void exgcd(LL a, LL b, LL &d, LL &x, LL &y)
{
    if (!b){ d = a; x = 1; y = 0;}
    else{ exgcd(b, a % b, d, y, x); y -= x * (a / b);}
}
//计算模n下a的逆。如果不存在逆,返回-1
//ax=1(mod n)
LL inv(LL a, LL n)
{
    LL d, x, y;
    exgcd(a, n, d, x, y);
    return d == 1 ? (x + n) % n : -1;
}
原文地址:https://www.cnblogs.com/lfri/p/10454615.html