Learning:数论(二) 积性函数

7 篇文章 1 订阅
4 篇文章 0 订阅

前置知识:狄利克雷卷积、线性筛
积性函数的定义若数论函数 f f f满足 ∀ a ⊥ b , f ( a ) ⋅ f ( b ) = f ( a b ) \forall a\perp b,f(a)\cdot f(b)=f(ab) ab,f(a)f(b)=f(ab),则 f f f是一个积性函数
完全积性函数:若数论函数 f f f满足 ∀ a , b ∈ Z + , f ( a ) ⋅ f ( b ) = f ( a b ) \forall a,b\in Z_+,f(a)\cdot f(b)=f(ab) a,bZ+,f(a)f(b)=f(ab),则 f f f是一个完全积性函数
常见的积性函数有欧拉函数 ϕ \phi ϕ,莫比乌斯函数 μ \mu μ,约数和 σ 0 \sigma_0 σ0
积性函数的一个性质:若 f , g f,g f,g都是积性函数,则 f f f g g g的狄利克雷卷积 f ∗ g f*g fg也为积性函数
证明:
h = f ∗ g h=f*g h=fg
对于任意的 a ⊥ b a\perp b ab,有:
h ( a b ) = ( f ∗ g ) ( a b ) h(ab)=(f*g)(ab) h(ab)=(fg)(ab)
= ∑ d ∣ a b f ( d ) g ( a b d ) =\sum_{d|ab}f(d)g(\frac{ab}{d}) =dabf(d)g(dab)
= ∑ d ∣ a , k ∣ b f ( d k ) g ( a b d k ) =\sum_{d|a,k|b}f(dk)g(\frac{ab}{dk}) =da,kbf(dk)g(dkab)
= ∑ d ∣ a , k ∣ b f ( d ) f ( k ) g ( a d ) g ( b k ) =\sum_{d|a,k|b}f(d)f(k)g(\frac{a}{d})g(\frac{b}{k}) =da,kbf(d)f(k)g(da)g(kb)
= ∑ d ∣ a f ( d ) g ( a d ) ∑ k ∣ b f ( k ) g ( b k ) =\sum_{d|a}f(d)g(\frac{a}{d})\sum_{k|b}f(k)g(\frac{b}{k}) =daf(d)g(da)kbf(k)g(kb)
= h ( a ) h ( b ) =h(a)h(b) =h(a)h(b)
事实上很多积性函数都可以线性筛求解:
如果一个积性函数 f f f,我们可以快速求出 f ( 1 ) , f ( p ) f(1),f(p) f(1),f(p) f ( p k ) f(p^k) f(pk),就可以进行线性筛。
方法:
我们需要辅助数组 l o w low low
n n n的一个素因子为 p p p,次数为 α \alpha α
l o w [ n ] low[n] low[n]即为 p α p^\alpha pα
n = l o w [ n ] n=low[n] n=low[n]时, f ( n ) = f ( p α ) f(n)=f(p^\alpha) f(n)=f(pα),直接计算就好了
n ≠ l o w [ n ] n\not=low[n] n=low[n]时, f ( n ) = f ( n l o w [ n ] ) f ( l o w [ n ] ) f(n)=f(\frac{n}{low[n]})f(low[n]) f(n)=f(low[n]n)f(low[n])
然后再处理一些细节就好了
代码:

void init(){
	f[1]=f在1的值;
	for(int i=2;i<N;i++){
		if(!vis[i]){
			prm[tot++]=i;
			low[i]=i;
			f[i]=f在p的值;
		}
		for(int j=0,p=prm[j],k=p*i;j<tot&&k<N;j++,p=prm[j],k=p*i){
			vis[k]=1;
			if(!(i%prm[j])){
				low[k]=low[i]*p;
				if(i==low[i])
					f[k]=f在p^α的值;
				else f[k]=f[i/low[i]]*f[low[k]];
				break;
			}
			f[k]=f[i]*f[low[k]=p];
		}
	}
	return;
}

有一些特殊数论函数的线性筛不需要 l o w low low数组,在后续会讲到。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值