(ACM数论)求乘法逆元的各种姿势~

原创 2016年08月29日 16:55:34

首先,通过下面的式子来看看什么是乘法逆元~

x * n % P = 1,其中x和P为已知且互素,n未知(比如在 2 * n % 7 = 1 这个式子里,n就是乘法逆元)

弄懂什么是乘法逆元,来看看有什么姿势可以把它求出来吧~

姿势1.暴力(此姿势不要求P为素数)

没有什么问题是一个暴力解决不了的,如果有,那就两个(手动滑稽)

代码如下:

int n;
for(int i = 1 ;i <= P ;i++)
{
    if(x * i % P == 1)
    {
        n = i;
        break;
    }
}

虽然暴力简单粗暴,但是它的时间复杂度为O(P),只能在P较小的情况使用,局限性有点大。

姿势2.快速幂(此姿势要求P为素数)

这个姿势是由费马巨巨的费马小定理(x^(P-1) ≡ 1 mod P)得来的:

x^(P-1) ≡ 1 mod P 即 x^(P-1) % P = 1

已知 x * n % P = 1

所以有 x * n % P = x^(P-1) % P 即 n % P = x^(P-2) % P

到这里可以看出,逆元有无数个:n,n+P,n+2*P,…

一般情况下我们只要求那个最小的正整数,这样问题就转化为求 x^(P-2) % P

代码就不贴了,在网上找个有求模快速幂的模版,把x,P-2,P代进去就可以了

这个姿势的时间复杂度为O(log P),是个不错的姿势(手动滑稽)

姿势3.扩展欧几里德算法(此姿势不要求P为素数)

首先,我们将式子变形一下~

x * n % P = 1 等价于 n * x + k * P = 1,其中k为整数

因为 x 和 P 互素,所以 gcd (x ,P) = 1(最大公约数为1)

所以有 n * x + k * P = gcd (x ,P)

这样问题就转化为,求二元一次方程 n * x + k * P = gcd (x ,P) 的解

代码同样不贴了, 在网上找个扩展欧几里德的模版,把 x , P 代进去。

不过要注意,算出来的n有可能是负数,也有可能不是最小的。若需要得到最小的正整数,加上如下代码即可:

n = n % P;//处理不是最小的情况
while(n < 0)//处理负数的情况
{
    n =( n + P ) % P;
}

到这里可以得出结论:逆元的集合为{…,n - 2 * P,n - P,n , n + P,n + 2 * P,… }

这个姿势的时间复杂度为O(log P),是个不错的姿势(手动滑稽)

版权声明:本文为博主原创文章,未经博主允许不得转载。

【数论】乘法逆元总结

【学习笔记】乘法逆元
  • sdfzchy
  • sdfzchy
  • 2017年07月25日 20:20
  • 125

乘法逆元的几种计算方法

乘法逆元是数论中重要的内容,也是 ACM 中常用到的数论算法之一。所以,如何高效的求出乘法逆元是一个值得研究的问题。 这里我们只讨论当模数为素数的情况,因为如果模数不为素数,则不一定每个数都有逆元。...
  • Rain722
  • Rain722
  • 2016年11月15日 13:21
  • 2706

乘法逆元数论篇【ORZ式教学】

引入篇乘法逆元较多用于求解除法取模问题 例如:(a/b)%m时,可以将其转换为(a%(b×m))/b,但这样求解的过程依然涉及到除法,所以我们应当避免除法的直接计算。这时候就需要用到我们要讲的乘法逆...

逆元详解

题目: 给两个数A,B,求A^B的因子和对9901取模的值。 有两种方法:一种是用逆元求,一种是直接快速求等比数列的和。 如果p为素数,当b不是p的倍数时,那么(a/b)%p=a*b^(p-2)%p,...

【乘法逆元】1256 乘法逆元【51nod】【难度:基础题】

题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1256 给出2个数M和N(M < N),且M与N互质,找出...
  • wlxsq
  • wlxsq
  • 2016年05月20日 01:05
  • 588

ACM 乘法逆元 模板

乘法逆元

乘法逆元(对于非质数的乘法逆元)

前情提要乘法逆元相关定义以及质数的乘法逆元详见我的另一篇博文(http://blog.csdn.net/jackypigpig/article/details/54232871)。具体实现对于一个整数...

HDU 2767 强联通分量

点击打开链接 题意:问加多少边后图会变成强联通分量为1的图 思路:简单的强联通,缩点后找入度和出度就行了,水题#include #include #include #include #in...
  • Dan__ge
  • Dan__ge
  • 2016年05月23日 21:24
  • 4111

hdu2767之强联通缩点

Proving Equivalences Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot...

2016ACM/ICPC亚洲区大连站 1006 Detachment 1004 A Simple Math Problem(求逆元)(数论)

这次差不多有6道是我现在可以做的,还有一道博弈论加大数的以后再补吧,还是要多积累啊。 现在先补充两个题目的吧...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:(ACM数论)求乘法逆元的各种姿势~
举报原因:
原因补充:

(最多只允许输入30个字)