费马小定理求逆元

如果p是素数,则a ^ (p -  1) = 1 % p

即a ^ (p - 2) * a = 1 % p

a ^ (p -  2)就是a的逆元

求快速幂的时候,最好先把a模一下。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 20;
const ll mod = 1e9 + 7;
ll n, inv[N];
ll ksm(ll a, ll b) {
	ll ans = 1;
	a %= mod;
	while(b) {
		if(b & 1) ans = ans * a % mod;
		a = a * a % mod;
		b >>= 1;
	}
	return ans;
}
ll get_inv(ll a) {
	return ksm(a, mod - 2);
}
int main() {
	scanf("%lld", &n);
	cout << get_inv(n) << endl;
	return 0;
}

补:取模运算中,相减,例如:(a - b) % mod,先把a加上mod,即:(a + mod - b) % mod。

<think>好的,我现在需要回答用户关于如何使用费马小定理计算乘法逆元的问题。首先,我得回顾一下费马小定理的基本内容。费马小定理指出,如果p是一个质数,而a不是p的倍数,那么a的(p-1)次方模p等于1。数学表达式应该是这样的:$$a^{p-1} \equiv 1 \pmod{p}$$。 接下来,用户想知道如何用这个定理来求乘法逆元。乘法逆元的定义是,对于模p下的a,存在一个数x,使得a乘以x模p等于1,也就是$$a \cdot x \equiv 1 \pmod{p}$$。结合费马小定理的话,如果p是质数,且a和p互质,那么根据定理,a^{p-1} ≡1 mod p,可以把这个式子变形为a乘以a^{p-2} ≡1 mod p。这样,a^{p-2}就是a的逆元。所以,x = a^{p-2} mod p。 接下来,我需要考虑具体的计算步骤。比如,当给定a和p时,如何快速计算a^{p-2} mod p。这时候应该使用快速幂算法,因为直接计算指数可能会非常耗时,尤其是当p很大时。快速幂通过分治的方法,将指数分解为二进制,从而降低时间复杂度到O(log p)。 然后,我需要举一个例子来具体说明这个过程。例如,取a=3,p=7。这时候,根据公式,逆元x应该是3^(7-2) mod 7,也就是3^5 mod 7。计算的话,3^5=243,243除以7得到34余5,所以x=5。验证一下,3*5=15,15 mod7=1,确实是正确的。 不过,还要注意应用条件。费马小定理只适用于p为质数的情况,而且a不能是p的倍数。如果p不是质数,或者a和p不互质,就不能用这个方法。这时候可能需要用扩展欧几里得算法来求逆元。比如,当p是合数时,费马小定理不适用,而扩展欧几里得算法可以处理更一般的情况。 此外,用户可能会问到如何处理大数情况下的计算效率,这时候需要强调快速幂的重要性。比如在编程实现时,可以使用递归或者迭代的快速幂方法来高效计算大指数模运算。同时,还要提醒用户注意可能的错误情况,比如当p不是质数或者a是p的倍数时,此时逆元不存在,应该进行错误处理。 最后,可能需要给出一个代码示例,比如用Python实现基于费马小定理的逆元计算函数。代码中需要包含检查p是否为质数的步骤,以及使用快速幂计算a^(p-2) mod p。同时,要指出在实际情况中,特别是在p可能不是质数的情况下,应该使用其他方法如扩展欧几里得算法,或者更复杂的质数测试来确保正确性。 总结一下,回答的结构应该是先介绍费马小定理和逆元的关系,然后给出计算步骤,接着举例说明,再讨论应用条件和限制,最后提供代码示例和相关注意事项。同时,根据用户提供的引用资料,引用中的内容可能涉及费马小定理在编程竞赛中的应用,以及逆元的相关计算方法,需要适当引用这些资料来支持回答。</think>### 使用费马小定理求解乘法逆元的方法 #### 1. **理论基础** - **费马小定理**:若 $p$ 是质数,且整数 $a$ 满足 $p \nmid a$(即 $a$ 不是 $p$ 的倍数),则: $$a^{p-1} \equiv 1 \pmod{p}$$ 进一步变形可得: $$a \cdot a^{p-2} \equiv 1 \pmod{p}$$ 因此,$a^{p-2} \bmod p$ 即为 $a$ 在模 $p$ 下的乘法逆元[^1]。 #### 2. **计算步骤** 1. **验证条件**:确保 $p$ 是质数且 $a$ 与 $p$ 互质(即 $\gcd(a, p) = 1$)。 2. **计算指数**:通过快速幂算法计算 $a^{p-2} \bmod p$,时间复杂度为 $O(\log p)$。 3. **结果验证**:检查 $a \cdot x \equiv 1 \pmod{p}$ 是否成立。 #### 3. **示例** **问题**:求 $a=3$ 在模 $p=7$ 下的乘法逆元。 **步骤**: 1. 确认 $p=7$ 是质数且 $\gcd(3,7)=1$。 2. 计算 $3^{7-2} \bmod 7 = 3^5 \bmod 7$: - $3^2 = 9 \equiv 2 \pmod{7}$ - $3^4 = (3^2)^2 \equiv 2^2 = 4 \pmod{7}$ - $3^5 = 3^4 \cdot 3 \equiv 4 \cdot 3 = 12 \equiv 5 \pmod{7}$ 3. 验证:$3 \cdot 5 = 15 \equiv 1 \pmod{7}$,结果正确。 #### 4. **代码实现(Python)** ```python def fast_pow(base, exp, mod): result = 1 while exp > 0: if exp % 2 == 1: result = (result * base) % mod base = (base * base) % mod exp = exp // 2 return result def mod_inverse_fermat(a, p): if not (is_prime(p) and gcd(a, p) == 1): # 需自行实现质数判断和gcd函数 raise ValueError("p必须是质数且a与p互质") return fast_pow(a, p-2, p) # 示例:计算3在模7下的逆元 a = 3 p = 7 inv = mod_inverse_fermat(a, p) print(f"{a}在模{p}下的逆元是{inv}") # 输出:3在模7下的逆元是5 ``` #### 5. **注意事项** - **适用范围**:仅当 $p$ 是质数且 $a$ 与 $p$ 互质时有效[^4]。 - **大数处理**:快速幂算法能高效计算大指数模运算。 - **可靠性**:若 $p$ 可能为合数,需改用扩展欧几里得算法[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值