逆元是什么东西呢,emmm我刚开始也是很迷,搞了好久才明白。
我们先来看一下有关于运算法则上的一些规律:
引例:
对于一个数a, a + 0 = a a + 0 = a a+0=a总是成立的, a ∗ 1 = a a * 1 = a a∗1=a也总是成立的,我们可以发现,在加法里0这个数可以运算后不改变原来的值,在乘法里1这个数运算后可以不改变原来的值。
发现了上面规律后我们可以进行一下小的猜想,拿乘法举例:对于一个数a是否存在一个数b使得 a ∗ b = 1 a * b = 1 a∗b=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) a≡b(mod c)
讲白了就是a % c = b % c
逆元的概念:
我们先定义逆元,仿照乘法的套路,我们自然想到是否也能找到一个数 x x x使得 a ∗ x ≡ 1 ( m o d c ) a * x ≡ 1 (mod\ c) a∗x≡1(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)
B∗X≡1(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)
AP−1≡1(mod P)成立
我们把
A
P
−
1
A^{P-1}
AP−1写成
A
∗
A
P
−
2
A*A^{P - 2}
A∗AP−2就可以发现A在模P下的逆元就是
A
P
−
2
A^{P - 2}
AP−2
扩展欧几里得求逆元:
对于A在P意义下的的逆元x有 A x ≡ 1 ( m o d P ) Ax ≡ 1(mod\ P) Ax≡1(mod P)成立,我们引入一个整数y那么上式就可以写成 A x = 1 + P y Ax =1 + Py Ax=1+Py移项得 A x − P y = 1 Ax - Py = 1 Ax−Py=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=P−2于是就成了费马小定理求逆元的形式
线性求逆元:
方法1:
对于一个整数 i i i和 P P P
- 我们可以把 P P P写成 P = i ∗ k + c P = i*k + c P=i∗k+c的形式其中 i < P , c < i i < P,c <i i<P,c<i
- 我们对P进行取余得: i ∗ k + c ≡ 0 ( m o d P ) i * k +c\equiv0(mod\ P) i∗k+c≡0(mod P)
- 两边同乘 i − 1 ∗ c − 1 i^{-1}*c^{-1} i−1∗c−1得: k ∗ c − 1 + i − 1 ≡ 0 ( m o d P ) k*c^{-1} + i^{-1}\equiv0(mod\ P) k∗c−1+i−1≡0(mod P)
- 移项得 i − 1 ≡ − k ∗ c − 1 ( m o d P ) i^{-1} \equiv-k*c^{-1}(mod\ P) i−1≡−k∗c−1(mod P)
- 根据1可以得到 k = [ P i ] , c = P − k ∗ i = P % i k = [\frac{P}{i}],c = P - k*i = P\ \%\ i k=[iP],c=P−k∗i=P % i
- 得到 i − 1 = − [ P i ] ∗ ( P % i ) − 1 ( m o d P ) i^{-1} =-[\frac{P}{i}]*(P\ \%\ i)^{-1}(mod\ P) i−1=−[iP]∗(P % i)−1(mod P)
- 整理得: i − 1 = ( P − P / i ) ∗ ( P % i ) − 1 i^{-1} = (P- P/i)*(P\ \%\ i)^{-1} i−1=(P−P/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}
(a∗b)−1=a−1∗b−1那么我们只需要求一下
1
到
n
!
1到n!
1到n!再求一下
(
n
!
)
−
1
(n!)^{-1}
(n!)−1然后对于
(
n
−
1
)
−
1
(n - 1)^{-1}
(n−1)−1就有:
(
n
−
1
)
−
1
=
n
−
1
∗
(
n
−
1
)
!
(n - 1)^{-1} = n^{-1} *(n - 1)!
(n−1)−1=n−1∗(n−1)!
逆元的存在性:
当A与P互质时,A在P意义下的逆元才存在。
特别当P为质数时A必须要不是P的倍数,A在P意义下的逆元才存在。