• 乘法逆元


    作用

    众所周知,模运算下有同加性,同减性,同乘性而没有同除性,即没有((frac ab)\%p=(frac{a\%p}{b\%p})\%p)

    如果不信很简单就可以找到一组反例:

    ((frac {100}{50})\%20=2)

    ((frac{100\%20}{50\%20})\%20=0)

    但是求解中有大量除法怎么办呢?于是为了解决没有同除性问题就产生了乘法逆元。

    现在假设(x)(a)的乘法逆元,根据需求,应该满足对于任意的整数(b)(frac ba≡p(mod n))时有(bx≡p(mod n))

    给出定义:当(axequiv1(mod n)) 时,称(x)(a)(n)意义下的乘法逆元。

    由此利用同乘性有:

    [frac baequivfrac bacdot1equivfrac bacdot axequiv bcdot x(mod n) ]

    因此只要找到符号定义的(x)就可以把模算术中的除法转换成了乘法。

    从定义中强调了(n)可以知道,对于不同的模数,(a)的乘法逆元是不同的,具体原因看后面求解的过程

    求法

    1、扩展欧几里得算法:

    由定义有(ax=nk+1,kin Z),即(ax-nk=1)

    条件:根据扩展欧几里得算法相关知识,仅当1为(gcd(a, n))的倍数,此处即(gcd(a, b)=1)时该方程有解

    此时可用扩展欧几里得算法求解:

    LL Exgcd(LL a, LL b, LL &x, LL &y) {
        if(!b) { x=1, y=0; return a; }
        LL g = Exgcd(b, a%b, y, x);
        y = y - a / b * x;
        return g;
    }
    
    LL inverse(LL a, LL n) {
        LL x, y, g = Exgcd(a, n, x, y);
        return g == 1 ? (x%n+n)%n : -1; // -1为无解 
    }
    

    -

    2、费马小定理:

    原定理:(a^{p-1}≡1(mod p))

    条件:(p)为素数且(a,p)互素

    则可推得(acdot a^{p-2}≡1(mod p))

    (a^{p-2})(a)的乘法逆元

    快速幂算(a^{p-2}),时间(O(log_2n))

    -

    3、欧拉定理:

    相当于扩展的费马小定理,处理模数不是素数的情况

    原定理:(a^{varphi(p)}equiv1(mod p)),其中(varphi(p))为欧拉函数

    条件:(a,p)互质

    推得(acdot a^{varphi(p)-1}equiv1(mod p))

    求解过程和"2、费马小定理"类似,要多算一个(varphi(p))但可以处理更宽泛的情况,不要求(p)为素数

    -

    一对比就可以发现,用扩展欧几里得算法明显实用性更强,因此推荐写扩欧。

    (p)为素数时用费马小定理写快速幂会快一点。

    至于欧拉算法,就比较尴尬,广泛性不如扩欧大,代码复杂度不如费马小定理低,因此推测它不常用。

  • 相关阅读:
    gulp常用插件之gulp-plumber使用
    gulp常用插件之gulp-load-plugins使用
    gulp常用插件之yargs使用
    ql自动化测试之路-概述篇
    ql的python学习之路-day11
    ql的python学习之路-day10
    ql的python学习之路-day9
    python实现简易工资管理系统(Salary Manage)源码
    python控制台实现打印带颜色的字体
    ql的python学习之路-day8
  • 原文地址:https://www.cnblogs.com/de-compass/p/12215386.html
Copyright © 2020-2023  润新知