数论之————逆元

数论倒数,又叫逆元

逆元有什么用呢?
大家都知道
(a+b)%p=(a%p+b%p)%p
(a-b)%p=(a%p-b%p)%p
(a*b)%p=(a%p * b%p)%p
以上操作都是对的

唯独到了除法不可以
比如:(8/2)%6=4!=(8%6)/(2%6)=1
对于有些题目需要中间过程取余,否则会超存储范,所以这时候就需要逆元了

逆元的定义:

方程ax≡1(mod p),的解称为a关于模p的逆,当gcd(a,p)==1(即a,p互质)时,方程有唯一解,否则无解。

逆元的含义:

模n意义下,1个数a如果有逆元x,那么除以a相当于乘以x。
假如b的逆元用inv(b)来表示,那么(a/b)%p就可以转化为(a*inv(b))%p

逆元的三种求法:

1.费马小定理:

假如p是质数,且gcd(a,p)=1,那么 a^(p-1)≡1(mod p),即:假如a是整数,p是质数,且a,p互质(即两者只有一个公约数1),那么a的(p-1)次方除以p的余数恒等于1。
a^(p-1) ≡ 1 (mod p)
a*a^(p-2) ≡ 1 (mod p)
a^(p-2)就是a关于p的逆元
求 a^(p-2)我们就可以使用快速幂得到
如果不了解快速幂点这里(゚▽゚)

2.扩展欧几里得法:

适用于快速幂会爆long long的情况。
ax+by=1;
这个解x就是a关于b的逆元,y就是b关于a的逆元
为啥呢?

方程两边同时对b取余
ax%b+by%b=1%b
ax%b=1%b
ax≡1(mod b)
同理可得y是b关于a的逆元

不懂扩展欧几里得点这里(*゚▽゚)

3.递推

当p是个质数时

inv[1]=1;
for(int i=2;i< mod;i++)
inv[i]=(mod-mod/i) * inv[mod%i];
对于这个式子的证明:

M=k*i+r≡0 (mod M)

式子两边同乘上 i-1+r-1,如果M不是质数得话r就可能为零

k * r–1+i–1≡0 (mod M)

i–1≡–k*r–1 (mod M)

i–1≡ – (M/i)* (M mod i)–1 (mod M)

易证: i–1=(M–M/i)*inv[M%i]%M;

你可能感兴趣的:(ACM_数论,ACM)