标签:扩展欧几里得 整数 同余 运算 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意义下得 $ki+r≡0(\mod p)$
两边同时乘上$i^{-1}$,$r^{-1}$得
$kr^{-1}+i^{-1}≡0(\mod p) $
$ i^{-1}≡-kr^{-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