欧拉函数
定义
欧拉函数是小于x的整数中与x互质的数的个数,一般用φ(x)表示。特殊的,φ(1)=1
计算通式
φ(x)=x
φ(1)=1
其中为x的所有质因数,x是正整数。
理解:对于x的一个质因数,因为x以内的倍数是均匀分布的,所以x以内有的数是的倍数,那么有的数不是的倍数,则有的数与x互质。
欧拉函数的性质
-
质数p, φ(p)=p-1
-
质数p, 若,则φ(p)=
代入计算通式易得
- 欧拉函数是积性函数,但不是完全积性函数。
由互质,计算通式相乘可以证明。
- 小于n的数中,与n互质的数的总和为:φ(n) * n / 2 (n>1)
与n互质的数一个是m,那么还存在另一个数n-m也与n互质。所以与n互质的数的平均数是n/2,而个数又是φ(n),可以得到这些数的和就是φ(n)*n/2
- 当n>2时,φ(n)是偶数
- , 即n的因数(包括1和它自己)的欧拉函数之和等于n
求欧拉函数
以最坏时间复杂度 内求得指定正整数的欧拉函数值。
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); // 最后剩下的部分也是原来的n的质因数 return res; }
在欧拉筛途中顺便求出
int cnt = 0; bool vis[50004]; int prim[50004]; int phi[50004]; void sieve(int n) { vis[1] = 1;phi[1] = 1; for(int i=2;i<=n;++i) { if(vis[i]==0){ prim[++cnt] = i; phi[i] = i - 1; } for(int j=1;j<=cnt&&i*prim[j]<=n;++j) { vis[i*prim[j]] = 1; if(i%prim[j]==0){ phi[i*prim[j]] = phi[i] * prim[j]; break; } else phi[i*prime[j]]=phi[i]*phi[prime[j]]; } } }
题目
积性函数
若当m与n互质时,$f ( m \times n ) = f ( m ) \times f ( n ) f(m\times n)=f(m)\times f(n)$成立,则f是完全积性函数。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效