zoukankan      html  css  js  c++  java
  • 剩余系和乘法逆

    剩余系

    通俗的说,模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;
    }
  • 相关阅读:
    Poj 2017 Speed Limit(水题)
    Poj 1316 Self Numbers(水题)
    Poj 1017 Packets(贪心策略)
    Poj 1017 Packets(贪心策略)
    Poj 2662,2909 Goldbach's Conjecture (素数判定)
    Poj 2662,2909 Goldbach's Conjecture (素数判定)
    poj 2388 Who's in the Middle(快速排序求中位数)
    poj 2388 Who's in the Middle(快速排序求中位数)
    poj 2000 Gold Coins(水题)
    poj 2000 Gold Coins(水题)
  • 原文地址:https://www.cnblogs.com/lfri/p/10454615.html
Copyright © 2011-2022 走看看