数论函数初步

数论函数初步

数论函数

数论函数&狄利克雷卷积

  1. 定义:在全体(正)整数上定义的函数为数论函数

  2. 积性定义:
    完全积性:f(ab)=f(a)f(b)

    积性:若gcd(a,b)=1,则f(ab)=f(a)f(b)

    规律:如果f(x),g(x) 为积性函数,则一下函数也有积性:

    (f(x))1,f(x)g(x),f(g(x)),fg

  3. 积性函数举例:

    1(x)=1Id(x)=xϕ(x)I(x)=[x==1]

  4. 狄利克雷卷积

    定义数论函数f(n),g(n)的狄利克雷卷积为h(n)

    h(n)=d|nf(d)g(nd)

    h=fg

    定理:两个积性函数的卷积为积性函数。

    证明:

    h(xy)=d|xyf(d)g(xyd)=d1|xd2|yf(d1d2)g(xyd1d2)=d1|xd2|yf(d1)f(d2)g(xd1)g(yd2)=d1|xf(d1)g(xd1)d2|yf(d2)g(yd2)=h(x)h(y)

    定理:两个积性函数对应位置相乘也是积性函数

    由此,我们便可以定义更多数论函数,以卷积描述其之间的关系:

    d(n)=d|nd=11Id(n)=n=d|nId=ϕ1

    狄利克雷卷积性质:

    1. 交换律:设两个函数f(n),g(n),有 fg=gf

    2. 结合律:设三个积性函数f,g,h,有(fg)h=f(gh)

    3. I是单位元:对于任意数论函数ffI=If=f

      证明:fI=d|nf(d)I(nd)=f

    4. 定义:狄利克雷逆

      若有fg=I ,则数论函数f,g互为彼此的狄利克雷逆。

常见数论函数

单位函数: I(x)=[x==1]

幂函数:idk(n)=nk,id(n)=n

欧拉函数:ϕ(n)=i=0n1[gcd(x,n)==1]=n×d|n(11d)

莫比乌斯函数:μ

莫比乌斯反演

莫比乌斯函数

定义

定义莫比乌斯函数μ(x)

x=1时,μ(x)=1

xsquarefree number (无平方因数)时,设其质因数分解有k项,μ(x)=(1)k

否则,μ(x)=0

可以证得μ(x)为不完全积性函数:

gcd(x,y)=1,显然有μ(xy)=μ(x)μ(y)

定理

I=μ1,即μ1彼此互逆

证明:

x=1时,显然I=μ1

xsquarefree number时,显然I=μ1

x不为squarefree number时,设x=p1p2....pk

μ1=d|xμ(d)=i=1kkicμ(c)=i=1k(ki)(1)i=(11)k=[k==0]=I(x)

i=1k(ki)(1)i=(11)k使(x+y)k=i=0k(ki)xkiyi

莫比乌斯变换&反演

变换:设数论函数f,称F=f1 为莫比乌斯变换

反演:设数论函数F,称f=Fμ为莫比乌斯反演

线性筛

埃氏筛法

O(nloglogn)

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;
}

线性筛

O(n)

保证每个数只被其最小质因子筛去

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;
	}
}
线性筛的用处

筛出某些积性函数在1~n的所有取值

基本思路:

在第二个循环时,若i%prime[e]!=0,则易得f(iprime[e])=f(i)f(prime[e])

i%prime[e]==0,设prime[e]i中的指数为k,易得f(iprime[e])=f(prime[e]k+1)f(prime[e]k)f(i)

当然,要注意f(prime[e]k)!=0,如果等于0,也可以这样f(iprime[e])=f(iprime[e]k)f(prime[e]k+1)

例一

有一数论函数:

f(1)=1

f(Pk)=P^k (P代表质数)

f(xy)=f(x)f(y),gcd(x,y)=1

求出f(n)

这个直接动用一下上面的思路即可

例二——线筛欧拉函数

首先欧拉函数有以下性质

  1. ϕ(xy)=ϕ(x)ϕ(y),gcd(x,y)=1
  2. p|x,ϕ(p×x)=p×ϕ(x) ϕ(ka+1)ϕ(ka)=k
  3. ϕ(prime)=prime1

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]];
        }
    }
}
例三——线筛莫比乌斯函数
  1. 积性
  2. 函数定义
  3. μ(ka+1)μ(ka)=0

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]];
        }
    }
}

例四——求出约数个数

O(n)时间内求出函数τ1~n的所有取值

注:$\tau(n) n$的因数个数

这里可以发现:

  1. gcd(a,b)=1,τ(ab)=τ(a)τ(b)
  2. τ(prime)=2
  3. x=p1k1p2k2p3k3....pnkn,τ(x)=(k1+1)(k2+1)...(kn+1)

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;
	}
}

整数分块

例——求i=1i=nni

这个东东只有n 种取值,直接分块计算即可

练习

数论函数

