zoukankan      html  css  js  c++  java
  • 乘法逆元

    乘法逆元

    用途

    (oi)比赛中,比较常用的算法就是快速幂了,但是快速幂有一定的缺点比如他只能处理乘法,加法,减法,唯独不能处理除法,也很令人麻烦,此时就需要用到逆元的操作了,此若(axequiv1 (mod~{b}),且)(a)(b)互质,那么我们就能定义: (x)为((a))的逆元,记为(a^{-1}),所以我们也可以称(x)(a)的倒数,当我们快速幂的时候如果遇到(frac{a}{b}mod~~m)的情况,就可以将(frac{1}{b})换成(b)关于(m)逆元即(b'),这样就可以进行快速幂的运算了。

    求法

    乘法逆元共三种情况,每种情况都有其特有的优缺点。

    1. 首先就是采用扩展欧几里得的方法来求同余方程,(ax equiv 1(mod~ b))这个式子可以等价于(ax+by=1)这个方程的解,所以我们只需求出(x)来就行。 (比较通用)

    2. 其次就是采用费马小定理+快速幂来求,但是这个条件比较苛刻,需要上文中的(b)是个质数,这时我们根据费马小定理可以得出(a^{b-1}equiv 1(mod~b)) —> (a * a^{b-2} equiv 1(mod~b)) 此时(x)就是(a^{b-2})就是逆元,此时就可以用快速幂来解了。但是这个还是有点慢,不过在比赛中一般模数都是质数,所以也比较常用。

    3. 当要处理比较多的数的时候,可以采用线性推的方法,这个在求多个数的逆元上比较舒服。首先我们需要推一下,首先我们有一个,(1 ^ {-1}equiv 1(mod p))然后设(p=k*i+r,r<i,1<i<p),再将这个式子放到(mod {p})意义下就会得到:

      (k*i+r equiv 0 (mod p))

      然后乘上(i^{-1}*r^{-1})就可以得到:

      (k*r^{-1}+i^{-1}equiv 0 (mod p))

      (i^{-1}equiv -k*r^{-1} (mod p))

      (i^{-1}equiv -lfloor frac{p}{i} floor*(p mod i)^{-1} (mod p))

      这种题不太常见,一般出现在多种数据之中,比如洛谷的模板

  • 相关阅读:
    Happy Number
    N-Queens
    Palindrome Partitioning
    Linked List Cycle I & II
    leetcode 96: Unique Binary Search Trees java
    cc150 Chapter 2 | Linked Lists 2.6 Given a circular linked list, implement an algorithm which returns node at the beginning of the loop.
    cc150 Chapter 2 | Linked Lists 2.5 add two integer LinkedList, return LinkedList as a sum
    355. Design Twitter [classic design]
    400. Nth Digit
    211. Add and Search Word
  • 原文地址:https://www.cnblogs.com/liuwenyao/p/9839247.html
Copyright © 2011-2022 走看看