费马小定理求乘法逆元

费马小定理求整数域上乘法逆元

首先介绍费马小定理。

费马小定理的形式很简单,在 \(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 - 博客园)就行了。

posted @ 2025-06-19 13:38  ZTer  阅读(47)  评论(0)    收藏  举报