乘法逆元的应用以及原理
乘法逆元的定义:若 a x ≡ 1 ( m o d p ) ax\equiv 1 \pmod{p} ax≡1(modp),就称 x x x为 a a a模 p p p的乘法逆元。
乘法逆元的应用及原理:若 a ∣ b a \mid b a∣b,则 b a m o d p = b ⋅ x m o d p \cfrac{b}{a} \mod p=b\cdot x \mod p abmodp=b⋅xmodp1。证明:设 b = a k b=ak b=ak,即 k = b a k=\cfrac{b}{a} k=ab,就有 b ⋅ x m o d p = a k ⋅ x m o d p = k ⋅ ( a x ) m o d p b\cdot x \mod p=ak\cdot x \mod p=k\cdot(ax) \mod p b⋅xmodp=ak⋅xmodp=k⋅(ax)modp。因为 a x ≡ 1 ( m o d p ) ax\equiv 1\pmod{p} ax≡1(modp),由同余定理得: k ⋅ ( a x ) ≡ k ≡ b a ( m o d p ) k\cdot(ax) \equiv k\equiv \cfrac{b}{a} \pmod{p} k⋅(ax)≡k≡ab(modp),于是得证。
求乘法逆元
费马小定理2
对于任意的质数 p p p和正整数 a a a,若满足 gcd ( a , p ) = 1 \gcd(a,p)=1 gcd(a,p)=1,则 a p − 1 ≡ 1 ( m o d p ) a^{p-1}\equiv 1\pmod{p} ap−1≡1(modp),那么 a ⋅ a p − 2 ≡ 1 ( m o d p ) a\cdot a^{p-2}\equiv 1\pmod{p} a⋅ap−2≡1(modp),此时 a p − 2 a^{p-2} ap−2就是 a a a模 p p p的逆元,快速幂求即可。复杂度 O ( log 2 p ) O(\log_2p) O(log2p)。
扩展欧几里得算法
由于费马小定理对 p p p和 a a a有限制,所以我们引入另一种方法:求解线性同余方程,也即将原同余方程转化为二元一次不定方程 a x + p k = 1 ax+pk=1 ax+pk=1的整数解。复杂度 O ( log 2 n ) O(\log_2 n) O(log2n),其中 n n n为 a , p a,p a,p的取值范围。
线性递推
如果要求出
[
1
,
n
]
[1,n]
[1,n]中每个数模
p
p
p的乘法逆元(不存在则为
0
0
0),我们就可以采用
O
(
n
)
O(n)
O(n)的线性递推方法。首先有
1
−
1
≡
1
(
m
o
d
p
)
1^{-1}\equiv 1 \pmod{p}
1−1≡1(modp)(
1
1
1就是
1
1
1的乘法逆元)(
x
−
1
x^{-1}
x−1表示
x
x
x的乘法逆元)。对于大于
1
1
1的正整数
x
x
x,我们假设
p
=
k
x
+
b
p=kx+b
p=kx+b,其中
k
=
⌊
p
x
⌋
k=\left\lfloor\cfrac{p}{x}\right\rfloor
k=⌊xp⌋,
b
=
p
m
o
d
x
b=p\mod x
b=pmodx。于是可以得到:
k
x
+
b
≡
0
(
m
o
d
p
)
kx+b\equiv 0 \pmod{p}
kx+b≡0(modp)
两边同时乘以
x
−
1
b
−
1
x^{-1}b^{-1}
x−1b−1,得到:
k
b
−
1
+
x
−
1
≡
0
(
m
o
d
p
)
kb^{-1}+x^{-1}\equiv 0 \pmod{p}
kb−1+x−1≡0(modp)
那么可以得到:
x
−
1
≡
−
k
b
−
1
(
m
o
d
p
)
x^{-1}\equiv -kb^{-1} \pmod{p}
x−1≡−kb−1(modp)
将
k
k
k和
b
b
b的值带入,得到:
x
−
1
≡
−
⌊
p
x
⌋
⋅
(
p
m
o
d
x
)
−
1
(
m
o
d
p
)
x^{-1}\equiv -\left\lfloor\cfrac{p}{x}\right\rfloor\cdot(p\mod x)^{-1} \pmod{p}
x−1≡−⌊xp⌋⋅(pmodx)−1(modp)
如果说
x
x
x有一个逆元
r
r
r,那么
r
+
m
p
r+mp
r+mp一定都是
x
x
x的逆元,因为
x
(
r
+
m
p
)
≡
x
r
≡
1
(
m
o
d
p
)
x(r+mp)\equiv xr \equiv 1 \pmod{p}
x(r+mp)≡xr≡1(modp)。所以说所有满足
t
≡
−
⌊
p
x
⌋
⋅
(
p
m
o
d
x
)
−
1
(
m
o
d
p
)
t\equiv -\left\lfloor\cfrac{p}{x}\right\rfloor\cdot(p\mod x)^{-1} \pmod{p}
t≡−⌊xp⌋⋅(pmodx)−1(modp)的
t
t
t都是
x
x
x的逆元,也就是说(-(p/x)*inv[p%x]%p+p)%p
就是
x
−
1
x^{-1}
x−1的最小整数解。由于
0
≤
p
m
o
d
x
<
x
0\leq p \mod x < x
0≤pmodx<x,所以
x
−
1
x^{-1}
x−1可以由前面的数的逆元求得。如果
p
m
o
d
x
=
0
p \mod x = 0
pmodx=0,那么
x
∣
p
x \mid p
x∣p,对于
x
>
1
x>1
x>1和任意的
k
k
k,一定有
x
k
≢
1
(
m
o
d
p
)
x k \not \equiv 1 \pmod{p}
xk≡1(modp),那么
x
x
x的乘法逆元不存在,因此设为
0
0
0。而我们将
0
−
1
0^{-1}
0−1设为
0
0
0,则求逆元的式子仍然成立。由此式递推即可。
对于 a ∤ b a\nmid b a∤b, ⌊ b a ⌋ m o d p = ⌊ b a ⌋ ⋅ a a m o d p \left\lfloor \cfrac{b}{a}\right\rfloor \mod p=\cfrac{\left\lfloor\cfrac{b}{a}\right\rfloor\cdot a}{a}\mod p ⌊ab⌋modp=a⌊ab⌋⋅amodp,因此只要将 b b b转化为 ⌊ b a ⌋ ⋅ a \left\lfloor\cfrac{b}{a}\right\rfloor\cdot a ⌊ab⌋⋅a即可。 ↩︎