• 剩余系和乘法逆


    剩余系

    通俗的说,模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;
    }
  • 相关阅读:
    linux分析、诊断及调优必备的“杀器”之二
    浏览器被“hao123.3377.com”主页劫持的解决办法
    Nginx一个实现负载均衡的强大web server
    【百度之星
    c/c++ 参数传递
    【百度之星】-IP聚合
    百度之星-大搬家-递推
    IOS开发之Swift学习笔记
    【Leetcode】84. Largest Rectangle in Histogram 85. Maximal Rectangle
    【Leetcode】82. Remove Duplicates from Sorted List II
  • 原文地址:https://www.cnblogs.com/lfri/p/10454615.html
Copyright © 2020-2023  润新知