zoukankan      html  css  js  c++  java
  • 【乘法逆元基础实现】

    今天来讲讲乘法逆元。
    首先是模板题链接
    首先,乘法逆元的定义还是简单说一下:

    若在mod p意义下,对于一个整数a,有(a imes b≡1(mod p)),那么这个整数d即为a的 乘法逆元,同时a也为d的乘法逆元

    然后主要是代码实现。
    我们分为两种种情况来求乘法逆元

    1.求较少无规律数的乘法逆元

    一、扩展欧几里得

    已经在扩展欧几里得算法讲过了,这种算法也是较少无规律数算法中较快的一种。

    二、费马小定理。

    费马小定理:
    (p)为质数时,对于任意整数(a),满足(a^p-a)(p)的整数倍,在(mod p)意义下可以表示为:

    [egin{split} a^p-a equiv 0pmod{p}\ a^p equiv apmod {p}\ a^{p-1}equiv 1pmod{p}\ a imes a^{p-2}equiv 1pmod{p} end{split} ]

    所以很明显,只需要算出(a^{p-2}mod p)就是(a)(mod p)意义下的逆元,用快速幂算出来就可以了。

    2.求1~n逆元

    很明显,这种要求这么多数字的逆元的题目,不能再简单地挨个单个算它的逆元了。
    这个时候就需要一种算法,能够在很短的时间内求出这一连串数字在(mod p)意义下的逆元,所以就出现了这种线性算法
    它能够用(O(n))的时间复杂度来求出1~n的每一个逆元。
    首先 (1^{-1}equiv 1pmod {p})(既然(p)是质数那么(p)一定是(≥2)的整数)
    然后设 (p=k*i+r,(1<r<i<p))也就是 (k)(p / i) 的商,(r) 是余数 。
    再将这个式子放到(pmod p)意义下就会得到:
    (k*i+r equiv 0 pmod p)
    然后乘上(i^{-1},r^{-1})就可以得到:
    此处输入图片的描述

    (O(n))递推公式:

    inv[i]=(p-p/i)*inv[p%i]%p;
    

    inv[1]初值赋(1).
    ov.

    个人博客地址: www.moyujiang.com 或 moyujiang.top
  • 相关阅读:
    猫与老鼠的故事(委托)
    返回类型协变和参数类型逆变
    HTTP 方法:GET 对比 POST
    Ajax
    django(未解决的问题)
    mysql开机启动
    apache的不同路径conf/httpd.conf有什么区别【转载】
    Apache部署Django过程中遇到的一些问题
    执行django-admin.py startproject XXX报错的问题
    yum安装软件的过程中出现的一些问题
  • 原文地址:https://www.cnblogs.com/moyujiang/p/11242670.html
Copyright © 2011-2022 走看看