欧拉函数
欧拉函数
欧拉函数是一类非常重要的数论函数
建议阅读 数论函数基础 章节,了解基本概念与先要知识
全文 绝大多数 内容是对 [0] 中讲述的 粗略抄写 和 胡乱加工
1. 定义与性质
定义
在
形式化的说,
性质
-
显然,当
时,有质数和 小于它的所有数 互质
-
在
中所有非 整倍数的数均与 互质,故有证明显然
-
是 积性函数,即若 ,则数论函数基础 - 常见函数,分类及证明 中给出了 两种思路的详细证明
-
计算式
根据前两条性质,以及 唯一分解 容易证明
-
若
,则由于
,故 的 质因数 包含 的 质因数换言之,
的 本质不同质因数集 等于 的 本质不同质因数集故根据计算式
同理可以证明
时有 ( 部分可以整除) -
若
,则考虑 计算式,
当且仅当 时为 奇数,然后容易证明 -
使得
的 个数为令
,于是有 ,然后就 根据定义显然 了 -
,也被称为 欧拉反演这里给出一种不同于 [0] 中的证明思路
我们考虑使用 莫比乌斯反演,即
我们代入
,于是我们尝试证明考虑
的特性,当且仅当 ( 互不相同 且是 的 质因子)时,才会有贡献而当
有 偶数个质因子 时, 为 正,反之 贡献为 负这与计算式
的 容斥系数 相符合容易知道它们相等
不够直观的话我们来举个例子,设有
根据 计算式
而使得
的 显然只有 这几种取值对应有式子
显然上下相等
2. 线性筛欧拉函数
根据 计算式,我们有一个 简易 的实现,我们知道
其实就是每个 质因数 只计算一次贡献,可以写出代码如下
inline void Sieve () {
phi[1] = 1;
for (uint32_t i = 2; i <= N; ++ i) {
if (!Vis[i]) pri[++ Cnt] = i, phi[i] = i - 1;
for (uint32_t k = 1; k <= Cnt && pri[k] * i <= N; ++ k) {
Vis[i * pri[k]] = 1;
if (i % pri[k] == 0) {
phi[i * pri[k]] = phi[i] * pri[k];
break ;
}
else phi[i * pri[k]] = phi[i] * (pri[k] - 1);
}
}
}
我们注意到
,而 ,故
3. 欧拉定理
其实就是 费马小定理 的
我们发现,
也就是说当
时, 的余数就是 与 互质的数的某种排列 证明与前面 费马小定理 相似,显然两个集合元素个数均为
个,只需证明 元素不重 考虑反证,相同时必然不符合 互质条件,故易得
于是我们把这
数相乘,显然其在 意义下成立,即有 故容易有
可以知道
,故两边可以同时 除掉这一部分,得到
4. 扩展欧拉定理
证明似乎需要 巨大量分讨?今天脑子太糊了,鸽了
转一个
上的证明 [1] 形式证明
证明转载自 synapse7,并进行了一些整理。
- 命题:
的从 0 次, 1 次到 次幂模 构成的序列中,存在 和 ,使得前 个数(即从 到 互不相同,从第 个数开始,每 个数就循环一次。 证明:
- 由鸽巢定理易证。
我们把
称为 幂次模 的循环起始点, 称为循环长度。(注意: 可以为 0 )
用公式表述为:
2. 命题:为素数的情况,该式成立。 证明:
- 若模
不能被 整除,而因为 是一个素数,那么 成立,根据欧拉定理,容易证明该式成立。 - 若模
能被 整除,那么存在 和 使得 ,且 成立。所以根据欧拉定理有 。
又由于,所以根据欧拉函数的求值规则,容易得到:
,即我们有: 。
所以, 即
,两边同时乘以,得 (因为 )
所以对于中素因子 的次数 满足: 。我们可以简单变换形式,得到 推论: 又由于
,所以 (tips: 是素数,最小是 2 ,而 )。
所以因为,故有: 所以
- 命题:
为素数的幂的情况,该式成立 证明:
- 不妨令
,是否依然有 ? 答案是肯定的,由命题1 可知存在
使得 ,所以 ,所以令 时,我们能有 。
此时有关系:且 ,且 ,由 与 的关系,依然可以得到 。
4. 命题:为合数的情况,该式成立。 证明:
- 只证
拆成两个素数的幂的情况,大于两个的用数学归纳法可证。设 , 其中 ,而 的循环长度为 ;
则,由于 ,那么 ,所以 , ;
由与 的关系,依然可以得到 。证毕。
Luogu P5091 【模板】扩展欧拉定理
啊对,就是板子
#include <bits/stdc++.h>
uint32_t A, M, P, K;
bool BiggerthanM;
std::string B;
inline uint32_t phi (uint32_t x) {
uint32_t Ret = x;
for (uint32_t i = 2; i <= sqrt (x); ++ i)
if (x % i == 0) {
Ret = Ret / i * (i - 1);
while (x % i == 0) x = x / i;
}
if (x > 1) Ret = Ret / x * (x - 1);
return Ret;
}
inline uint32_t phi_mod_b () {
uint32_t Ret = 0, Val = 0;
for (uint32_t i = 0; i < B.size (); ++ i) {
Ret = (Ret * 10 + (B[i] - '0')) % P, Val = Val * 10 + (B[i] - '0');
if (Val > M) BiggerthanM = 1;
}
return Ret;
}
inline uint32_t qpow (uint32_t a, uint32_t b) {
uint32_t Ret = 1;
while (b) {
if (b & 1) Ret = 1ull * a * Ret % M;
a = 1ull * a * a % M, b >>= 1;
}
return Ret;
}
int main () {
std::ios::sync_with_stdio(0);
std::cin.tie(0), std::cout.tie(0);
std::cin >> A >> M >> B;
P = phi (M), K = phi_mod_b ();
if (std::__gcd (A, M) == 1) std::cout << qpow (A, K) << '\n';
else if (!BiggerthanM) std::cout << qpow (A, atoi (B.data ())) << '\n';
else std::cout << qpow (A, K + P) << '\n';
return 0;
}
Luogu P2158 [SDOI2008] 仪仗队
唐氏题,转化一下题意就是求 分母小于
容易想到 欧拉函数前缀和,然后随便做
尝试了一下用
(甚至本地可以过
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
const int MAXN = 40005;
uint32_t pri[40005], phi[40005];
uint32_t Cnt = 0, Sum = 0, N;
bool Vis[40005];
void Sieve () {
phi[1] = 1;
for (uint32_t i = 2; i <= N; ++ i) {
if (!Vis[i]) pri[++ Cnt] = i, phi[i] = i - 1;
for (uint32_t j = 1; j <= Cnt && pri[j] * i <= N; ++ j) {
Vis[i * pri[j]] = 1;
if (i % pri[j] == 0) {
phi[i * pri[j]] = pri[j] * phi[i];
break ;
}
phi[i * pri[j]] = phi[i] * (pri[j] - 1);
}
}
}
int main () {
scanf ("%u", &N);
Sieve ();
for (uint32_t i = 1; i < N; ++ i) Sum += phi[i];
printf ("%u\n" ,(Sum << 1) + (N > 1));
return 0;
}
#include <bits/stdc++.h>
struct Frac {
uint32_t x, y;
inline Frac operator + (const Frac &a) const {
return {x + a.x, y + a.y};
}
};
uint32_t N, Cnt;
inline void DFS (const Frac l, const Frac r) {
Frac m = (l + r);
if (m.x > N || m.x < m.y || m.y > N) [[unlikely]] return ;
++ Cnt, DFS (l, m), DFS (m, r);
}
int main () {
std::cin >> N, -- N;
// if (N > 35000) return 1;
DFS ({0, 1}, {1, 0});
std::cout << (Cnt << 1) + (N > 0) << '\n';
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具