数论专题-学习笔记:欧拉定理与扩展欧拉定理
1. 前言
欧拉定理与扩展欧拉定理,是数论中的一个很重要的定理。
该定理可以将形如 的式子的指数降得很低,通常可以降到 可接受范围内,这样就可以用快速幂计算了。
若无特殊说明,本文所有数都是正整数。
一些符号说明:
2. 前置知识
费马小定理:若 为质数并且 ,则 。
3. 欧拉定理
3.1 描述
欧拉定理描述如下:
若 ,则 。
结合上面的费马小定理可以发现,费马小定理实际上就是欧拉定理的一种特殊情况。
3.2 证明
设 为 个与 互质的数。
令 。
下面若无特殊说明,同余式均对 取模。
引理 1:。
证明如下:首先因为所有 ,那么必然有 。
接下来反证法,假设 。
那么有 。
则 。
但是 ,因此 。但是 且小于 ,矛盾。
综上引理 1 成立。
引理 2:所有 模 的结果都与 互质。
证明如下:
还是反证法。
设 ,即除以 ,那么有 。
整理得 。
因为 是个正整数,所以 。
所以 。
然而 ,因此只有 才能够做到 。
所以 。
但是因为 ,因此就要有 且 ,显然与假设矛盾,因此原假设错误。
综上,引理 2 成立。
有了这两个引理之后,我们就可以证明欧拉定理了。
由引理 2,所有 模 的结果都与 互质。
由引理 1,任意两个 之间模 不同余,任意两个 之间模 不同余。
因此我们可以得到所有 模 的结果组成的集合与 模 的结果组成的集合是相同的。
因此我们就有 。
由同余式的基本性质,约去 ,我们可以得到 。
综上,欧拉定理成立。
4. 扩展欧拉定理
4.1 描述
扩展欧拉定理是欧拉定理的扩展,该定理将欧拉定理扩展到了 为任意数的情况。
其描述如下(均对 取模):
4.2 证明
下面同余式无说明均对 取模。
。
这个还是比较简单的。
由欧拉定理,,因此实际上我们两遍同时除以 是可行的。
因此原式得证。
。
啊不是这还需要证明吗qwq
。
首先对 做一个质因数分解 。
因此根据同余式可以同乘的性质,我们的目标变成了证明 时上式成立。
显然 也是可以由 个 同乘的,因此我们的最终目的变成了证明当 是个质数的时候上式成立。
接下来的证明都只考虑 为质数。
考虑引入一个数 与 互质,令 。
- 实际上 是必定成立的,因为总共与 互质的数有 个,而且,因此有 。
根据欧拉定理,有 。
因为 ,根据欧拉函数的下面这条性质:
- 设 为质数,那么:
我们可以得到 。
因此有 。
两遍同乘以 (注意模数变成了 ),有 。
于是 。
因为任意 上式都成立,因此有 。
上式等价于 。
因此我们成功的证明了 是个质数的时候原式成立。
那么根据我们一开始的理论,可以证出原式对于任意 都成立。
综上,扩展欧拉定理成立。
4.3 辅助说明
扩展欧拉定理:
首先观察一下第一个式子和第三个式子。
我们发现实际上这两个式子对于 的时候是等价的。
因此一般做题的时候我们不需要记第一个式子,只记第二个和第三个式子就好。
对于 的情况刚刚已经说过第一个式子与第二个式子等价。
对于 的情况因为 恒成立(难道不是吗),所以第一个式子和第二个式子等价。
当然如果出现了 的情况实际上我们可以直接用欧拉定理即可。
或许有的人问了:对于第二个式子 ,为什么其不等价于第三个式子?
解释如下:
首先因为 ,我们知道欧拉定理不成立,也就是 。
因此对第三个式子做一个拆分:。
我们发现因为 ,因此我们不能在第二个式子两边同时乘以 。
至于第三个式子可以其实是因为需要将 拆掉,这个时候需要 。
4.4 例题
扩展欧拉定理板子题。
特别需要注意 的情况,此种情况 不能加上 。
代码:
/*
========= 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. 总结
扩展欧拉定理:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具