逆元
- 【逆元素-百度一下】
广义的来讲,对于任何域中的元素,有乘法运算和单位元 I I I,如果对于该域中的元素 A A A,存在另一个元素 A ′ A' A′,且满足 A × A ′ = I A\times A'=I A×A′=I,那么 A ′ A' A′就是 A A A的逆元。
这里我们只讨论在整数域里的逆元,也就是当 A ∈ Z A\in \rm Z A∈Z且 I = 1 I=1 I=1,其实这里的逆元 A ′ = 1 A A'=\frac{1}{A} A′=A1,但是我们要在模的意义下讨论它的求法。
在取模意义下,我们只需求出一个数 i n v inv inv,是的这个数与 1 A \frac{1}{A} A1同余即可,那么这个数 i n v inv inv就是 A A A在取模意义下的逆元。
费马小定理
内容:对于 x x x,在模 p , p ∈ P 质数 p,p\in \mathbb{P}\text{质数} p,p∈P质数的意义下,有 x p − 1 ≡ 1 ( m o d p ) x^{p-1}\equiv 1(mod\ p) xp−1≡1(mod p)
我们变换一个形式,左右同时除以 x x x,就是 x p − 2 ≡ 1 x ( m o d p ) x^{p-2}\equiv \frac{1}{x}(mod\ p) xp−2≡x1(mod p),那么我们就发现 x p − 2 x^{p-2} xp−2和 1 x \frac{1}{x} x1是同余的,那么 x p − 2 x^{p-2} xp−2就是 x x x的逆元了。
费马小定理证明:
- 用欧拉定理直接证明,这个就后面再说。
- 我们用剩余系来看:
引理1:假设 a a a为 1 ∼ p − 1 1\sim p-1 1∼p−1内的一个数,那么 a , 2 a , 3 a , ⋯   , ( p − 1 ) a a,2a,3a,\cdots,(p-1)a a,2a,3a,⋯,(p−1)a可以在模 p p p的意义下不重复的取遍 1 ∼ p − 1 1\sim p-1 1∼p−1的值。引理1的证明-这里面有
那么我们将 a , 2 a , ⋯   , ( p − 1 ) a a,2a,\cdots,(p-1)a a,2a,⋯,(p−1)a乘起来,在模 p p p的意义下也就相当于把 1 , 2 , ⋯   , ( p − 1 ) 1,2,\cdots,(p-1) 1,2,⋯,(p−1)乘起来,那么可以得到 a p − 1 ( p − 1 ) ! ≡ ( p − 1 ) ! ( m o d p ) a^{p-1}(p-1)!\equiv (p-1)!(mod\ p) ap−1(p−1)!≡(p−1)!(mod p),然后两端同时除以 ( p − 1 ) ! (p-1)! (p−1)!就可以得到 a p − 1 ≡ 1 ( m o d p ) a^{p-1}\equiv 1(mod\ p) ap−1≡1(mod p)了,于是得证。
所以用费马小定理求取逆元的代码如下:
int inv(int a,int b=p-2){
int ans=1;
for(;b;b>>=1,a=(a*a)%p)if(b&1)ans=(ans*a)%p;
return ans%p;
}
欧拉定理
内容:对于 x x x,在模 p p p( p p p为任意与 x x x互质的数)意义下,有 x φ ( p ) ≡ 1 ( m o d p ) x^{\varphi(p)}\equiv 1(mod\ p) xφ(p)≡1(mod p),其中 φ ( p ) \varphi(p) φ(p)为欧拉函数,表示 1 ∼ p − 1 1\sim p-1 1∼p−1中与 p p p互质的个数。
那么我们知道,当 p p p为质数时就有 φ ( p ) = p − 1 \varphi(p)=p-1 φ(p)=p−1,那么这个就是费马小定理了。
我们同样进行变形,可以得到 x φ ( p ) − 1 ≡ 1 x ( m o d p ) x^{\varphi(p)-1}\equiv \frac{1}{x}(mod\ p) xφ(p)−1≡x1(mod p),那么这里 x φ ( p ) − 1 x^{\varphi(p)-1} xφ(p)−1就为 x x x的逆元了。
我们看,这里只要求 x , p x,p x,p互质,并没有要求 p p p为质数,所以欧拉定理求逆元比费马小定理求逆元应用更加广泛。
其他应用:当快速幂取模时,指数较大,但我们发现 x φ ( p ) ≡ 1 ( m o d p ) x^{\varphi(p)}\equiv 1(mod\ p) xφ(p)≡1(mod p),所以我们可以将指数模了 φ ( p ) \varphi(p) φ(p),相当于除以很多个 1 1 1,然后再来快速幂。
欧拉定理的证明:
我们先令 x 1 ∼ x φ ( p ) x_1\sim x_{\varphi(p)} x1∼xφ(p)为 p p p的简化剩余系,再令 p i = x x i p_i=xx_i pi=xxi,其中 g c d ( x i , p ) = 1 gcd(x_i,p)=1 gcd(xi,p)=1
引理1. p i p_i pi之间两两在模 p p p的意义下不同余,同样 x i x_i xi也是。
- 证明引理1. :
假设有 p i ≡ p j ( m o d p ) p_i\equiv p_j(mod\ p) pi≡pj(mod p),那么 p i − p j ≡ 0 ( m o d p ) p_i-p_j\equiv 0(mod\ p) pi−pj≡0(mod p),我们将其变形得 x x i − x x j ≡ 0 ( m o d p ) xx_i-xx_j\equiv 0(mod\ p) xxi−xxj≡0(mod p),也就是 x ( x i − x j ) ≡ 0 ( m o d p ) x(x_i-x_j)\equiv 0(mod\ p) x(xi−xj)≡0(mod p),由于 g c d ( x , p ) = 1 gcd(x,p)=1 gcd(x,p)=1,所以只有在 x i − x j x_i-x_j xi−xj为 p p p的倍数时,这个式子才满足,而 x i , x j ≤ p x_i,x_j\leq p xi,xj≤p,那么它们相减就更加不可能为 p p p的倍数了,所以假设不成立,得证。
引理2. 每个 p i p_i pi模 p p p的结果都与 p p p互质。
- 证明引理2. :
假设
p
i
≡
r
(
m
o
d
p
)
,
g
c
d
(
p
,
r
)
>
1
p_i\equiv r(mod\ p),gcd(p,r)>1
pi≡r(mod p),gcd(p,r)>1
那么变形就有
x
x
i
=
k
p
+
r
xx_i=kp+r
xxi=kp+r,也就是
x
x
i
−
k
p
=
r
xx_i-kp=r
xxi−kp=r,我们可以得知
x
x
i
xx_i
xxi肯定与
p
p
p互质(因为
x
,
x
i
x,x_i
x,xi分别与
p
p
p互质),那么我们令
d
=
g
c
d
(
p
,
r
)
d=gcd(p,r)
d=gcd(p,r),那么变形可知
x
x
i
=
r
+
k
p
xx_i=r+kp
xxi=r+kp,也就是
x
x
i
=
d
(
w
1
+
k
w
2
)
其中
(
d
w
1
=
r
,
d
w
2
=
p
)
xx_i=d(w_1+kw_2)\text{其中}(dw_1=r,dw_2=p)
xxi=d(w1+kw2)其中(dw1=r,dw2=p),那么
x
x
i
xx_i
xxi肯定有因子
d
d
d,那么它与
p
p
p就不互质了,所以假设不成立,得证。
- 证明欧拉定理:
由1,2引理可得, ( x x 1 × x x 2 ⋯ × x x φ ( p ) ) ≡ ( x 1 × x 2 ⋯ × x φ ( p ) ) ( m o d p ) (xx_1\times xx_2\cdots\times xx_{\varphi(p)})\equiv (x_1\times x_2\cdots\times x_{\varphi(p)})(mod\ p) (xx1×xx2⋯×xxφ(p))≡(x1×x2⋯×xφ(p))(mod p)
所以变形得 x φ ( p ) ∏ x i ≡ ∏ x i ( m o d p ) x^{\varphi(p)}\prod x_i\equiv \prod x_i(mod\ p) xφ(p)∏xi≡∏xi(mod p),两端同除就得 x φ ( p ) ≡ 1 ( m o d p ) x^{\varphi(p)}\equiv 1(mod\ p) xφ(p)≡1(mod p)
扩展欧拉定理
内容:
x
k
=
{
x
k
 
m
o
d
 
φ
(
p
)
g
c
d
(
x
,
p
)
=
1
x
k
k
<
φ
(
p
)
x
k
 
m
o
d
 
φ
(
p
)
+
φ
(
p
)
g
c
d
(
x
,
p
)
≠
1
,
k
≥
φ
(
p
)
x ^ { k } = \left\{ \begin{array} { l l } { x ^ { k \bmod \varphi ( p ) } } & { g c d ( x , p ) = 1 } \\ { x ^ { k } } & { k < \varphi ( p ) } \\ { x ^ { k \bmod \varphi ( p ) + \varphi ( p ) } } & { g c d ( x , p ) \neq 1 , k \geq \varphi ( p ) } \end{array} \right.
xk=⎩⎨⎧xkmodφ(p)xkxkmodφ(p)+φ(p)gcd(x,p)=1k<φ(p)gcd(x,p)̸=1,k≥φ(p)
扩展欧几里得算法
内容 : exgcd(a,b,x,y) 【见详解于这里】
这个也就是求方程
a
x
+
b
y
=
c
ax+by=c
ax+by=c的解。
那么我们将
a
x
≡
1
(
m
o
d
y
)
ax\equiv 1(mod\ y)
ax≡1(mod y)看作方程
a
x
+
b
y
=
1
ax+by=1
ax+by=1,那么当
g
c
d
(
a
,
b
)
=
1
gcd(a,b)=1
gcd(a,b)=1的时候,这个肯定有解,所以我们用扩展欧几里得定理求出
x
x
x,那么可以发现
a
x
≡
1
(
m
o
d
y
)
ax\equiv 1(mod\ y)
ax≡1(mod y)的,所以此时的
x
x
x就是在
m
o
d
y
mod\ y
mod y意义下的逆元。
线性递推求法
首先我们知道 1 1 1的逆元一定为 1 1 1,所以考虑 i i i的逆元( i > 1 i>1 i>1)。
对于模数为 p p p,我们令 p = i × k + d ( d < i ) p=i\times k+d(d<i) p=i×k+d(d<i),那么对于 k , d k,d k,d则有: k = ⌊ p i ⌋ , d = p m o d i k=\lfloor\frac{p}{i}\rfloor,d=p\ mod\ i k=⌊ip⌋,d=p mod i
那么原式可以写成 i × k + d ≡ 0 ( m o d p ) i\times k+d\equiv 0(mod\ p) i×k+d≡0(mod p)
两边同时乘以 i − 1 × d − 1 i^{-1}\times d^{-1} i−1×d−1可得
d − 1 × k + i i − 1 ≡ 0 ( m o d p ) d^{-1}\times k+i^{i-1}\equiv 0(mod\ p) d−1×k+ii−1≡0(mod p)
那么 i − 1 ≡ ( − k × d − 1 ) ( m o d p ) i^{-1}\equiv (-k\times d^{-1})(mod\ p) i−1≡(−k×d−1)(mod p),所以将 k , d k,d k,d带回即有:
i − 1 ≡ − ⌊ p i ⌋ × ( p m o d i ) − 1 ( m o d p ) i^{-1}\equiv -\lfloor\frac{p}{i}\rfloor\times(p\ mod\ i)^{-1}(mod\ p) i−1≡−⌊ip⌋×(p mod i)−1(mod p)
由于 i i i以内的逆元已经求出,所以递推即可。
所以 i n v ( i ) = ( − p i ) × i n v ( p m o d i ) inv(i)=(-\frac{p}{i})\times inv(p\ mod\ i) inv(i)=(−ip)×inv(p mod i)
参考大佬文章IN-Luogu
1740

被折叠的 条评论
为什么被折叠?



