【乘法逆元】看这一篇就够了!乘法逆元的证明、详解及应用。

2025-05-18 21:43:10

本文章为乘法逆元详解。

前一到二节属于前置知识:同余。

乘法逆元的讲解从第三节开始。

一、同余运算

(

a

+

b

)

m

o

d

m

=

[

(

a

m

o

d

m

)

+

(

b

m

o

d

m

)

]

m

o

d

m

(a+b)\bmod m=[(a\bmod m)+(b\bmod m)]\bmod m

(a+b)modm=[(amodm)+(bmodm)]modm

(

a

b

)

m

o

d

m

=

[

(

a

m

o

d

m

)

(

b

m

o

d

m

)

+

m

]

m

o

d

m

(a-b)\bmod m=[(a\bmod m)-(b\bmod m) + m]\bmod m

(a−b)modm=[(amodm)−(bmodm)+m]modm

(

a

×

b

)

m

o

d

m

=

[

(

a

m

o

d

m

)

×

(

b

m

o

d

m

)

]

m

o

d

m

(a\times b) \bmod m = [(a \bmod m) \times (b \bmod m)] \bmod m

(a×b)modm=[(amodm)×(bmodm)]modm

(

a

÷

b

)

m

o

d

m

[

(

a

m

o

d

m

)

÷

(

b

m

o

d

m

)

]

m

o

d

m

(a\div b) \bmod m ≠ [(a \bmod m) \div (b \bmod m)] \bmod m

(a÷b)modm=[(amodm)÷(bmodm)]modm

如:

(

12

÷

3

)

m

o

d

6

=

4

(

12

m

o

d

6

)

÷

(

3

m

o

d

6

)

(12\div3) \bmod 6 = 4 ≠ (12 \bmod 6) \div (3 \bmod 6)

(12÷3)mod6=4=(12mod6)÷(3mod6)

二、同余性质

a

b

(

m

o

d

m

)

a \equiv b\pmod m

a≡b(modm),则

m

(

a

b

)

m|(a-b)

m∣(a−b)。

同加性,若

a

b

(

m

o

d

m

)

a\equiv b\pmod m

a≡b(modm),则

a

+

c

b

+

c

(

m

o

d

m

)

a+c \equiv b+c \pmod m

a+c≡b+c(modm) 。

同乘性,若

a

b

(

m

o

d

m

)

a \equiv b \pmod m

a≡b(modm),则

a

c

b

c

(

m

o

d

m

)

ac \equiv bc \pmod m

ac≡bc(modm) 。

逆性质:若

a

c

b

c

(

m

o

d

m

)

ac \equiv bc \pmod m

ac≡bc(modm) ,且

gcd

(

c

,

m

)

=

1

\gcd(c,m)=1

gcd(c,m)=1,有

a

b

(

m

o

d

m

)

a \equiv b \pmod m

a≡b(modm)。

证明:

a

c

p

m

=

b

c

q

m

ac-pm=bc-qm

ac−pm=bc−qm ,

(

a

b

)

c

=

(

p

q

)

m

(a-b)c=(p-q)m

(a−b)c=(p−q)m,

c

c

c 与

m

m

m 互质,证明

a

b

a-b

a−b 为

m

m

m 的倍数,则

a

b

(

m

o

d

m

)

a \equiv b \pmod m

a≡b(modm)。

同幂性:若

a

b

(

m

o

d

m

)

a\equiv b\pmod m

a≡b(modm),则

a

c

b

c

(

m

o

d

m

)

a^c\equiv b^c\pmod m

ac≡bc(modm)。

三、乘法逆元

对于任意整数

a

a

a 而言,如果

a

a

a 和

p

p

p 互质,存在一个整数

x

x

x 使得

a

×

x

1

(

m

o

d

p

)

a\times x \equiv 1\pmod p

a×x≡1(modp) ,则有:

b

÷

a

m

o

d

p

