线性筛五种积性函数

本文详细介绍了如何使用线性筛法同时计算欧拉函数、莫比乌斯函数、因数个数函数、因数个数和函数以及自定义积性函数。通过对不同情况的分析,展示了在质因数分解基础上如何更新这些函数的值,并利用辅助数组优化计算过程。线性筛法在处理积性函数时展现出高效性,适用于大规模数值计算。
摘要由CSDN通过智能技术生成

打表五个积性函数(欧拉函数、莫比乌斯函数、因数个数函数、因数个数和函数、某自定义函数

学校专题题目
由于线性筛几乎可以筛所有积性函数(并且本题中的五个积性函数均可以被线性筛),所以我们考虑一次同时筛这五个积性函数。以下考虑每种积性函数各自的筛法。

1、欧拉函数: ϕ ( x ) \phi (x) ϕ(x)

(1)当 x x x 为质数时,显然,小于 x x x 的数均与 x x x 互质,所以此时欧拉函数的值即为 x − 1 x - 1 x1

(2)当 ( i   %   p r i m e [ j ] = = 0 ) (i\ \% \ prime[j] == 0) (i % prime[j]==0) 时, ϕ ( i ∗ p r i m e [ j ] ) = ϕ ( i ) ∗ p r i m e [ j ] \phi (i * prime[j]) = \phi(i) * prime[j] ϕ(iprime[j])=ϕ(i)prime[j]

​ 由第一种情况,我们知道 $\phi (n) = n · \prod_{i = 1}^{s} \frac {p_i - 1}{p_i} $(把 n n n 质因数分解,分别带入各个乘式中,结合第一种情况,且欧拉函数是积性函数,即可证明)。

​ 所以有:
ϕ ( n ∗ p r i m e [ j ] ) = ( n ∗ p r i m e [ j ] ) ∗ ∏ i = 1 s p i − 1 p i = i ∗ ∏ i = 1 s p i − 1 p i ∗ p r i m e [ j ] = ϕ ( n ) ∗ p r i m e [ j ] \phi (n * prime[j]) = (n * prime[j]) * \prod _{i = 1}^{s}\frac {p_i - 1}{p_i} \\= i * \prod _{i = 1}^{s}\frac{p_i - 1}{p_i} * prime[j] = \phi (n) * prime[j] ϕ(nprime[j])=(nprime[j])i=1spipi1=ii=1spipi1prime[j]=ϕ(n)prime[j]
(3)当 ( i   %   p r i m e [ j ] ! = 0 ) (i\ \%\ prime[j] != 0) (i % prime[j]!=0) 时,由积性函数性质,可以直接得出:
ϕ ( i ∗ p r i m e [ j ] ) = ϕ ( i ) ∗ ϕ ( p r i m e [ j ] ) \phi (i * prime[j]) = \phi (i)* \phi (prime[j]) ϕ(iprime[j])=ϕ(i)ϕ(prime[j])

2、莫比乌斯函数 : μ ( x ) \mu (x) μ(x)

(1)当 x x x 为质数时,根据莫比乌斯函数定义,显然此时莫比乌斯函数的值为 − 1 - 1 1

(2)当 $(i\ % \ prime[j] == 0) $ 时, μ ( i ∗ p r i m e [ j ] ) = 0 \mu (i * prime[j]) = 0 μ(iprime[j])=0

​ 因为莫比乌斯函数在质因数分解后只要某个质因子的个数超过 1 1 1 个,那么根据定义,莫比乌斯函数的值即为 0 0 0

(3)当 ( i   %   p r i m e [ j ] ! = 0 ) (i\ \%\ prime[j] != 0) (i % prime[j]!=0) 时,由积性函数性质,可以直接得出:
μ ( i ∗ p r i m e [ j ] ) = μ ( i ) ∗ μ ( p r i m e [ j ] ) = − μ ( i ) \mu (i * prime[j]) = \mu (i) * \mu (prime[j]) = -\mu (i) μ(iprime[j])=μ(i)μ(prime[j])=μ(i)

3、因数个数函数: σ 0 ( x ) \sigma_0 (x) σ0(x)

​ 筛因数个数函数时,我们需要一个辅助数组 n u m [ i ] num[i] num[i],表示数字 i i i 的最小质因子的个数。

​ 为什么要用这个数组?先给出三种情况的结论,然后再解释。

(1)当 x x x 为质数时,显然, x x x 的因数只有两个,所以此时因数个数函数的值即为 2 2 2

(2)当 ( i   %   p r i m e [ j ] = = 0 ) (i\ \% \ prime[j] == 0) (i % prime[j]==0) 时, σ 0 ( i ∗ p r i m e [ j ] ) = σ 0 ( i ) / ( n u m [ i ] + 1 ) ∗ ( n u m [ i ] + 2 ) \sigma_0 (i * prime[j]) = \sigma_0 (i) /(num[i] + 1) * (num[i] + 2) σ0(iprime[j])=σ0(i)/(num[i]+1)(num[i]+2)

n u m [ i ∗ p r i m e [ j ] ] = n u m [ i ] + 1 num[i * prime[j]] = num[i] + 1 num[iprime[j]]=num[i]+1

(3)当 ( i   %   p r i m e [ j ] ! = 0 ) (i\ \%\ prime[j] != 0) (i % prime[j]!=0) 时,由积性函数性质,可以直接得出​:
σ 0 ( i ∗ p r i m e [ j ] ) = σ 0 ( i ) ∗ σ 0 ( p r i m e [ j ] ) \sigma _0 (i * prime[j]) = \sigma_0 (i) * \sigma_0 (prime[j]) σ0(iprime[j])=σ0(i)σ0(prime[j])
​ 同时,我们还可以得到 n u m [ i ∗ p r i m e [ j ] ] = 1 num[i * prime[j]] = 1 num[iprime[j]]=1 (因为 i i i p r i m e [ j ] prime[j] prime[j] 互质,所以二者相乘后最小质因数的个数为1)

​ 对 n u m [ i ] num[i] num[i] 数组的解释:我们发现, n u m [ i ] num[i] num[i] 仅在 ( i   %   p r i m e [ j ] = = 0 ) (i\ \% \ prime[j] == 0) (i % prime[j]==0) 时对答案产生贡献。原因是,我们考虑 n = ∏ i = 1 s p i a i n = \prod _{i = 1} ^ {s} {p_i ^{a_i}} n=i=1spiai,那么 σ 0 ( n ) = ∏ i = 1 s ( 1 + a i ) \sigma_0 (n) = \prod _{i = 1} ^{s}(1 + a_i) σ0(n)=i=1s(1+ai),因为对于每个质因子,我们可以不选,可以选 1 1 1 个,选 2 2 2 个… 选 a i a_i ai 个,一共是 ( 1 + a i ) (1 + a_i) (1+ai) 种选择,根据乘法原理即可得出这个算式。

​ 考虑 ( i   %   p r i m e [ j ] ! = 0 ) (i\ \% \ prime[j] != 0) (i % prime[j]!=0),也就是说 p r i m e [ j ] prime[j] prime[j] i i i 的一个(最小)质因子。那么 σ 0 ( i ∗ p i r m e [ j ] ) = ( ∏ i = 1 s ( 1 + a i ) ) / ( 1 + a 1 ) ∗ ( 1 + a 1 + 1 ) = σ 0 ( i ) / ( 1 + a 1 ) ∗ ( 1 + a 1 + 1 ) \sigma _0 (i * pirme[j]) = (\prod _{i = 1}^{s} (1 + a_i)) / (1 + a_1) * (1 + a_1 + 1) = \sigma_0 (i) / (1 + a_1) * (1 + a_1 + 1) σ0(ipirme[j])=(i=1s(1+ai))/(1+a1)(1+a1+1)=σ0(i)/(1+a1)(1+a1+1),(因为最小的质因子个数加了一个,所以除以原来的个数再乘以原来的个数加 1 1 1)

​ 这里我们用 n u m [ i ] num[i] num[i] 代表上式中的 ( 1 + a 1 ) (1 + a_1) (1+a1),就得到了:
σ 0 ( i ∗ p r i m e [ j ] ) = σ 0 ( i ) / ( n u m [ i ] + 1 ) ∗ ( n u m [ i ] + 2 ) \sigma_0 (i * prime[j]) = \sigma_0 (i) /(num[i] + 1) * (num[i] + 2) σ0(iprime[j])=σ0(i)/(num[i]+1)(num[i]+2)

4、因数和函数: σ 1 ( x ) \sigma _1 (x) σ1(x)

​ 筛因数和函数时我们也需要一个辅助数组 s p [ x ] sp[x] sp[x]。对于数 x x x,若其最小质因子为 p p p,且个数为 a a a

​ 那么 s p [ x ] = ( 1 + p + p 2 + . . . + p a ) sp[x] = (1 + p + p^{2} + ... + p^{a}) sp[x]=(1+p+p2+...+pa)

​ 同样先给出三种情况的结论再做解释。

(1)当 x 为质数时,显然, x x x 的因数只有 1 1 1 x x x,所以此时因数和函数的值即为 1 + x 1 + x 1+x

(2)当 ( i   %   p r i m e [ j ] = = 0 ) (i\ \% \ prime[j] == 0) (i % prime[j]==0) 时, σ 1 ( i ∗ p r i m e [ j ] ) = σ 1 / s p [ i ] ∗ ( s p [ i ] ∗ p r i m e [ j ] + 1 ) \sigma_1 (i * prime[j]) = \sigma_1 / sp[i] * (sp[i] * prime[j] + 1) σ1(iprime[j])=σ1/sp[i](sp[i]prime[j]+1)

s p [ i ∗ p r i m e [ j ] ] = s p [ i ] ∗ p r i m e [ j ] + 1 sp[i * prime[j]] = sp[i] * prime[j] + 1 sp[iprime[j]]=sp[i]prime[j]+1

(3)当 ( i   %   p r i m e [ j ] ! = 0 ) (i\ \%\ prime[j] != 0) (i % prime[j]!=0) 时,由积性函数性质,可以直接得出:
σ 1 ( i ∗ p r i m e [ j ] ) = σ 1 ( i ) ∗ σ 1 ( p r i m e [ j ] ) \sigma _1 (i * prime[j]) = \sigma _1 (i) * \sigma _1 (prime[j]) σ1(iprime[j])=σ1(i)σ1(prime[j])
​ 同时,我们还可以得到 s p [ i ∗ p r i m e [ j ] ] = 1 + p r i m e [ j ] sp[i * prime[j]] = 1 + prime[j] sp[iprime[j]]=1+prime[j],因为 i i i p r i m e [ j ] prime[j] prime[j] 互质,所以二者相乘后最小质因数的几何级数序列就为 ( 1 , p r i m e [ j ] 1 ) (1, prime[j] ^ 1) (1,prime[j]1),和即为 ( 1 + p r i m e [ j ] ) (1 + prime[j]) (1+prime[j])

​ 对 s p [ x ] sp[x] sp[x] 数组的解释:计算某个数字 N N N 的约数和时,有一个定理:

σ 1 ( N ) = ( 1 + p 1 + p 1 2 + . . . + p 1 a 1 ) ( 1 + p 2 + p 2 2 + . . . + p 2 a 2 ) . . . ( 1 + p m + p m 2 + . . . + p m a m ) \sigma_1 (N) = (1 + p_1 + p_1 ^2 + ... + p_1^{a_1})(1 + p_2 + p_2 ^2 + ... + p_2^{a_2})...(1 + p_m + p_m ^2 + ... + p_m^{a_m}) σ1(N)=(1+p1+p12+...+p1a1)(1+p2+p22+...+p2a2)...(1+pm+pm2+...+pmam),其中 p i p_i pi 指的是 N N N 的某个质因子, a i a_i ai 指的是质因子 p i p_i pi 的个数。

​ 有了这个定理,不难发现,当 p r i m e [ j ] prime[j] prime[j] i i i 的最小质因子时,
σ 1 ( i ∗ p r i m e [ j ] ) = σ 1 ( i ) / ( 1 + p 1 + p 1 2 + . . . + p 1 a i ) ∗ ( 1 + p 1 + p 1 2 + . . . + p 1 a i + p 1 a i + 1 ) \sigma _1(i * prime[j])= \sigma _1(i) / (1 + p_1 + p_1 ^2 +...+ p_1^{a_i}) * (1 + p_1 + p_1^2 +...+ p_1^{a_i} + p_1^{a_i+1}) σ1(iprime[j])=σ1(i)/(1+p1+p12+...+p1ai)(1+p1+p12+...+p1ai+p1ai+1)
​ 把 s p [ i ] sp[i] sp[i] 数组带入上式可得:
σ 1 ( i ∗ p r i m e [ j ] ) = σ 1 / s p [ i ] ∗ ( s p [ i ] ∗ p r i m e [ j ] + 1 ) \sigma_1 (i * prime[j]) = \sigma_1 / sp[i] * (sp[i] * prime[j] + 1) σ1(iprime[j])=σ1/sp[i](sp[i]prime[j]+1)
​ 同时我们可以得到, s p [ i ∗ p r i m e [ j ] ] = s p [ i ] ∗ p r i m e [ j ] + 1 sp[i * prime[j]] = sp[i] * prime[j] + 1 sp[iprime[j]]=sp[i]prime[j]+1,因为 p r i m e [ j ] prime[j] prime[j] i i i 的最小质因子,所以 i ∗ p r i m e [ j ] i * prime[j] iprime[j] 的最小质因子个数比 i i i 多一个,结合 s p [ i ] sp[i] sp[i] 的定义即可计算出。

5、自定义函数 f ( x ) = ( μ ⋅ ϕ ) ∗ σ 1 f(x) = (\mu · \phi) * \sigma_1 f(x)=(μϕ)σ1

​ 由于 μ ( x ) , ϕ ( x ) \mu (x), \phi (x) μ(x),ϕ(x) 均为积性函数,所以 ( μ ⋅ ϕ ) ( x ) (\mu · \phi)(x) (μϕ)(x) 也是积性函数;又 σ 1 \sigma_1 σ1 也是积性函数,所以 f ( x ) f(x) f(x) 也是积性函数。

​ 利用卷积定义,首先对这个函数化简得到:
f ( x ) = ∑ d ∣ x μ ( d ) ϕ ( d ) σ 1 ( x d ) f(x) = \sum_{d|x}\mu (d)\phi (d)\sigma_1(\frac{x}{d}) f(x)=dxμ(d)ϕ(d)σ1(dx)
​ 用类似的方法考虑三种情况下 f ( x ) f(x) f(x) 的大小。

(1)当 x x x 为质数时。 d d d 的取值仅有 1 1 1 x x x,所以有:
f ( x ) = μ ( 1 ) ϕ ( 1 ) σ 1 ( x ) + μ ( x ) ϕ ( x ) σ 1 ( 1 ) = σ 1 ( x ) − x + 1 f(x) = \mu (1)\phi (1)\sigma_1 (x) + \mu(x)\phi(x)\sigma_1 (1) = \sigma_1 (x) - x + 1 f(x)=μ(1)ϕ(1)σ1(x)+μ(x)ϕ(x)σ1(1)=σ1(x)x+1
(2)当 ( i   %   p r i m e [ j ] = = 0 ) (i\ \% \ prime[j] == 0) (i % prime[j]==0)时, p r i m e [ j ] prime[j] prime[j] i i i 的最小质因子。

​ 假设 i = p 1 a 1 ∏ k = 2 s p k a k i = p_1^{a_1}\prod _{k = 2}^{s} p_k^{a_k} i=p1a1k=2spkak,那么 i ∗ p r i m e [ j ] = p 1 a i + 1 ∏ k = 2 s p k a k i * prime[j] = p_1^{a_i + 1}\prod _{k = 2}^{s}p_k^{a_k} iprime[j]=p1ai+1k=2spkak

​ 由积性函数的性质,有:
f ( i ∗ p r i m e [ j ] ) = f ( p 1 a i + 1 ) ∗ f ( ∏ k = 2 s p k a k ) f(i * prime[j]) = f(p_1^{a_i + 1}) *f(\prod_{k = 2}^{s}p_k^{a_k}) f(iprime[j])=f(p1ai+1)f(k=2spkak)
​ 所以,计算 f ( i ∗ p r i m e [ j ] ) f(i * prime[j]) f(iprime[j]) 时,只需要统计出 i ∗ p r i m e [ j ] i * prime[j] iprime[j] 中有多少个质因子 p r i m e [ j ] prime[j] prime[j],把 i ∗ p r i m e [ j ] i * prime[j] iprime[j] 拆成 p 1 a i + 1 p_1^{a_i + 1} p1ai+1 ∏ k = 2 s ( p k a k ) \prod_{k = 2}^s(p_k^{a_k}) k=2s(pkak),利用上式就可以求出答案了。

(3)当 ( i   %   p r i m e [ j ] ! = 0 ) (i\ \% \ prime[j] != 0) (i % prime[j]!=0)时,由积性函数性质,可以直接得出:
f ( i ∗ p r i m e [ j ] ) = f ( i ) ∗ f ( p r i m e [ j ] ) f(i * prime[j]) = f(i) * f(prime[j]) f(iprime[j])=f(i)f(prime[j])


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值