费马小定理求乘法逆元
费马小定理求整数域上乘法逆元
首先介绍费马小定理。
费马小定理的形式很简单,在 \(p\) 为质数时,下式成立:
\[a^{p-1} \equiv 1 (\mod p)
\]
假设我们现在要求 \(a\) 对 \(p\) 的乘法逆元,也就是求 \(b\) 使得 \(ab \equiv 1 (\mod p)\)。
现在式子中已经有 \(a^{p-1}\),我们他拆开就得到 \(ab \equiv 1 (\mod p)\) 的形式了:
\[a \times a^{p-2} \equiv 1 (\mod p)
\]
所以 \(a^{p-2}\) 就是 \(a\) 对 \(p\) 的逆元,\(a^{p-2}\) 可以由快速幂求出。
Code
long long a, p, ans;
long long PowMod(long long a, long long b) {
long long ret = 1;
while(b != 0) {
if(b % 2 != 0)
ret = ret * a % p;
a = a * a % p;
b /= 2;
}
return ret;
}
int main() {
cin >> a >> p;
ans = PowMod(a, p - 2);
cout << ans << '\n';
return 0;
}
当然了,数论中涉及的数字可能比较大,特别是在密码学中的应用,所以需要使用高精度算法。不过写法不用变,套一个[高精度模板](C++高精度模板支持加减乘除取模,不支持负数 - ZTer - 博客园)就行了。
繁华尽处,
寻一静谧山谷,
筑一木制小屋,
砌一青石小路,
与你晨钟暮鼓,
安之若素。

浙公网安备 33010602011771号