费马小定理 证明 逆元

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

费马小定理证明逆元
费马小定理
费马小定理是数论中的一个重要定理,它可以用来判断一个数是否为
素数。

费马小定理是由法国数学家费马在17世纪提出的,经过几百年的发展,现在已经成为了数学中不可或缺的一部分。

费马小定理的表述是:如果p是一个质数,a是任意一个整数,那么
a^p-a对p取模的结果等于0。

也就是说,a^p ≡ a(mod p)。

证明
我们来证明一下费马小定理。

假设p是一个质数,a是任意一个整数。

那么我们可以把a分解成若干个质因子的乘积:a=p1^e1 * p2^e2
* … * pk^ek。

根据欧拉定理(Euler's Theorem),我们有:
a^(φ(p)) ≡ 1(mod p)
其中φ(p)表示小于p且与p互质的正整数个数,也就是欧拉函数
(Euler Function)。

因为p是质数,所以小于它且与它互质的正整数个数为p-1。

将φ(p)替换成p-1得到:
a^(p-1) ≡ 1(mod p)
接下来我们需要证明:
a^p ≡ a(mod p)
这个式子等价于:
a^p - a ≡ 0(mod p)
我们可以把a^p - a写成以下形式:
a^p - a = a * (a^(p-1) - 1)
因为p是质数,所以a和p互质,而且根据欧拉定理,a^(p-1) ≡ 1(mod p)。

因此,我们可以得到:
a * (a^(p-1) - 1) ≡ a * (1 - 1)(mod p)
即:
a^p - a ≡ 0(mod p)
这就证明了费马小定理。

逆元
逆元是数论中的一个重要概念。

在模运算中,如果存在一个数b满足ab≡1(mod m),那么我们称b是a关于模m的逆元。

其中m是一个正整数。

如果存在关于模m的逆元,那么我们就可以进行除法运算。

比如说,如果b是a关于模m的逆元,那么对于任意一个整数c,我们都可以得到:
ac≡c(mod m)
然后两边同时除以a得到:
c≡ab*c(mod m)
再把b带入进去得到:
c/b≡ac/b(mod m)
也就是说,
c/b≡c*a^-1(mod m)
因此,在模运算中有逆元存在时,我们就可以进行除法运算了。

如何求逆元呢?有两种方法:扩展欧几里得算法和费马小定理。

扩展欧几里得算法
扩展欧几里得算法是一种求解两个数的最大公约数以及它们的系数的
方法。

我们可以使用扩展欧几里得算法来求解逆元。

假设我们要求a关于模m的逆元,那么我们需要找到一个整数x和y,使得:
ax + my = 1
这个等式的解就是a关于模m的逆元。

具体地,我们可以使用以下代码来实现扩展欧几里得算法:
int ext_gcd(int a, int b, int& x, int& y) {
if (b == 0) {
x = 1;
y = 0;
return a;
}
int d = ext_gcd(b, a % b, y, x);
y -= a / b * x;
return d;
}
然后我们就可以使用这个函数来求解逆元了。

假设a和m互质,那么我们有:
ax + my = 1
因为a和m互质,所以它们的最大公约数为1。

因此,我们可以通过扩展欧几里得算法来求解x和y。

具体地,我们可以使用以下代码来实现求解逆元:
int inv(int a, int m) {
int x, y;
ext_gcd(a, m, x, y);
return (x % m + m) % m;
}
这个函数的返回值就是a关于模m的逆元。

费马小定理
如果m是一个质数,那么我们可以使用费马小定理来求解逆元。

假设a和m互质,那么根据费马小定理,我们有:
a^(m-1) ≡ 1(mod m)
两边同时乘以a^-1得到:
a^-1 ≡ a^(m-2)(mod m)
因此,我们可以使用以下代码来实现求解逆元:
int inv(int a, int m) {
return qpow(a, m - 2, m);
}
其中qpow函数表示快速幂运算。

总结
本文介绍了费马小定理和逆元的概念以及证明方法。

费马小定理是数论中的一个重要定理,它可以用来判断一个数是否为素数。

逆元是在模运算中进行除法运算的关键。

我们可以使用扩展欧几里得算法或者费马小定理来求解逆元。

相关文档
最新文档