数论函数&狄利克雷卷积

  1. 定义:在全体(正)整数上定义的函数为数论函数

  2. 积性定义:
    完全积性:f(ab)=f(a)f(b)

    积性:若gcd(a,b)=1,则f(ab)=f(a)f(b)

    规律:如果f(x),g(x) 为积性函数,则一下函数也有积性:

    (f(x))1,f(x)g(x),f(g(x)),fg

  3. 积性函数举例:

    1(x)=1Id(x)=xϕ(x)I(x)=[x==1]

  4. 狄利克雷卷积

    定义数论函数f(n),g(n)的狄利克雷卷积为h(n)

    h(n)=d|nf(d)g(nd)

    h=fg

    定理:两个积性函数的卷积为积性函数。

    证明:

    h(xy)=d|xyf(d)g(xyd)=d1|xd2|yf(d1d2)g(xyd1d2)=d1|xd2|yf(d1)f(d2)g(xd1)g(yd2)=d1|xf(d1)g(xd1)d2|yf(d2)g(yd2)=h(x)h(y)

    定理:两个积性函数对应位置相乘也是积性函数

    由此,我们便可以定义更多数论函数,以卷积描述其之间的关系:

    d(n)=d|nd=11Id(n)=n=d|nId=ϕ1

    狄利克雷卷积性质:

    1. 交换律:设两个函数f(n),g(n),有 fg=gf

    2. 结合律:设三个积性函数f,g,h,有(fg)h=f(gh)

    3. I是单位元:对于任意数论函数ffI=If=f

      证明:fI=d|nf(d)I(nd)=f

    4. 定义:狄利克雷逆

      若有fg=I ,则数论函数f,g互为彼此的狄利克雷逆。

常见数论函数

单位函数: I(x)=[x==1]

幂函数:idk(n)=nk,id(n)=n

欧拉函数:ϕ(n)=i=0n1[gcd(x,n)==1]=n×d|n(11d)

莫比乌斯函数:μ

莫比乌斯反演

莫比乌斯函数

定义

定义莫比乌斯函数μ(x)

x=1时,μ(x)=1

xsquarefree number (无平方因数)时,设其质因数分解有k项,μ(x)=(1)k

否则,μ(x)=0

可以证得μ(x)为不完全积性函数:

gcd(x,y)=1,显然有μ(xy)=μ(x)μ(y)

定理

I=μ1,即μ1彼此互逆

证明:

x=1时,显然I=μ1

xsquarefree number时,显然I=μ1

x不为squarefree number时,设x=p1p2....pk

μ1=d|xμ(d)=i=1kkicμ(c)=i=1k(ki)(1)i=(11)k=[k==0]=I(x)

i=1k(ki)(1)i=(11)k使(x+y)k=i=0k(ki)xkiyi

莫比乌斯变换&反演

变换:设数论函数f,称F=f1 为莫比乌斯变换

反演:设数论函数F,称f=Fμ为莫比乌斯反演

线性筛

埃氏筛法

O(nloglogn)

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;
}

线性筛

O(n)

保证每个数只被其最小质因子筛去

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;
	}
}
线性筛的用处

筛出某些积性函数在1~n的所有取值

基本思路:

在第二个循环时,若i%prime[e]!=0,则易得f(iprime[e])=f(i)f(prime[e])

i%prime[e]==0,设prime[e]i中的指数为k,易得f(iprime[e])=f(prime[e]k+1)f(prime[e]k)f(i)

当然,要注意f(prime[e]k)!=0,如果等于0,也可以这样f(iprime[e])=f(iprime[e]k)f(prime[e]k+1)

例一

有一数论函数:

f(1)=1

f(Pk)=P^k (P代表质数)

f(xy)=f(x)f(y),gcd(x,y)=1

求出f(n)

这个直接动用一下上面的思路即可

例二——线筛欧拉函数

首先欧拉函数有以下性质

  1. ϕ(xy)=ϕ(x)ϕ(y),gcd(x,y)=1
  2. p|x,ϕ(p×x)=p×ϕ(x) ϕ(ka+1)ϕ(ka)=k
  3. ϕ(prime)=prime1

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]];
        }
    }
}
例三——线筛莫比乌斯函数
  1. 积性
  2. 函数定义
  3. μ(ka+1)μ(ka)=0

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]];
        }
    }
}

例四——求出约数个数

O(n)时间内求出函数τ1~n的所有取值

注:$\tau(n) n$的因数个数

这里可以发现:

  1. gcd(a,b)=1,τ(ab)=τ(a)τ(b)
  2. τ(prime)=2
  3. x=p1k1p2k2p3k3....pnkn,τ(x)=(k1+1)(k2+1)...(kn+1)

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;
	}
}

整数分块

例——求i=1i=nni

这个东东只有n 种取值,直接分块计算即可

练习

posted @   轩Demonmaster  阅读(72)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示