【数学】加性函数与积性函数

一、前置知识

艾佛森括号

[P]={1if P is true0otherwise

其中 P 是一个可真可假的命题。

[1145141919810]=1,[1N]=0

二、加性函数

加性函数:对于 n,mN,gcd(n,m)=1,若 f(n)+f(m)=f(nm),称函数 f 为加性函数;

注:此处加性函数指数论上的加性函数 (Additive function),应与代数中的加性函数 (Additive map) 区分。

完全加性函数:对于 n,mN,若 f(n)+f(m)=f(nm),称函数 f 为完全加性函数。完全加性函数为加性函数的一种。

对于所有的加性函数,根据 f(1)=f(1×1)=f(1)+f(1) 可得 f(1)=0

加性函数 f 满足 f(i=1kpiαi)=i=1kf(piαi),完全加性函数 f 满足 f(i=1kpiαi)=i=1kf(piαi)=i=1kf(pi)αi


证明时,先证明 f(1)=0

然后证明加性需证明 gcd(n,m)=1f(n)+f(m)=f(nm)(废话);

证明完全加性只需证明 f(n)+f(pi)=f(npi),piP 即可,因为证明 f(n)+f(m)=f(nm) 可将 m 分解质因数再合并。


常见加性函数

  • ω(n)=pP[pn] 表示 n 的本质不同质因数个数

    证明:

    ω(1)=pP[p1]=0

    gcd(n,m)=1 时,

    ω(nm)=pP[pnm]=pP[pn][pm]=pP[pn]+pP[pm]pP[pn][pm]=pP[pn]+pP[pm]pP[pgcd(n,m)]=pP[pn]+pP[pm]pP[p1] (不互质时不满足)=ω(n)+ω(m)ω(1)=ω(n)+ω(m)

  • a1(n)=pP[pn]p 表示 n 的本质不同质因数和

    证明:

    a1(1)=pP[p1]p=0

    gcd(n,m)=1 时,

    a1(nm)=pP[pnm]p=pP([pn][pm])p=pP[pn]p+pP[pm]ppP([pn][pm])p=a1(n)+a1(m)a1(1) (不互质时不满足)=a1(n)+a1(m)

常见完全加性函数

  • Ω(n)=pPpαn1(α>0) 表示 n 的总质因数个数

    证明:

    Ω(1)=pPpα11=0

    首先由 piPΩ(pi)=pPpαpi1=1

    Ω(npi)=pPpαnpi1=pPppipαnpi1+piαnpi1=pPppipαn1+(piαn1+1)=(pPppipαn1+piαn1)+1=pPpαn1+1=Ω(n)+Ω(pi)

  • a0(n)=pPpαnp 表示 n 的总质因数和

    证明:

    a0(1)=pPpα1p=0

    首先由 piPa0(pi)=pPpαpip=pi

    a0(npi)=pPpαnpip=pPppipαnpip+piαnpipi=pPppipαnp+piαnpi+pi=pPpαnp+pi=a0(n)+a0(pi)

  • potp(n)(pP)=maxpkn{k} 表示使得 pk∣∣n(pkn,pk+1n)k

    证明:

    potp(1)=maxpk1{k}=0

    首先由 p,piPpotppi=maxpkpi{k}=[p=pi]

    p=pi 时:

    potp(npi)=potpi(npi)=maxpiknpi{k}=maxpikn{k}+1=potpi(n)+1=potp(n)+1

    ppi 时:

    potp(npi)=maxpknpi{k}=maxpkn{k}=potp(n)

    所以有

    potp(npi)=potp(n)+[p=pi]=potp(n)+potp(pi)

三、积性函数

积性函数:对于 n,mN,gcd(n,m)=1, 若 f(n)f(m)=f(nm),称函数 f 为积性函数;

完全积性函数:对于 n,mN,若 f(n)f(m)=f(nm),称函数 f 为完全积性函数。完全积性函数为积性函数的一种。

对于所有的积性函数,根据 f(1)=f(1×1)=f(1)f(1) 可得 f(1)=1

注意:值恒等于 0 的函数一般不看作积性函数。

积性函数 f 满足 f(i=1kpiαi)=i=1kf(piαi),完全积性函数 f 满足 f(i=1kpiαi)=i=1kf(piαi)=i=1kf(pi)αi


加性函数与积性函数的互相转化

若函数 f 为加性函数,函数 g 满足 g(n)=Cf(n),其中 C 为常数。

首先 g(1)=Cf(1)=C0=1

gcd(n,m)=1 时,g(n)g(m)=Cf(n)+f(m),由 f 为加性函数可得 Cf(n)+f(m)=Cf(nm),即 g(n)g(m)=g(nm),所以函数 g 为积性函数。

同理,当函数 f 为完全加性函数时,函数 g 为完全积性函数。


证明时,先证明 f(1)=1

然后证明积性需证明 gcd(n,m)=1f(n)f(m)=f(nm)

证明完全积性只需证明 f(n)f(pi)=f(npi),piP 即可,因为证明 f(n)f(m)=f(nm) 可将 m 分解质因数再合并。


常见积性函数

  • 常数 k 固定时的最大公因数 gcd(k,n)

    证明:

    gcd(1,n)=1

    gcd(n,m)=1 时,gcd(k,n)gcd(k,m)=gcd(k,nm)

  • 欧拉函数 φ(n)=i=1n[gcd(i,n)=1]

    或将 n 分解质因数 n=i=1kpiαiφ(n)=ni=1kpi1pi

    证明:

    φ(1)=i=11[gcd(i,1)=1]=1

    gcd(n,m)=1 时,

    φ(n)φ(m)=i=1n[gcd(i,n)=1]j=1m[gcd(j,m)=1]=i=1nj=1m[gcd(i,n)=1][gcd(j,m)=1]=i=1nm[gcd(i,nm)=1] (不互质时为i=1lcm(n,m)[gcd(i,lcm(n,m))=1])=φ(nm) (不互质时为 φ(lcm(n,m)))

  • γ(n)=(1)ω(n)

    证明:

    因为 ω 为加性函数,(1) 为常数,所以 γ 为积性函数。

  • 莫比乌斯函数 μ(n)={1n=10d>1,d2nγ(n)otherwise

    证明:

    μ(1)=1

    n,m 中有一者为 1 时,不妨设 n=1,则 μ(nm)=μ(m)=1μ(m)=μ(n)μ(m)

    d>1,d2n 时,必有 d>1,d2nm,则 μ(nm)=0=0μ(m)=μ(n)μ(m)

    否则,说明 μ(n)=γ(n),μ(m)=γ(m),当 gcd(n,m)=1 时,由 γ(n)γ(m)=γ(nm) 可得 μ(n)μ(m)=μ(nm)

  • 除数函数 σk(n)=dndk,因数个数函数 d(n)=dn1=σ0(n),因数和函数 σ(n)=dnd=σ1(n)

    证明:

    σk(1)=d1dk=1k=1

    gcd(n,m)=1 时,

    σk(n)σk(m)=d1nd1kd2md2k=d1nd2md1kd2k=d1nd2m(d1d2)k=dnmdk(不互质时不满足)=σk(nm)

常见完全积性函数

  • 逆元 a1modp(当逆元存在时)

    证明:

    a1modp=1amodpb1modp=1bmodp(a1modp)(b1modp)=(1amodp)(1bmodp)=(1a1b)modp=1abmodp=(ab)1modp

  • 刘维尔函数 λ(n)=(1)Ω(n)

    证明:

    因为 Ω 为完全加性函数,(1) 为常数,所以 λ 为积性函数。

  • 幂函数 Idk(n)=nk,常数函数 I(n)1(n)=1=Id0(n),恒等函数 Id(n)=n=Id1(n)

    证明:

    Idk(1)=1k=1

    Idk(n)Idk(m)=nkmk=(nm)k=Idk(nm)

  • 单位函数 ε(n)=[n=1]

    证明:

    ε(1)=[1=1]=1

    ε(n)ε(m)=[n=1][m=1]=[nm=1]=ε(nm)

四、线性筛

主要是常见积性函数的,加性函数是类似的。

套路是在线性筛中

void pre(int n) // 线性筛积性函数 f
{
	f[1] = 1; // 注意这里,积性函数基本性质
	for (int i = 2; i <= n; i++)
	{
		if (!vis[i])
		{
			p[++p[0]] = i;
			f[i] = ???; //质数得直接算
		}
		for (int j = 1; j <= p[0] && i * p[j] <= n; j++)
		{
			vis[i * p[j]] = true;
			if (i % p[j] == 0)
			{
				f[i * p[j]] = ???; // 特殊情况
				break;
			}
			f[i * p[j]] = f[i] * f[p[j]]; // 一般情况
		}
	}
}

像上面一样分类,原因是当 i % p[j] == 0 ,即 pji 时有 gcd(i,pj)>1,不满足积性,得单独处理;否则有 gcd(i,pj)=1,则 f(i)f(pj)=f(ipj)

用线性筛,时间复杂度为 O(n)

1. 最大公因数

  • iP

    gcd(k,i) 暴力算是 O(logn) 的,由于 π(n)nlogn,所以所有质数暴力算是 O(n) 的。当然因为是质数你也可以用 ifO(1) 计算。

  • pji

    gcd(k,ipj)=gcd(k,i)gcd(k,pj)

  • pji

    • pjkgcd(k,i),则 gcd(k,ipj)=gcd(k,i)pj
    • 否则 gcd(k,ipj)=gcd(k,i)
void pre(int n, int k)
{
	gcd[1] = 1;
	for (int i = 2; i <= n; i++)
	{
		if (!vis[i])
		{
			p[++p[0]] = i;
			if (i % k == 0)
			{
				gcd[i] = k;
			}
			else if (k % i == 0)
			{
				gcd[i] = i;
			}
			else
			{
				gcd[i] = 1;
			}
		}
		for (int j = 1; j <= p[0] && i * p[j] <= n; j++)
		{
			vis[i * p[j]] = true;
			if (i % p[j] == 0)
			{
				gcd[i * p[j]] = ((k / gcd[i]) % p[j]) ? gcd[i] : (gcd[i] * p[j]);
				break;
			}
			gcd[i * p[j]] = gcd[i] * gcd[p[j]];
		}
	}
}

2. 欧拉函数

  • iP

    φ(i)=i1

  • pji

    φ(ipj)=φ(i)φ(pj)

  • pji

    ​ 原来长这个样子:ix=1kpx1px

    ​ 现在是 (ipj)x=1kpx1px

    φ(ipj)=φ(i)pj

void pre(int n)
{
	phi[1] = 1;
	for (int i = 2; i <= n; i++)
	{
		if (!vis[i])
		{
			p[++p[0]] = i;
			phi[i] = i - 1;
		}
		for (int j = 1; j <= p[0] && i * p[j] <= n; j++)
		{
			vis[i * p[j]] = true;
			if (i % p[j] == 0)
			{
				phi[i * p[j]] = phi[i] * p[j];
				break;
			}
			phi[i * p[j]] = phi[i] * phi[p[j]];
		}
	}
}

3. 莫比乌斯函数

  • iP

    μ(i)=1

  • pji

    μ(ipj)=μ(i)μ(pj)

  • pji

    pj2μ(ipj)μ(ipj)=0

void pre(int n)
{
	mu[1] = 1;
	for (int i = 2; i <= n; i++)
	{
		if (!vis[i])
		{
			p[++p[0]] = i;
			mu[i] = -1;
		}
		for (int j = 1; j <= p[0] && i * p[j] <= n; j++)
		{
			vis[i * p[j]] = true;
			if (i % p[j] == 0)
			{
				mu[i * p[j]] = 0;
				break;
			}
			mu[i * p[j]] = mu[i] * mu[p[j]];
		}
	}
}

4. 因数个数函数

由算术基本定理得 n=i=1kpiαi,那么我们知道 d(n)=i=1k(αi+1)

num(n)n 的最小质因数的次数,即 α1

  • iP

    d(i)=2

    num(i)=1

  • pji

    d(ipj)=d(i)d(pj)

    (ipj) 的最小质因数为 pjnum(ipj)=1

  • pji

    ​ 此时 pj 仍为最小质因数,故 α1 增加了一,d(ipj)=d(i)α1+1(α1+2)=d(i)num(i)+1(num(i)+2)

    num(ipj)=num(i)+1

void pre(int n)
{
	d[1] = 1;
	for (int i = 2; i <= n; i++)
	{
		if (!vis[i])
		{
			p[++p[0]] = i;
			d[i] = 2;
			num[i] = 1;
		}
		for (int j = 1; j <= p[0] && i * p[j] <= n; j++)
		{
			vis[i * p[j]] = true;
			if (i % p[j] == 0)
			{
				d[i * p[j]] = d[i] / (num[i] + 1) * (num[i] + 2);
				num[i * p[j]] = num[i] + 1;
				break;
			}
			d[i * p[j]] = d[i] * d[p[j]];
			num[i * p[j]] = 1;
		}
	}
}

5. 因数和函数

首先 σ(n)=i=1kj=0αipij

num(n)n 的最小质因数 p1i=0α1p1i

  • iP

    σ(i)=num(i)=i+1

  • pji

    σ(ipj)=σ(i)σ(pj)

    num(ipj)=1+pj

  • pji

    p1 这一项从 i=0αip1i 变成 i=0αi+1p1i,那么将原来的集体乘 p1 再加 1 即可。

    σ(ipj)=σ(i)k=0α1p1kk=0α1+1p1k=σ(i)num(i)[num(i)pj+1]

    num(ipj)=num(i)pj+1

UVA1730 Sum of MSLCM(终于有题写了

void pre(int n)
{
	sigma[1] = 1;
	for (int i = 2; i <= n; i++)
	{
		if (!vis[i])
		{
			p[++p[0]] = i;
			sigma[i] = i + 1;
			num[i] = i + 1;
		}
		for (int j = 1; j <= p[0] && i * p[j] <= n; j++)
		{
			vis[i * p[j]] = true;
			if (i % p[j] == 0)
			{
				sigma[i * p[j]] = sigma[i] / num[i] * (num[i] * p[j] + 1);
				num[i * p[j]] = num[i] * p[j] + 1;
				break;
			}
			sigma[i * p[j]] = sigma[i] * sigma[p[j]];
			num[i * p[j]] = 1 + p[j];
		}
	}
}

五、参考资料

posted @   mango09  阅读(1090)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
-->
点击右上角即可分享
微信分享提示