=

b

÷

a

×

(

a

×

x

)

m

o

d

p

=

b

÷

(

a

×

a

)

×

x

m

o

d

p

=

b

×

x

m

o

d

p

\begin{aligned} b\div a\bmod p&=b\div a\times(a\times x)\bmod p \\&=b\div (a\times a)\times x\bmod p\\&=b\times x\bmod p \end{aligned}

b÷amodp​=b÷a×(a×x)modp=b÷(a×a)×xmodp=b×xmodp​

x

x

x 为

a

a

a 在模

p

p

p 意义下的乘法逆元,写作

a

1

a^{-1}

a−1。

我们可以借此解决运算法则四遇到的问题。

例如:

2

×

5

1

(

m

o

d

9

)

2\times 5 \equiv 1\pmod 9

2×5≡1(mod9),则

5

5

5 是

2

2

2 关于模

9

9

9 的乘法逆元。所以

8

÷

2

m

o

d

9

=

8

×

5

m

o

d

9

=

4

8\div2\bmod9=8\times5\bmod9=4

8÷2mod9=8×5mod9=4。

有了乘法逆元之后,

b

÷

a

m

o

d

p

b\div a\bmod p

b÷amodp,如果

a

p

a,p

a,p 互质,那么就有:

b

÷

a

m

o

d

p

=

(

b

m

o

d

p

×

a

1

m

o

d

p

)

m

o

d

p

b\div a\bmod p=(b\bmod p\times a^{-1}\bmod p)\bmod p

b÷amodp=(bmodp×a−1modp)modp

四、如何求乘法逆元

1.费马小定理

费马小定理:若

p

p

p 是质数,对任意整数

a

a

a 不是

p

p

p 的倍数,有

a

p

1

1

(

m

o

d

p

)

a^{p-1}\equiv 1\pmod p

ap−1≡1(modp),也可以写作

a

p

a

(

m

o

d

p

)

a^{p}\equiv a\pmod p

ap≡a(modp)。

证明:根据同余的性质,

a

,

2

a

,

3

a

,

(

p

1

)

a

a,2a,3a……,(p-1)a

a,2a,3a……,(p−1)a 分别

m

o

d

p

\bmod p

modp 的结果各不相同。那么:

a

×

2

a

×

3

a

×

(

p

1

)

a

1

×

2

×

3

×

(

p

1

)

(

m

o

d

p

)

a

p

1

×

[

1

×

2

×

3

×

(

p

1

)

]

1

×

2

×

3

×

(

p

1

)

(

m

o

d

p

)

a

p

1

1

(

m

o

d

p

)

\begin{aligned}a\times2a\times3a……\times(p-1)a&\equiv 1\times2\times 3……\times(p-1)\pmod p\\a^{p-1}\times[1\times2\times 3……\times(p-1)]&\equiv1\times2\times 3……\times(p-1)\pmod p\\a^{p-1}&\equiv 1\pmod p\end{aligned}

a×2a×3a……×(p−1)aap−1×[1×2×3……×(p−1)]ap−1​≡1×2×3……×(p−1)(modp)≡1×2×3……×(p−1)(modp)≡1(modp)​

如何求乘法逆元: 若

p

p

p 是质数,则有

a

p

1

1

(

m

o

d

p

)

a^{p-1}\equiv 1\pmod p

ap−1≡1(modp),而

a

×

x

1

(

m

o

d

p

)

a\times x\equiv 1\pmod p

a×x≡1(modp),所以

a

p

2

a^{p-2}

ap−2 是

a

a

a 模

p

p

p 意义下的的乘法逆元。

可以用快速幂,时间复杂度为

O

(

log

p

)

O(\log p)

O(logp)。

2.快速求阶乘逆元

a

(

n

1

)

!

a

n

!

×

n

(

m

o

d

p

)

[

(

n

1

)

!

]

1

(

n

!

)

1

×

n

