逆元(笔记)


逆元是什么东西呢,emmm我刚开始也是很迷,搞了好久才明白。

我们先来看一下有关于运算法则上的一些规律:

引例:

对于一个数a, a + 0 = a a + 0 = a a+0=a总是成立的, a ∗ 1 = a a * 1 = a a1=a也总是成立的,我们可以发现,在加法里0这个数可以运算后不改变原来的值,在乘法里1这个数运算后可以不改变原来的值。

发现了上面规律后我们可以进行一下小的猜想,拿乘法举例:对于一个数a是否存在一个数b使得 a ∗ b = 1 a * b = 1 ab=1呢?显然存在的,b只需要取 1 a \frac{1}{a} a1就可以了。

同余:

给定两个整数,a,b如果对于一个整数c有(a - b) / c为整数,那么就说a和b对模c同余,记做 a ≡ b ( m o d   c ) a≡b(mod\ c) ab(mod c)

讲白了就是a % c = b % c

逆元的概念:

我们先定义逆元,仿照乘法的套路,我们自然想到是否也能找到一个数 x x x使得 a ∗ x ≡ 1 ( m o d   c ) a * x ≡ 1 (mod\ c) ax1(mod c)成立呢?

显然是有可能存在这个么一个数 x x x使上式成立的,那么此时我们就称 x x x a a a在模 c c c意义下的逆元(类似于倒数一般的存在)。

关于除法取余:

有了逆元最直接解决的问题就是除法取余了:
对于 ( A / B ) m o d   C (A / B) mod\ C (A/B)mod C显然是不等于 ( A m o d    C ) / ( B m o d    C ) (A\mod C) / (B \mod C) (AmodC)/(BmodC) 的,
那么我们就需要换一个思路,我又没有办法把B给消掉呢?
我们知道对于B在C下的逆元X满足: B ∗ X ≡ 1 ( m o d   C ) B * X ≡ 1 (mod\ C) BX1(mod C)也就是说在模C意义下乘1等价于乘B * X,也就是说:
(A / B) * 1 mod C = (A / B) * B * X mod C
再整理一下:
(A / B) mod C = A * X mod C
这样我们就把除法的取模转化成了乘法的取模,得到结论:
(A / B) mod C = A * X mod C(其中X为B在C意义下的逆元)

逆元的求法
费马小定理求逆元:

费马小定理:给定一个质数P,一个整数A且A不是P的整数倍那么就有:
A P − 1 ≡ 1 ( m o d   P ) A^{P - 1} ≡ 1(mod\ P) AP11(mod P)成立
我们把 A P − 1 A^{P-1} AP1写成 A ∗ A P − 2 A*A^{P - 2} AAP2就可以发现A在模P下的逆元就是 A P − 2 A^{P - 2} AP2

扩展欧几里得求逆元:

对于A在P意义下的的逆元x有 A x ≡ 1 ( m o d   P ) Ax ≡ 1(mod\ P) Ax1(mod P)成立,我们引入一个整数y那么上式就可以写成 A x = 1 + P y Ax =1 + Py Ax=1+Py移项得 A x − P y = 1 Ax - Py = 1 AxPy=1

y ′ = − y y' = -y y=y得: A x + P y ′ = 1 Ax + Py' = 1 Ax+Py=1

这很明显是一个二元方程我们可以用扩欧求解求得x,得出逆元: 过程

欧拉函数求逆元:

p h i ( x ) phi(x) phi(x)为欧拉函数,那么对于整数A,在P意义下的逆元就是 A p h i ( p ) − 1 A^{phi(p) - 1} Aphi(p)1
特别:当P为质数时 P h i ( P ) − 1 = P − 2 Phi(P) - 1 = P- 2 Phi(P)1=P2于是就成了费马小定理求逆元的形式

线性求逆元:
方法1:

对于一个整数 i i i P P P

  1. 我们可以把 P P P写成 P = i ∗ k + c P = i*k + c P=ik+c的形式其中 i < P , c < i i < P,c <i i<P,c<i
  2. 我们对P进行取余得: i ∗ k + c ≡ 0 ( m o d   P ) i * k +c\equiv0(mod\ P) ik+c0(mod P)
  3. 两边同乘 i − 1 ∗ c − 1 i^{-1}*c^{-1} i1c1得: k ∗ c − 1 + i − 1 ≡ 0 ( m o d   P ) k*c^{-1} + i^{-1}\equiv0(mod\ P) kc1+i10(mod P)
  4. 移项得 i − 1 ≡ − k ∗ c − 1 ( m o d   P ) i^{-1} \equiv-k*c^{-1}(mod\ P) i1kc1(mod P)
  5. 根据1可以得到 k = [ P i ] , c = P − k ∗ i = P   %   i k = [\frac{P}{i}],c = P - k*i = P\ \%\ i k=[iP],c=Pki=P % i
  6. 得到 i − 1 = − [ P i ] ∗ ( P   %   i ) − 1 ( m o d   P ) i^{-1} =-[\frac{P}{i}]*(P\ \%\ i)^{-1}(mod\ P) i1=[iP](P % i)1(mod P)
  7. 整理得: i − 1 = ( P − P / i ) ∗ ( P   %   i ) − 1 i^{-1} = (P- P/i)*(P\ \%\ i)^{-1} i1=(PP/i)(P % i)1
for(int i = 2;  i < P; i++)
	inv[i] = (P - P / i)*inv[P % i] % P;
方法2:

对于逆元满足这样的性质:
( a ∗ b ) − 1 = a − 1 ∗ b − 1 (a * b)^{-1} = a^{-1} * b^{-1} (ab)1=a1b1那么我们只需要求一下 1 到 n ! 1到n! 1n!再求一下 ( n ! ) − 1 (n!)^{-1} (n!)1然后对于 ( n − 1 ) − 1 (n - 1)^{-1} (n1)1就有:
( n − 1 ) − 1 = n − 1 ∗ ( n − 1 ) ! (n - 1)^{-1} = n^{-1} *(n - 1)! (n1)1=n1(n1)!

逆元的存在性:

当A与P互质时,A在P意义下的逆元才存在。
特别当P为质数时A必须要不是P的倍数,A在P意义下的逆元才存在。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值