(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),是个不错的姿势(手动滑稽)

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

逆元详解

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

线性求逆元

线性求逆元 1−1≡1(mod p)1^{-1}\equiv1(mod\ p) 令p=k∗i+r,r
  • firenet1
  • firenet1
  • 2015年10月05日 20:06
  • 1417

hdu 1576 A/B(拓展欧几里得求逆元模板题)

A/B Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm...
  • qq_24451605
  • qq_24451605
  • 2015年04月15日 16:01
  • 635

POJ 1845 Sumdiv(求逆元)

Sumdiv Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 17590   Accepted: 4421 ...
  • liangzhaoyang1
  • liangzhaoyang1
  • 2016年04月09日 12:52
  • 1415

求乘法逆元的几种方法

(数学渣,下面的文字可能有误,欢迎指教) 乘法逆元的定义貌似是基于群给出的,比较简单地理解,可以说是倒数的概念的推广。记a的关于模p的逆元为a^-1,则a^-1满足aa^-1≡ 1(mod p) ...
  • Xwxcy
  • Xwxcy
  • 2016年05月24日 20:23
  • 8529

乘法逆元小结

在求解除法取模问题时(a/b)%m (a/b) \% m,我们可以转化为(a%(b∗m))/b(a \% (b * m))/b, 但是如果b很大,则会出现精度问题,所以我们避免使用除法直接计算。 ...
  • Yukizzz
  • Yukizzz
  • 2016年04月09日 14:28
  • 6894

乘法逆元

一. 乘法逆元1. 逆元在群GG中,∀a∈G,∃a′∈G,s.t.aa′=e\forall a\in G,\exists a'\in G,s.t. aa'=e,其中ee为GG的单位元。2. 乘法逆元p...
  • y20070316
  • y20070316
  • 2016年01月25日 12:49
  • 535

求逆元

一、O(n)求逆元inv[i]=(MOD−MODi)∗inv[MOD%i]%MODinv[i] = ( MOD - \frac{MOD}{i} ) * inv[MOD\%i] \% MOD证明:设t=...
  • BOYxiejunBOY
  • BOYxiejunBOY
  • 2016年11月02日 21:31
  • 765

求逆元

我们来看一点清真的东西: 一. p特别小,b也特别小(即p*b < long long) (a/b)(a/b) mod p=ap = a mod (b∗p)/b;(b*p)/b;二....
  • Rocky_Selene
  • Rocky_Selene
  • 2016年09月26日 12:24
  • 152

ACM 乘法逆元 模板

乘法逆元
  • nickwong_
  • nickwong_
  • 2014年08月24日 21:24
  • 2353
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:(ACM数论)求乘法逆元的各种姿势~
举报原因:
原因补充:

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