互质与欧拉函数
互质
对于 ,若 ,则称 互质
对于三个数或者更多个数的情况则这样讨论:
-
: 互质
-
: 两两互质
显然后者是一个更强的限制条件。
欧拉函数
中与 互质的数的个数被称为欧拉函数,记为 。
在算数基本定理中,由 我们可以得到:
Proof
容斥原理来帮忙。
设 是 的质因子, 中 的倍数有 ,共 个,同理若 也是 的质因子,则 中 的倍数有 个。如果我们把 个数去掉,那么 的倍数被删了两次,我们需要再加上一次,因此 中不与 含有共同质因子 的数的个数为:
对 的全部质因子使用容斥,就可以得到 中不与 互质的数的个数。
求单个数的欧拉函数值
我们可以从欧拉函数的计算式来看:分解质因数,就可以顺便求出欧拉函数了:
int phi(int n) {
int res = n;
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
res = res / i * (i - 1);
while (n % i == 0)
n /= i;
}
}
if (n > 1)
res = res / n * (n - 1);
return res;
}
欧拉函数的性质
- 虽然我觉得没有人会和我一样傻但是还是要说一下,注意到 😃
-
若 ,则
-
若 是积性函数,且在算数基本定理中 ,则
-
若 ,则
-
若 ,则
-
Proof
-
由 知与 不互质的数 成对出现,平均值为 ,所以与 互质的数的个数也是 。
-
我们从欧拉函数的计算式对 进行质因数分解,就能得到性质 2、3 了,由此推出“积性函数”的概念。
-
若 ,则 包含同样的质因子,只是 的指数不同。直接把 按照计算式写出来,然后相除,商为 ,性质 4 得证。
-
若 ,则 互质,我们从 是积性函数可以知道 ,而因为 显然 (在 中除 外,),性质 5 得证。
-
对于性质 6,我们设 ,然后用乘法分配律和 为积性函数展开得到:若 ,则 ,也就是 是积性函数。对于单个质因子 是一个等比数列求和再加 ,结果即为 ,所以 ,即 ,性质六得证。
不得惊叹于一个“简单的”、用于“计数”的函数竟然有如此丰富的性质。
积性函数
在欧拉函数的性质 3 中我们使用了“积性函数”的概念,这里做正式引入:
数论函数:亦称算术函数,指定义域为正整数、值域为复数的子集的函数
对于一个数论函数 ,若 ,有 ,则称 是一个积性函数
对于一个数论函数 ,若 ,有 ,则称 是一个完全积性函数
这三个东西显然是一个包含一个的。
从性质 3 中推广开来,不难发现任意的积性函数都可以用筛法来求。
给出一些常见的积性函数(自变量均为 ):
-
1 函数(完全积性):
-
幂函数(完全积性):
-
狄利克雷卷积单位元(完全积性):
-
因子幂和函数:
这个东西如果 时又称为 除数函数,表示 的因子个数
-
欧拉函数:
-
莫比乌斯函数:
-
最大公因数:
-
:以原点为圆心,半径为 的 圆上的整点个数(不包含一侧端点)
线性筛求欧拉函数
利用线性筛的思想可以在 的时间内快速递推出 中每个数的 。
由上述的性质 4、5,不难发现,在线性筛法中,每个合数 只会被它的最小质因子 筛一次。我们恰好可以执行:
这是一份 C++ 代码:
int v[N], pri[N], phi[N];
void Euler(const int n) {
m = 0;
for (int i = 2; i <= n; i++) {
if (!v[i]) { v[i] = i; pri[++m] = i; phi[i] = i - 1; }
for (int j = 1; j <= m; j++) {
if (pri[j] > v[i] && pri[j] > n / i)
break;
v[i * pri[j]] = pri[j];
phi[i * pri[j]] = phi[i] * (i % pri[j] ? pri[j] - 1 : pri[j]);
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效