逆元的几种方法
1. 定义
正整数 a, n,如果有 ax ≡ 1(mod n),则称 x 的最小整数解为 a 模 n
的逆元。
2. 应用
(a / b) mod n = a * b-1 mod n
3. 求解逆元
a) 扩展欧几里得
由逆元定义知 ,求 a 模 n 的逆元 x 即为求解模线性方程
ax ≡ 1(mod n)
适用条件:保证 gcd(a, n) = 1。b) 费马小定理
费马小定理:
假如 p 是质数,且 gcd(a,p)=1,那么 ap-1 ≡ 1(mod p)。
其中 ap-1 = a * a p-2 , 结合定义可以看出 x = a p-2
适用条件: p 是质数且 gcd(a, p) = 1。
c) 线性求逆元
有时题目需要用到 1->p 模 p 的所有质数, p 是奇质数, 用上
面两种方法复杂度差不多都是 O(nlogn), 有一种递推关系可以线性
求出所有逆元。
inv[i] = (p – p/i) * inv[p%i] % p , inv[1] = 1;
推导过程:
令 t = p / i, k = p % i;
有 t*i+ k ≡ 0 (mod p)
=> -t * i ≡ k (mod p)
两边同时除以 k*i
=> -t * k-1 ≡ i-1 (mod p)
代入 t、 k, 就有
inv[i] = (p – p/i) * inv[p%i] % p
d) 不用逆元。 。。
通常情况下遇到 a/b mod n 的问题时,我们可以通过 a*b-1 mod n
求解, 但是只有当 gcd(b, n) = 1, b 的逆元才存在, 如果出现 gcd !=
1 的情况是如何求解。
有一个通用公式适用所有情况
x = a / b mod n = a mod (n*b) / b
推导过程:
x = (a / b) mod n
= > (a / b) = k * n + x (x < n)
= > a = k * b * n + b * x
= > a mod (b*n) = b * x
= > x = a mod (b*n) / b
乘法逆元的定义貌似是基于群给出的,比较简单地理解,可以说是倒数的概念的推广。记a的关于模p的逆元为a^-1,则a^-1满足aa^-1≡ 1(mod p)
定义:
满足a*k≡1 (mod p)的k值就是a关于p的乘法逆元。
为什么要有乘法逆元呢?
当我们要求(a/b) mod p的值,且a很大,无法直接求得a/b的值时,我们就要用到乘法逆元。
我们可以通过求b关于p的乘法逆元k,将a乘上k再模p,即(a*k) mod p。其结果与(a/b) mod p等价。
证:(其实很简单。。。)
根据b*k≡1 (mod p)有b*k=p*x+1。
k=(p*x+1)/b。
把k代入(a*k) mod p,得:
(a*(p*x+1)/b) mod p
=((a*p*x)/b+a/b) mod p
=[((a*p*x)/b) mod p +(a/b)] mod p