码迷,mamicode.com
首页 > 其他好文 > 详细

乘法逆元 求解及应用

时间:2018-04-29 16:57:40      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:扩展欧几里得   整数   同余   运算   amp   floor   ***   费马小定理   变形   

乘法逆元定义

假设a,x,b为整数,b>1,且有$ax \equiv 1(\mod b)$成立
那么a,x互为膜b的逆元
通俗一些,即两数乘积膜p等于1,则他们互为b的逆元
************************

逆元算法求解

扩展欧几里得

既然已有同余式$ax \equiv 1(\mod b)$
那么我们可以将其转化为$ax+by=1$

可以用扩展欧几里得算法求出其最小非负整数解即为a在膜b意义下的逆元
不会扩展欧几里得算法看这里

扩展欧几里得 推导及应用

void exgcd(int a,int b,int &x,int &y)
{
    if(b==0){x=1;y=0;return a;}
    int gcd=exgcd(b,a%b,x,y);
    int tp=x;
    x=y; y=tp-a/b*y;
    return gcd;
}
int x,y;
exgcd(a,b,x,y);
inv=(x%b+b)%b;

该算法对于b是否为素数无限制
单次逆元的计算效率不错
****************

费马小定理

p 为素数, a为正整数,且a,p互质,则有$a^{p-1}\equiv1(\mod p)$

对于$a^{p-1}\equiv1(\mod p)$
我们变形为$a*a^{p-2}\equiv1(\mod p)$
那么$x=a^{p-2}$%$p$即为我们所要求的逆元

该算法可直接用快速幂计算
复杂度为log级别,效率高
不支持计算p不为素数的情况
***************************************

线性算法

首先有$1^{-1}≡1(\mod p)$

设$p=ki+r$ $(r<i$, $1<i<p)$
再将这个式子放到膜 p意义下得 $k
i+r≡0(\mod p)$

两边同时乘上$i^{-1}$,$r^{-1}$得

$kr^{-1}+i^{-1}≡0(\mod p) $
$ i^{-1}≡-k
r^{-1}(\mod p) $
$ i^{-1}≡-\lfloor p/i \rfloor*(p \mod i)^{-1}(\mod p)$

于是我们得到一个线性递推算法

inv[1]=1;
for(int i=2;i<=n;++i)
inv[i]=(ll)(p-p/i)*inv[p%i]%p;

该算法复杂度O(n)
适用于需要求解一整组逆元的时候
*******************

逆元应用

对于(a/b)%p这样的式子
显然不适用取膜运算律
所以我们将其改为**(a*inv[b])%p**

好像也没什么其他神奇的用处了= =

乘法逆元 求解及应用

标签:扩展欧几里得   整数   同余   运算   amp   floor   ***   费马小定理   变形   

原文地址:https://www.cnblogs.com/niiick/p/8971278.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!