浅谈乘法逆元求法
前言 : 笔者的理解只适用于做题 , 并不能在数学上严谨.
\(①\) \(:\) 乘法逆元的定义
若整数 \(b\) , \(m\) 互质 , 并且 \(b\) | \(a\) , 则存在一个整数 \(x\) , 使得 \(a/b\) \(\equiv\) \(a \ast x\) ( \(mod\) \(m\) ).称 \(x\) 为 \(b\) 摸 \(m\) 的 乘法逆元 , 记为 \(b^{-1}\) ( \(mod\) \(m\) ).
\(②\) \(:\) 费马小定理求乘法逆元
根据 \(a\) / \(b\) \(\equiv\) \(a\) / \(b \ast b \ast b^{-1}\) ( \(mod\) \(m\) ) , 我们可以发现 \(b \ast b^{-1} \equiv 1\) ( \(mod\) \(m\)) , 这里指明了一个数和它在模数下的逆元的关系 .
根据费马小定理 : 若 \(m\) 为 质数 , 并且 \(b < m\) (在求逆元时等价 \(b\) 不能时 \(m\) 的倍数) , 则有 \(b^{m-1} \equiv 1\) ( \(mod\) \(m\) ). 将这个式子转化 \(b \ast b^{m-2} \equiv 1\) ( \(mod\) \(m\) ) , 此时 \(b^{m-2}\) 即为 \(b\) 在摸 \(m\) 意义下的逆元 , 快速幂即可.
\(③\) \(:\) 扩展欧几里得求乘法逆元
对于任意正整数 \(a\) , \(b\) , 存在一对整数 \(x\) , \(y\) , 满足 \(ax + by = gcd(a , b)\) .
先说明这个问题的求法(原理是欧几里得):
\(①\) \(:\) \(ax_1 + by_1 = gcd(a,b)\) , \(bx_2 + (a \% b) y_2 = gcd(b , a\%b)\) , \(gcd(a , b) = gcd(b , a\%b)\)
\(②\) \(:\) \(bx_2 + (a \% b) y_2\) = \(bx_2 + (a - a/b \ast b) y_2\) = \(ay_2 + b(x_2 - a/b \ast y_2)\) = \(ax_1 + by_2\)
\(③\) \(:\) \(x_1 = y_2\) , \(y_1 = x_2 - a/b \ast y2\) , 这样我们得到了欧几里得的过程中每一层\(x\) , \(y\) 的对应关系.特别的当\(gcd\) 到最后一步时 , \(a = 1 , b = 0\) , \(x = 1 , y = 0\) 是我们看得出的一组解 , 再递推回去即可得到原解.
在 \(②\) 中我们知道了 \(b \ast b^{-1} \equiv 1\) ( \(mod\) \(m\)) , 等价于 \(b \ast b^{-1} + m \ast y = 1\) , 当 \(b\) 与模数 \(m\) 互质时 , 把 \(b\) 看成一开始的 \(a\) , \(m\) 看成一开始的 \(b\) , 则化为 \(a \ast 逆元 + b \ast y = gcd(a,b) = 1\) , 套入 \(exgcd\) 求解即可.
void exgcd(int a,int b){
if(b == 0) {x1 = 1;y1 = 0;return;}
exgcd(b,a%b);
x2 = x1 , y2 = y1;
x1 = y2 , y1 = (x2 - a/b*y2);
return;
}
④ :乘法逆元递推
设模数为 p
\(p = k*i + j \ , k = \lfloor p/i \rfloor \space , j = p \% i\)
则有
\(k * i + j \equiv 0 \pmod{p}\)
两边同时乘上 \(i ^ {-1} + j ^ {-1}\)
则有 $i ^ {-1} = -k \space * j ^ {-1} $ , 将 \(k , j\) 代入即可
inv[1] = 1 ;
for(int i = 2 ; i <= n ; ++i) {
inv[i] = (p - p / i) * inv[p % i] % p ; //其中 (p - p / i)是为了防止负数的出现
}

浙公网安备 33010602011771号