数论函数初步
数论函数初步
数论函数
数论函数&狄利克雷卷积
-
定义:在全体(正)整数上定义的函数为数论函数
-
积性定义:
完全积性:积性:若,则
规律:如果 为积性函数,则一下函数也有积性:
-
积性函数举例:
-
狄利克雷卷积
定义数论函数的狄利克雷卷积为:
记
定理:两个积性函数的卷积为积性函数。
证明:
定理:两个积性函数对应位置相乘也是积性函数
由此,我们便可以定义更多数论函数,以卷积描述其之间的关系:
狄利克雷卷积性质:
-
交换律:设两个函数,有
-
结合律:设三个积性函数,有
-
是单位元:对于任意数论函数,
证明:
-
定义:狄利克雷逆
若有 ,则数论函数互为彼此的狄利克雷逆。
-
常见数论函数
单位函数:
幂函数:
欧拉函数:
莫比乌斯函数:
莫比乌斯反演
莫比乌斯函数
定义
定义莫比乌斯函数
当时,
当 是 (无平方因数)时,设其质因数分解有项,
否则,
可以证得为不完全积性函数:
若,显然有
定理
,即与彼此互逆
证明:
当时,显然
当为时,显然
当不为时,设:
莫比乌斯变换&反演
变换:设数论函数,称 为莫比乌斯变换
反演:设数论函数,称为莫比乌斯反演
线性筛
埃氏筛法
bool no[maxn];
int prime[maxn],tot;
for(int i=2;i<=n;i++){
if(no[i]) continue;
prime[++tot]=i;
for(int e=i+i;e<=n;e+=i) no[e]=1;
}
线性筛
保证每个数只被其最小质因子筛去
bool no[maxn];
int prime[maxn],top;
for(int i=2;i<=n;i++){
if(!no[i]) prime[++tot]=i;
for(int e=1;e<=top&&prime[e]*i<=n;i++){
no[prime[e]*i]=1;
if(i%prime[e]==0) break;
}
}
线性筛的用处
筛出某些积性函数在~的所有取值
基本思路:
在第二个循环时,若i%prime[e]!=0
,则易得
若i%prime[e]==0
,设在中的指数为,易得。
当然,要注意,如果等于,也可以这样
例一
有一数论函数:
^ (P代表质数)
求出
这个直接动用一下上面的思路即可
例二——线筛欧拉函数
首先欧拉函数有以下性质
CODE
int prime[maxn],top,phi[maxn];
bool no[maxn];
inline void oula(){
phi[1]=1;
for(int i=2;i<=n;i++){
if(!no[i]) prime[++top]=1,phi[i]=i-1;
for(int e=1;e<=top&&prime[e]*i<=n;e++){
no[prime[e]*i]=1;
if(i%prime[e]==0){
phi[i*prime[e]]=phi[e]*phi[i];
break;
}
phi[i*prime[e]]=phi[i]*phi[prime[e]];
}
}
}
例三——线筛莫比乌斯函数
- 积性
- 函数定义
CODE
int prime[maxn],top,mu[maxn];
bool no[maxn];
inline void oula(){
mu[1]=1;
for(int i=2;i<=n;i++){
if(!no[i]) prime[++top]=1,mu[i]=-1;
for(int e=1;e<=top&&prime[e]*i<=n;e++){
no[prime[e]*i]=1;
if(i%prime[e]==0){
mu[i*prime[e]]=0;//因子有平方数
break;
}
mu[i*prime[e]]=mu[i]*mu[prime[e]];
}
}
}
例四——求出约数个数
在时间内求出函数在~的所有取值
注:$\tau(n) n$的因数个数
这里可以发现:
CDOE
for(int i = 2; i <= n; i++){
if(isp[i] == 0) {pr[++cnt] = i; tau[i] = 2; g[i] = 2;}
for(int j = 1; j <= cnt && pr[j] * i <= n; j++){
isp[i * pr[j]] = 1;
if(i % pr[j] == 0) {
tau[i * pr[j]] = (g[i] + 1) * tau[i] / g[i];
g[i * pr[j]] = g[i] + 1;
break;
}
tau[i * pr[j]] = tau[i] * 2;
g[i * pr[j]] = 2;
}
}
整数分块
例——求
这个东东只有 种取值,直接分块计算即可
练习
一
数论函数
数论函数&狄利克雷卷积
-
定义:在全体(正)整数上定义的函数为数论函数
-
积性定义:
完全积性:积性:若,则
规律:如果 为积性函数,则一下函数也有积性:
-
积性函数举例:
-
狄利克雷卷积
定义数论函数的狄利克雷卷积为:
记
定理:两个积性函数的卷积为积性函数。
证明:
定理:两个积性函数对应位置相乘也是积性函数
由此,我们便可以定义更多数论函数,以卷积描述其之间的关系:
狄利克雷卷积性质:
-
交换律:设两个函数,有
-
结合律:设三个积性函数,有
-
是单位元:对于任意数论函数,
证明:
-
定义:狄利克雷逆
若有 ,则数论函数互为彼此的狄利克雷逆。
-
常见数论函数
单位函数:
幂函数:
欧拉函数:
莫比乌斯函数:
莫比乌斯反演
莫比乌斯函数
定义
定义莫比乌斯函数
当时,
当 是 (无平方因数)时,设其质因数分解有项,
否则,
可以证得为不完全积性函数:
若,显然有
定理
,即与彼此互逆
证明:
当时,显然
当为时,显然
当不为时,设:
莫比乌斯变换&反演
变换:设数论函数,称 为莫比乌斯变换
反演:设数论函数,称为莫比乌斯反演
线性筛
埃氏筛法
bool no[maxn];
int prime[maxn],tot;
for(int i=2;i<=n;i++){
if(no[i]) continue;
prime[++tot]=i;
for(int e=i+i;e<=n;e+=i) no[e]=1;
}
线性筛
保证每个数只被其最小质因子筛去
bool no[maxn];
int prime[maxn],top;
for(int i=2;i<=n;i++){
if(!no[i]) prime[++tot]=i;
for(int e=1;e<=top&&prime[e]*i<=n;i++){
no[prime[e]*i]=1;
if(i%prime[e]==0) break;
}
}
线性筛的用处
筛出某些积性函数在~的所有取值
基本思路:
在第二个循环时,若i%prime[e]!=0
,则易得
若i%prime[e]==0
,设在中的指数为,易得。
当然,要注意,如果等于,也可以这样
例一
有一数论函数:
^ (P代表质数)
求出
这个直接动用一下上面的思路即可
例二——线筛欧拉函数
首先欧拉函数有以下性质
CODE
int prime[maxn],top,phi[maxn];
bool no[maxn];
inline void oula(){
phi[1]=1;
for(int i=2;i<=n;i++){
if(!no[i]) prime[++top]=1,phi[i]=i-1;
for(int e=1;e<=top&&prime[e]*i<=n;e++){
no[prime[e]*i]=1;
if(i%prime[e]==0){
phi[i*prime[e]]=phi[e]*phi[i];
break;
}
phi[i*prime[e]]=phi[i]*phi[prime[e]];
}
}
}
例三——线筛莫比乌斯函数
- 积性
- 函数定义
CODE
int prime[maxn],top,mu[maxn];
bool no[maxn];
inline void oula(){
mu[1]=1;
for(int i=2;i<=n;i++){
if(!no[i]) prime[++top]=1,mu[i]=-1;
for(int e=1;e<=top&&prime[e]*i<=n;e++){
no[prime[e]*i]=1;
if(i%prime[e]==0){
mu[i*prime[e]]=0;//因子有平方数
break;
}
mu[i*prime[e]]=mu[i]*mu[prime[e]];
}
}
}
例四——求出约数个数
在时间内求出函数在~的所有取值
注:$\tau(n) n$的因数个数
这里可以发现:
CDOE
for(int i = 2; i <= n; i++){
if(isp[i] == 0) {pr[++cnt] = i; tau[i] = 2; g[i] = 2;}
for(int j = 1; j <= cnt && pr[j] * i <= n; j++){
isp[i * pr[j]] = 1;
if(i % pr[j] == 0) {
tau[i * pr[j]] = (g[i] + 1) * tau[i] / g[i];
g[i * pr[j]] = g[i] + 1;
break;
}
tau[i * pr[j]] = tau[i] * 2;
g[i * pr[j]] = 2;
}
}
整数分块
例——求
这个东东只有 种取值,直接分块计算即可
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效