数论专题-学习笔记:欧拉定理与扩展欧拉定理
1. 前言
欧拉定理与扩展欧拉定理,是数论中的一个很重要的定理。
该定理可以将形如 \(a^b\) 的式子的指数降得很低,通常可以降到 \(\log b\) 可接受范围内,这样就可以用快速幂计算了。
若无特殊说明,本文所有数都是正整数。
一些符号说明:
2. 前置知识
费马小定理:若 \(m\) 为质数并且 \(m \nmid a\),则 \(a^{m-1} \equiv 1 \bmod m\)。
3. 欧拉定理
3.1 描述
欧拉定理描述如下:
若 \(\gcd(a,m)=1\),则 \(a^{\varphi(m)} \equiv 1 \bmod m\)。
结合上面的费马小定理可以发现,费马小定理实际上就是欧拉定理的一种特殊情况。
3.2 证明
设 \(x_1,x_2,...,x_{\varphi(m)}\) 为 \(\varphi(m)\) 个与 \(m\) 互质的数。
令 \(p_i=ax_i\)。
下面若无特殊说明,同余式均对 \(m\) 取模。
引理 1:\(\forall i,j \in[1,\varphi(m)],p_i \not \equiv p_j,x_i \not \equiv x_j\)。
证明如下:首先因为所有 \(x_i<m\),那么必然有 \(x_i \not \equiv x_j\)。
接下来反证法,假设 \(p_i \equiv p_j\)。
那么有 \(p_i - p_j \equiv 0\)。
则 \(a(x_i-x_j) \equiv 0\)。
但是 \(\gcd(a,m)=1\),因此 \(m \mid x_i-x_j\)。但是 \(x_i-x_j \not = 0\) 且小于 \(m\),矛盾。
综上引理 1 成立。
引理 2:所有 \(p\) 模 \(m\) 的结果都与 \(m\) 互质。
证明如下:
还是反证法。
设 \(p_i=ax_i=km+r\),即除以 \(m\),那么有 \(\gcd(r,m)>1\)。
整理得 \(x_i=\dfrac{km+r}{a}\)。
因为 \(x_i\) 是个正整数,所以 \(\gcd(a,km,r)=a\)。
所以 \(\gcd(a,r)=a\)。
然而 \(\gcd(a,m)=1\),因此只有 \(\gcd(a,km)=a\) 才能够做到 \(\gcd(a,km,r)=a\)。
所以 \(k=a\)。
但是因为 \(p_i=ax_i\),因此就要有 \(x_i=m\) 且 \(r=0\),显然与假设矛盾,因此原假设错误。
综上,引理 2 成立。
有了这两个引理之后,我们就可以证明欧拉定理了。
由引理 2,所有 \(p\) 模 \(m\) 的结果都与 \(m\) 互质。
由引理 1,任意两个 \(p\) 之间模 \(m\) 不同余,任意两个 \(x\) 之间模 \(m\) 不同余。
因此我们可以得到所有 \(p\) 模 \(m\) 的结果组成的集合与 \(x\) 模 \(m\) 的结果组成的集合是相同的。
因此我们就有 \(\prod\limits_{i=1}^{\varphi(m)}p_i \equiv \prod\limits_{i=1}^{\varphi(m)}x_i\)。
由同余式的基本性质,约去 \(\prod x_i\),我们可以得到 \(a^{\varphi(m)}\equiv 1\)。
综上,欧拉定理成立。
4. 扩展欧拉定理
4.1 描述
扩展欧拉定理是欧拉定理的扩展,该定理将欧拉定理扩展到了 \(\gcd(a,m)\) 为任意数的情况。
其描述如下(均对 \(m\) 取模):
\(a^b \equiv \begin{cases}a^{b \bmod \varphi(m)}&\gcd(a,m)=1\\a^b&\gcd(a,m)\ne1,b \leq\varphi(m)\\a^{(b \bmod \varphi(m))+\varphi(m)}&\gcd(a,m)\ne1,b>\varphi(m)\end{cases}\)
4.2 证明
下面同余式无说明均对 \(m\) 取模。
\(a^b \equiv a^{b \bmod \varphi(m)},\gcd(a,m)=1\)。
这个还是比较简单的。
由欧拉定理,\(a^{\varphi(m)} \equiv 1\),因此实际上我们两遍同时除以 \(a^{\varphi(m)}\) 是可行的。
因此原式得证。
\(a^b \equiv a^b,\gcd(a,m) \ne1,b \leq \varphi(m)\)。
啊不是这还需要证明吗qwq
\(a^b \equiv a^{(b \bmod \varphi(m)) + \varphi(m)},\gcd(a,m) \ne 1,b > \varphi(m)\)。
首先对 \(a\) 做一个质因数分解 \(a=\prod_{i=1}^{k}p_i^{r_i}\)。
因此根据同余式可以同乘的性质,我们的目标变成了证明 \(a=p_i^{r_i}\) 时上式成立。
显然 \(p_i^{r_i}\) 也是可以由 \(r_i\) 个 \(p_i\) 同乘的,因此我们的最终目的变成了证明当 \(a\) 是个质数的时候上式成立。
接下来的证明都只考虑 \(a\) 为质数。
考虑引入一个数 \(s\) 与 \(a\) 互质,令 \(m=s \times a^c,c \leq \varphi(m)\)。
- 实际上 \(c \leq \varphi(m)\) 是必定成立的,因为总共与 \(m\) 互质的数有 \(\varphi(m)\) 个,而且\(\varphi(m)=\varphi(s) \times \varphi(a^c)=\varphi(s) \times c,\varphi(s) \geq 1\),因此有 \(c \leq \varphi(m)\)。
根据欧拉定理,有 \(a^{\varphi(s)} \equiv 1 \bmod s\)。
因为 \(\gcd(s,a)=1\),根据欧拉函数的下面这条性质:
- 设 \(n \in N_+,p\) 为质数,那么:\[\varphi(n \times p)=\begin{cases}\varphi(n) \times \varphi(p)&p \nmid n\\\varphi(n) \times p&p \mid n\end{cases} \]
我们可以得到 \(\varphi(s) \mid \varphi(m)\)。
因此有 \(a^{\varphi(m)} =a^{\varphi(s) \times \frac{\varphi(m)}{\varphi(s)}}\equiv 1 \bmod s\)。
两遍同乘以 \(a^c\)(注意模数变成了 \(m\)),有 \(a^{\varphi(m)+c} \equiv a^{c}\)。
于是 \(a^b=a^{b-c+c} =a^c \times a^{b-c}\equiv a^{\varphi(m)+b},b \geq c\)。
因为任意 \(c \leq \varphi(m)\) 上式都成立,因此有 \(a^b \equiv a^{\varphi(m)+b}\)。
上式等价于 \(a^b \equiv a^{(b \bmod \varphi(m))+\varphi(m)}\)。
因此我们成功的证明了 \(a\) 是个质数的时候原式成立。
那么根据我们一开始的理论,可以证出原式对于任意 \(a\) 都成立。
综上,扩展欧拉定理成立。
4.3 辅助说明
扩展欧拉定理:
\(a^b \equiv \begin{cases}a^{b \bmod \varphi(m)}&\gcd(a,m)=1\\a^b&\gcd(a,m)\ne1,b \leq\varphi(m)\\a^{(b \bmod \varphi(m))+\varphi(m)}&\gcd(a,m)\ne1,b>\varphi(m)\end{cases}\)
首先观察一下第一个式子和第三个式子。
我们发现实际上这两个式子对于 \(b>\varphi(m)\) 的时候是等价的。
因此一般做题的时候我们不需要记第一个式子,只记第二个和第三个式子就好。
对于 \(b>\varphi(m)\) 的情况刚刚已经说过第一个式子与第二个式子等价。
对于 \(b \leq \varphi(m)\) 的情况因为 \(a^b=a^b\) 恒成立(难道不是吗),所以第一个式子和第二个式子等价。
当然如果出现了 \(\gcd(a,m)=1\) 的情况实际上我们可以直接用欧拉定理即可。
或许有的人问了:对于第二个式子 \(a^b \equiv a^b,\gcd(a,m) \ne 1,b \leq \varphi(m)\),为什么其不等价于第三个式子?
解释如下:
首先因为 \(\gcd(a,m) \ne 1\),我们知道欧拉定理不成立,也就是 \(a^{\varphi(m)} \not \equiv 1\)。
因此对第三个式子做一个拆分:\(a^b \equiv a^{b \bmod \varphi(m)} \times a^{\varphi(m)}\)。
我们发现因为 \(a^{\varphi(m)} \not \equiv 1\),因此我们不能在第二个式子两边同时乘以 \(a^{\varphi(m)}\)。
至于第三个式子可以其实是因为需要将 \(b\) 拆掉,这个时候需要 \(b > \varphi(m)\)。
4.4 例题
扩展欧拉定理板子题。
特别需要注意 \(b \leq \varphi(m)\) 的情况,此种情况 \(b\) 不能加上 \(\varphi(m)\)。
代码:
/*
========= Plozia =========
Author:Plozia
Problem:P5091 【模板】扩展欧拉定理
Date:2021/5/19
========= Plozia =========
*/
#include <bits/stdc++.h>
typedef long long LL;
// const int MAXN = ;
LL a, b, m, phi = 1;
bool flag = 0;
LL read()
{
LL sum = 0, fh = 1; char ch = getchar();
for (; ch < '0' || ch > '9'; ch = getchar()) fh -= (ch == '-') << 1;
for (; ch >= '0' && ch <= '9'; ch = getchar()) sum = (sum << 3) + (sum << 1) + (ch ^ 48);
return sum * fh;
}
LL Specail_read()
{
LL sum = 0, fh = 1; char ch = getchar();
for (; ch < '0' || ch > '9'; ch = getchar()) fh -= (ch == '-') << 1;
for (; ch >= '0' && ch <= '9'; ch = getchar())
{
sum = sum * 10ll + ch - '0';
if (sum > phi) { sum %= phi; flag = 1; }
}
return sum * fh;
}
LL ksm(LL fir, LL sec, LL p)
{
LL ans = 1 % p;
for (; sec; sec >>= 1, fir = fir * fir % p)
if (sec & 1) ans = ans * fir % p;
return ans;
}
void Get_phi()
{
int i, c = m;
for (i = 2; i * i <= c; ++i)
{
int sum = 0;
while (c % i == 0) { ++sum; c /= i; }
if (sum != 0) phi *= (LL)(i - 1) * ksm(i, sum - 1, m);
}
if (c != 1) phi *= (c - 1);
}
int main()
{
a = read(), m = read(); Get_phi();
b = Specail_read();
if (flag) b += phi;
printf("%lld\n", ksm(a, b, m));
return 0;
}
5. 总结
扩展欧拉定理:
\(a^b \equiv \begin{cases}a^{b \bmod \varphi(m)}&\gcd(a,m)=1\\a^b&\gcd(a,m)\ne1,b \leq\varphi(m)\\a^{(b \bmod \varphi(m))+\varphi(m)}&\gcd(a,m)\ne1,b>\varphi(m)\end{cases}\)