(

m

o

d

p

)

\begin{aligned} a\over{(n-1)!}&{\equiv} {{a}\over{n!}}\times n{\pmod p}\\ [(n-1)!]^{-1}&\equiv (n!)^{-1}\times n\pmod p\end{aligned}

(n−1)!a​[(n−1)!]−1​≡n!a​×n(modp)≡(n!)−1×n(modp)​

i

n

v

[

n

]

inv[n]

inv[n] 表示

n

n

n 的阶乘在模

p

p

p 意义下的的乘法逆元

(

n

<

p

)

(n

(n

i

n

v

[

n

1

]

i

n

v

[

n

]

×

n

inv[n-1]\equiv inv[n]\times n

inv[n−1]≡inv[n]×n。

可以先用费马小定理先求出

i

n

v

[

n

]

inv[n]

inv[n],接着推出所有逆元。

3.快速求连续自然数逆元

假设已知

i

=

1

i=1

i=1 的逆是

1

1

1。递推求

i

>

1

i>1

i>1 时的逆。

k

k

k 是

p

÷

i

p\div i

p÷i 的商,

r

r

r 是

p

÷

i

p\div i

p÷i 的余数,则

k

×

i

+

r

0

(

m

o

d

p

)

k\times i+r\equiv 0\pmod p

k×i+r≡0(modp);

在等式两边同乘

i

1

×

r

1

i^{-1}\times r^{-1}

i−1×r−1,得到

k

×

r

1

+

i

1

0

(

m

o

d

p

)

k\times r^{-1}+i^{-1}\equiv 0\pmod p

k×r−1+i−1≡0(modp);

移项得到

i

1

k

×

r

1

(

m

o

d

p

)

i^{-1}\equiv -k\times r^{-1}\pmod p

i−1≡−k×r−1(modp),即

i

1

p

i

×

r

1

(

m

o

d

p

)

i^{-1}\equiv -\lfloor{{p}\over{i}} \rfloor\times r^{-1}\pmod p

i−1≡−⌊ip​⌋×r−1(modp);

最后右边加上

p

p

p ,得到

i

1

p

p

i

×

r

1

(

m

o

d

p

)

i^{-1}\equiv p-\lfloor{{p}\over{i}} \rfloor\times r^{-1}\pmod p

i−1≡p−⌊ip​⌋×r−1(modp)。

下面是洛谷 P3811 乘法逆元 的部分代码:

long long inv[maxn];

void inverse(long long n, long long p){

inv[1] = 1;

for(int i = 2; i <= n; ++i)

inv[i] = (p - p/i) * inv[p % i] % p;

}

4.非连续数字快速求逆元

设有

n

n

n 个非连续数字,快速求逆元。

仍然使用快速幂,复杂度为

O

(

n

log

n

)

O(n\log n)

O(nlogn),并非最优。

设:

非连续数字为

a

1

a

2

a

3

a

n

a_1,a_2,a_3……a_n

a1​,a2​,a3​……an​;

s

[

i

]

=

a

1

×

a

2

×

×

a

i

s[i]=a_1\times a_2\times ……\times a_i

s[i]=a1​×a2​×……×ai​;

e

[

i

]

=

a

n

×

a

n

1

×

×

a

i

e[i]=a_n\times a_{n-1}\times……\times a_i

e[i]=an​×an−1​×……×ai​;

I

N

V

=

(

a

1

×

a

2

×

×

a

n

)

INV=(a_1\times a_2\times ……\times a_n)

INV=(a1​×a2​×……×an​)的逆元。

i

n

v

[

i

]

=

I

N

V

×

s

[

i

1

]

×

e

[

i

+

1

]

inv[i]=INV\times s[i-1]\times e[i+1]

inv[i]=INV×s[i−1]×e[i+1]。

这样可以

O

(

n

)

O(n)

O(n) 得到所有数的逆元。

五.结束

最新发表
友情链接