积性函数的性质及证明 + 线性筛
引言
在数论问题中,积性函数有着广泛的应用。
如在莫比乌斯反演问题中,函数变换之后如何快速维护前缀和往往是最重要也是最难的一步。如果维护的函数具有积性,那就可以尝试利用线性筛在O(n)O(n)O(n)的时限内完成预处理,从而达到优化复杂度的神奇作用。
本文的大部分相关性质及公式来自:《线性筛与积性函数》- 贾志鹏
博主将试着证明其中的性质公式,严谨性可能欠缺,其目的主要是帮助大家理解并记忆。
积性函数的定义和性质
定义: 对于一个定义域为N+N^{+}N+的函数fff,对于任意两个互质的正整数a,ba,ba,b,均满足f(ab)=f(a)f(b)f(ab)=f(a)f(b)f(ab)=f(a)f(b),则称函数fff为积性函数
若对于任意整数a,ba,ba,b都有f(ab)=f(a)f(b)f(ab) = f(a)f(b)f(ab)=f(a)f(b),则函数fff被称为完全积性函数。
性质:
(1)对于任意积性函数fff,均有f(1)=1f(1) = 1f(1)=1
证明:因111与任何数都互质,假设存在一个正整数aaa满足f(a)!=0f(a)!=0f(a)!=0,故由定义:f(a)=f(1∗a)=f(1)f(a)f(a) = f(1*a) = f(1)f(a)f(a)=f(1∗a)=f(1)f(a)
因f(a)f(a)f(a)不为000,故等号两端同时消去一个f(a)f(a)f(a),得:
f(1)=1f(1) = 1 f(1)=1
证毕。
(2)对于一个大于111的正整数N,设N=∏piaiN = \prod p_i^{a_i}N=∏piai,pip_ipi为互不相同的素数。那么对于一个积性函数fff来说,有:
f(N)=f(∏piai)=∏f(piai)f(N) = f(\prod p_i^{a_i}) = \prod f(p_i^{a_i})f(N)=f(∏piai)=∏f(piai)
若fff完全积性,则f(N)=∏f(pi)aif(N) = \prod f(p_i)^{a_i}f(N)=∏f(pi)ai
证明:由积性和完全积性的定义易得。
欧拉函数φ\varphiφ
定义:对于正整数nnn,φ(n)\varphi(n)φ(n)是小于n的正整数中与n互质的个数。
定义式:若n=∏piain = \prod p_i^{a_i}n=∏piai
φ(n)=n∏(1−1pi)\varphi(n) = n \prod(1 - \frac{1}{p_i})φ(n)=n∏(1−pi1)
性质:
(1)欧拉函数为积性函数,而不是完全积性函数。
证明:设两个互质的正整数n,mn,mn,m
则:
φ(n)=n∏(1−1pi)\varphi(n) = n \prod(1 - \frac{1}{p_i})φ(n)=n∏(1−pi1)
φ(m)=m∏(1−1pi′)\varphi(m) =m \prod(1 - \frac{1}{p'_i})φ(m)=m∏(1−pi′1)
φ(n)φ(m)=n∏(1−1pi)m∏(1−1pi′)=nm∏(1−1pi)(1−1pi′)\varphi(n)\varphi(m) = n \prod(1 - \frac{1}{p_i})m \prod(1 - \frac{1}{p'_i}) = nm\prod(1 - \frac{1}{p_i})(1 - \frac{1}{p'_i})φ(n)φ(m)=n∏(1−pi1)m∏(1−pi′1)=nm∏(1−pi1)(1−pi′1)
因n,mn,mn,m互质,故 pi,pi′p_i,p'_ipi,pi′ 各不相同,且均为nmnmnm的质因子。
故推出:
φ(nm)=φ(n)φ(m)\varphi(nm) = \varphi(n)\varphi(m)φ(nm)=φ(n)φ(m)
积性函数性质得证。
而完全积性由上证明可见,n,mn,mn,m互质是一个严格且不可或缺的条件,可见,欧拉函数不是完全积性函数。
(2)假设存在一个素数ppp和一个正整数kkk,则:φ(pk)=pk−pk−1\varphi(p^k) = p^k - p^{k-1}φ(pk)=pk−pk−1
证明:
可以从反面来思考这件事,在小于pkp^kpk且与其不互质的数有以下形式:
p∗1,p∗2,...p∗(pk−1−1)p*1,p*2,...p*(p^{k-1} - 1)p∗1,p∗2,...p∗(pk−1−1)(因为p是唯一的质因子)
故由定义:φ(pk)=\varphi(p^k) =φ(pk)=总数 - 不互质的数 = (pk−1)−(pk−1−1)=pk−pk−1(p^k-1) - (p^{k-1} -1) = p^k - p^{k-1}(pk−1)−(pk−1−1)=pk−pk−1
证毕。
另外还可以从定义式出发去理解这个结论。
φ(pk)=pk(1−1p)=pk−pk−1\varphi(p^k) = p^k(1-\frac{1}{p}) = p^k - p^{k-1}φ(pk)=pk(1−p1)=pk−pk−1
(3)欧拉定理:若有互质的两个正整数a,na,na,n,则有aφ(n)≡1(modn)a^{\varphi(n)} \equiv 1(mod \ n)aφ(n)≡1(mod n)
此定理常用来求解逆元。
证明:(可参考百度百科)
(4)假设存在一个正整数n,则:∑d∣nφ(d)=n\sum_{d|n} \varphi(d) = n∑d∣nφ(d)=n
证明:
先考虑特殊情况: n=1n = 1n=1时 φ(1)=1\varphi(1) = 1φ(1)=1 显然成立
对于一般情况,nnn一定可以质因数分解为:n=p1a1p2a2...pkakn = p_1^{a_1}p_2^{a_2}...p_k^{a_k}n=p1a1p2a2...pkak
当n只含一个质因子时,即n=pan = p^an=pa
有:
∑d∣nφ(d)=∑i=0aφ(pi)=1+∑i=1a(pi−pi−1)=1+∑i=1a(−pi−1+pi)\sum_{d|n}\varphi(d) = \sum_{i=0}^{a} \varphi(p^i) = 1 + \sum_{i=1}^{a}( p^i - p^{i-1}) = 1 + \sum_{i=1}^a(-p^{i-1} + p^i)d∣n∑φ(d)=i=0∑aφ(pi)=1+i=1∑a(pi−pi−1)=1+i=1∑a(−pi−1+pi)
显然,将求和式展开,会有一些项可以合并。
比如a=3a = 3a=3时,原式等于:1−p0+p1−p1+p2−p2+p3=p31 - p^0 + p^1- p^1 + p^2 - p^2 + p^3 = p^3 1−p0+p1−p1+p2−p2+p3=p3
可见:
∑d∣nφ(d)=∑i=0aφ(pi)=pa=n\sum_{d|n}\varphi(d) = \sum_{i=0}^a \varphi(p^i) = p^a = nd∣n∑φ(d)=i=0∑aφ(pi)=pa=n
当nnn含多个质因子时,即n=p1a1p2a2...pkakn = p_1^{a_1}p_2^{a_2}...p_k^{a_k}n=p1a1p2a2...pkak
利用积性函数的性质有
∑d∣nφ(d)=∑i=0a1φ(p1i)∑i=0a2ϕ(p2i)......∑i=0akφ(pki)\sum_{d|n}\varphi(d) = \sum_{i=0}^{a_1} \varphi(p_1^i)\sum_{i=0}^{a_2} \phi(p_2^i) ...... \sum_{i=0}^{a_k} \varphi(p_k^i)d∣n∑φ(d)=i=0∑a1φ(p1i)i=0∑a2ϕ(p2i)......i=0∑akφ(pki)
同上易得:
原式=p1a1p2a2......pkak=n原式=p_1^{a_1}p_2^{a_2} ...... p_k^{a_k} = n原式=p1a1p2a2......pkak=n
证毕。
(5)当n>1n>1n>1,小于nnn且与nnn互质的数之和为sum=nφ(n)2sum = \frac{n\varphi(n)}{2}sum=2nφ(n)
证明:在数论求gcdgcdgcd中,有两个非常出名的公式,基于这两个公式,出现了两种快速求gcdgcdgcd的方法,更相减损法和辗转相除法。这两个公式是:(假设有两个正整数a,ba,ba,b且满足 a>ba>ba>b)
gcd(a,b)=gcd(a,a−b)gcd(a,b) = gcd(a,a-b)gcd(a,b)=gcd(a,a−b) 和 gcd(a,b)=gcd(b,a%b)gcd(a,b) = gcd(b,a\%b)gcd(a,b)=gcd(b,a%b)
由第一个公式,知:
若mmm与nnn互质,则n−mn-mn−m也一定与nnn互质。
这样就能将保证当n>2n>2n>2时,φ(n)\varphi(n)φ(n)一定为偶数,且可两两配对,每一对的和都是nnn。
故sum=nφ(n)2sum = n\frac{\varphi(n)}{2} sum=n2φ(n)
当n=2n=2n=2时,代入验证知,此公式依然满足。
证毕。
例题:HDU 3501
题意:求小于n且与n不互质的数之和。
思路:直接利用公式求反面,总数 - 反面数即为答案。
代码:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;const int mod = 1000000007;
const int A = 1e5 + 10;
bool vis[A];
int pri[A],tot;void init(){tot = 0;vis[0] = vis[1] = 1;for(int i=2 ;i<A ;i++){if(vis[i] == 0) pri[++tot] = i;for(int j=1 ;j<=tot&&pri[j]*i<A ;j++){vis[pri[j]*i] = 1;if(i%pri[j] == 0) break;}}
}int main(){init();ll n;while(~scanf("%I64d",&n) && n){ll ans = (n*(n-1)/2)%mod;ll res = n,m = n;for(int i=1 ;i<=tot&&pri[i]*pri[i]<=n ;i++){if(n%pri[i] == 0){res = res/pri[i]*(pri[i]-1);while(n%pri[i] == 0) n/=pri[i];}}if(n!=1) res = res/n*(n-1);ans = ans - res*m/2;printf("%I64d\n",(ans%mod+mod)%mod);}return 0;
}
莫比乌斯函数μ\muμ
定义式:
μ(n)={1(n=1)(−1)k(n=p1p2...pk)0(else)\mu(n) = \begin{cases} 1 & (n=1)\\ (-1)^k&(n=p_1p_2...p_k)\\ 0&(else)\\ \end{cases}μ(n)=⎩⎪⎨⎪⎧1(−1)k0(n=1)(n=p1p2...pk)(else)
性质:
(1)对于任意正整数n,有:
∑d∣nμ(d)=[n==1]\sum_{d|n} \mu(d) = [n == 1]d∣n∑μ(d)=[n==1]
该性质在莫比乌斯反演中有着极大应用。
证明:
当n=1n = 1n=1时 等式显然成立。
当n>1n>1n>1时,令n=p1a1p2a2p3a3...pkakn = p_1^{a_1}p_2^{a_2}p_3^{a_3} ... p_k^{a_k}n=p1a1p2a2p3a3...pkak
考虑莫比乌斯函数取值的特殊性,若函数值不为000,则d只含每个质因子的000次或111次项。
故∑d∣nμ(d)=Ck0−Ck1+Ck2...+(−1)kCkk=∑i=0k(−1)iCki\sum_{d|n}\mu(d) = C_k^0 - C_k^1 + C_k^2 ...+(-1)^kC_k^k = \sum_{i=0}^k(-1)^iC_k^id∣n∑μ(d)=Ck0−Ck1+Ck2...+(−1)kCkk=i=0∑k(−1)iCki
由二项式定理,原式等于:
∑i=0k(−1)iCki=∑i=0kCki(−1)i(1)k−i=(−1+1)k=0\sum_{i=0}^k(-1)^iC_k^i = \sum_{i=0}^kC_k^i(-1)^i(1)^{k-i} = (-1 + 1)^k = 0i=0∑k(−1)iCki=i=0∑kCki(−1)i(1)k−i=(−1+1)k=0
综上所述:
当n=1n=1n=1原式为111
当n>1n>1n>1原式为000
证毕。
(2)对于任意正整数nnn,有:
∑d∣nμ(d)d=φ(n)n\sum_{d|n}\frac{\mu(d)}{d} = \frac{\varphi(n)}{n}d∣n∑dμ(d)=nφ(n)
证明:
令f(n)f(n)f(n)满足:f(n)=∑d∣nφ(d)f(n) = \sum_{d|n}\varphi(d)f(n)=∑d∣nφ(d)
由欧拉函数的性质(4)(4)(4):f(n)=nf(n) = nf(n)=n
又由莫比乌斯反演:φ(n)=∑d∣nμ(d)f(nd)\varphi(n) = \sum_{d|n}\mu(d)f(\frac{n}{d})φ(n)=d∣n∑μ(d)f(dn)
推出:
φ(n)=∑d∣nnμ(d)d=n∑d∣nμ(d)d\varphi(n) = \sum_{d|n}n\frac{\mu(d)}{d} = n \sum_{d|n} \frac{\mu(d)}{d}φ(n)=d∣n∑ndμ(d)=nd∣n∑dμ(d)
等式两边同除以n,得:
φ(n)n=∑d∣nμ(d)d\frac{\varphi(n)}{n} = \sum_{d|n}\frac{\mu(d)}{d} nφ(n)=d∣n∑dμ(d)
证毕。
线性筛求积性函数
欧拉函数φ\varphiφ
考虑将所有数分成三类:
(1)质数 φ(i)=i−1\varphi(i) = i - 1φ(i)=i−1
(2)最小质因子指数为1:φ(i∗p)=φ(i)φ(p)\varphi(i*p) = \varphi(i) \varphi(p)φ(i∗p)=φ(i)φ(p)
(3)最小质因子指数大于1:φ(i∗p)=p∗φ(i)\varphi(i*p) = p*\varphi(i)φ(i∗p)=p∗φ(i)(可从欧拉函数的定义式出发)
代码:
void init(){tot = 0;phi[1] = 1;for(int i=2 ;i<A ;i++){if(!vis[i]){pri[++tot] = i;phi[i] = i-1;}for(int j=1 ;j<=tot&&i*pri[j]<A ;j++){vis[i*pri[j]] = 1;if(i%pri[j] == 0){phi[i*pri[j]] = pri[j] * phi[i];break;}phi[i*pri[j]] = phi[pri[j]] * phi[i];}}
}
莫比乌斯函数μ\muμ
因为线性筛每次都是用最小质因子去筛每一个数。
故也可分为三类:
(1)iii为质数:μ[i]=−1\mu[i] = -1μ[i]=−1
(2)iii已经包含最小质因子ppp:μ[i∗p]=0\mu[i*p] = 0μ[i∗p]=0
(3)iii不包含最小质因子ppp :μ[i∗p]=−μ[i]\mu[i*p] = -\mu[i]μ[i∗p]=−μ[i]
代码:
void init(){tot = 0;mu[1] = 1;for(int i=2 ;i<A ;i++){if(!vis[i]){pri[++tot] = i;mu[i] = -1;}for(int j=1 ;j<=tot&&i*pri[j]<A ;j++){vis[i*pri[j]] = 1;if(i%pri[j] == 0){mu[i*pri[j]] = 0;break;}mu[i*pri[j]] = -mu[i];}}
}
以下为其他常见积性函数的线性筛:
约数个数函数d
仍然分三类讨论,此时我们还需要维护每一个数iii最小质因子的指数cnt[i]cnt[i]cnt[i]
(1)iii为质数:$d[i] = 2 $ cnt[i]=1cnt[i] = 1cnt[i]=1
(2)iii已经包含最小质因子ppp:
d[i∗p]=d[i]/(cnt[i]+1)∗(cnt[i]+2)d[i*p] = d[i]/(cnt[i]+1)*(cnt[i]+2)d[i∗p]=d[i]/(cnt[i]+1)∗(cnt[i]+2) (由约数个数公式易得)
cnt[i∗p]=cnt[i]+1cnt[i*p] = cnt[i] + 1cnt[i∗p]=cnt[i]+1
(3)iii不包含最小质因子ppp :
d[i∗p]=d[i]∗(cnt[p]+1)=d[i]∗2d[i*p] = d[i]*(cnt[p] + 1) = d[i]*2d[i∗p]=d[i]∗(cnt[p]+1)=d[i]∗2
cnt[i∗p]=1cnt[i*p] = 1cnt[i∗p]=1
代码:
void init(){tot = 0;d[1] = 1;for(int i=2 ;i<A ;i++){if(!vis[i]){pri[++tot] = i;d[i] = 2;cnt[i] = 1;}for(int j=1 ;j<=tot&&i*pri[j]<A ;j++){vis[i*pri[j]] = 1;if(i%pri[j] == 0){d[i*pri[j]] = d[i]/(cnt[i]+1)*(cnt[i]+2);cnt[i*pri[j]] = cnt[i] + 1;break;}d[i*pri[j]] = d[i]<<1;cnt[i*pri[j]] = 1;}}
}
约数和函数σ\sigmaσ
假设一个正整数nnn分解质因子之后为:
n=p1a1p2a2p3a3...pkakn = p_1^{a_1}p_2^{a_2}p_3^{a_3} ... p_k^{a_k}n=p1a1p2a2p3a3...pkak
则
σ(n)=∑i=0a1p1i∑i=0a2p2i.....∑i=0akpki\sigma(n) = \sum_{i=0}^{a_1}p_1^i \sum_{i=0}^{a_2}p_2^i..... \sum_{i=0}^{a_k}p_k^iσ(n)=i=0∑a1p1ii=0∑a2p2i.....i=0∑akpki
假设最小质因子为p1p_1p1故线性筛中每一个被筛到的数比起原来的数,差别只在于:∑i=0a1p1i\sum_{i=0}^{a_1} p_1^i∑i=0a1p1i
故我们可以维护两个量:
sum[i]:isum[i]:isum[i]:i的最小质因子p1p_1p1贡献的和:∑i=0a1p1i\sum_{i=0}^{a_1} p_1^i∑i=0a1p1i
Mx[i]:Mx[i]:Mx[i]: p1a1p_1^{a_1}p1a1a1a_1a1 为最小质因子的最高次数。
然后又可以把所有数分成三类:
(1)iii为质数:σ[i]=i+1\sigma[i] = i+1σ[i]=i+1 sum[i]=i+1sum[i] = i+1sum[i]=i+1 Mx[i]=iMx[i] = iMx[i]=i
(2)iii已经包含最小质因子ppp:σ[i∗p]=σ[i]/sum[i]∗(sum[i]+Mx[i]∗p)\sigma[i*p] = \sigma[i]/sum[i]*(sum[i]+Mx[i]*p)σ[i∗p]=σ[i]/sum[i]∗(sum[i]+Mx[i]∗p)
sum[i∗p]=sum[i]+Mx[i]∗psum[i*p] = sum[i] + Mx[i]*psum[i∗p]=sum[i]+Mx[i]∗p
Mx[i∗p]=Mx[i]∗pMx[i*p] = Mx[i]*pMx[i∗p]=Mx[i]∗p
(3)iii不包含最小质因子ppp :σ[i∗p]=σ[i]∗σ[p]=σ[i]∗(p+1)\sigma[i*p] = \sigma[i]*\sigma[p]= \sigma[i]*(p+1)σ[i∗p]=σ[i]∗σ[p]=σ[i]∗(p+1)
sum[i∗p]=p+1sum[i*p] = p+1sum[i∗p]=p+1
Mx[i∗p]=pMx[i*p] = pMx[i∗p]=p
代码:
void init(){tot = 0;Sigma[1] = 1;for(int i=2 ;i<A ;i++){if(!vis[i]){pri[++tot] = i;Sigma[i] = 1 + i;sum[i] = 1 + i;Mx[i] = i;}for(int j=1 ;j<=tot&&i*pri[j]<A ;j++){vis[i*pri[j]] = 1;if(i%pri[j] == 0){Sigma[i*pri[j]] = Sigma[i]/sum[i]*(sum[i] + Mx[i]*pri[j]);sum[i*pri[j]] = sum[i] + Mx[i]*pri[j];Mx[i*pri[j]] = Mx[i]*pri[j];break;}Sigma[i*pri[j]] = Sigma[i]*(pri[j] + 1);sum[i*pri[j]] = pri[j] + 1;Mx[i*pri[j]] = pri[j];}}
}
积性函数的性质及证明 + 线性筛相关推荐
- Master of Phi (欧拉函数 + 积性函数的性质 + 狄利克雷卷积)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6265 题目大意:首先T是测试组数,n代表当前这个数的因子的种类,然后接下来的p和q,代表当前这个数的因 ...
- HDU-1452 因子和 积性函数性质
详见代码: #include <cstdio> #include <cstring> #include <cstdlib> #define MOD 29 using ...
- 积性函数性质-POJ2480
https://vj.xtuacm.cf/contest/view.action?cid=146#problem/D 参考:http://www.cnblogs.com/xiaowuga/p/7161 ...
- P6222 「P6156 简单题」(反演 + 积性函数线性筛)
P6156 简单题 推式子 ∑i=1n∑j=1n(i+j)kf(gcd(i,j))gcd(i,j)=∑i=1n∑j=1n(i+j)kμ2(gcd(i,j))gcd(i,j)=∑d=1nμ2(d)dk+ ...
- 《算法竞赛中的初等数论》(三)正文 0x30 积性函数(ACM / OI / MO)(十五万字符数论书)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 写在最前面:本文部分内容来自网上各大博客或是各类图书,由我个人整理,增加些许见解,仅做学习交流使用,无 ...
- 专题·莫比乌斯函数与欧拉函数【including 整除分块,积性函数,狄利克雷卷积,欧拉函数,莫比乌斯函数,莫比乌斯反演
初见安~又是好久没写博客了--加上CSP才炸了一波. 目录 一.整除分块 题解 二.积性函数 三.狄利克雷卷积 四.欧拉函数 五.莫比乌斯函数(mu) 六.莫比乌斯反演 一.整除分块 看个例题:洛谷P ...
- 浅谈一类积性函数的前缀和(转载)
本文转自:http://blog.csdn.net/skywalkert/article/details/50500009 另外,莫比乌斯反演和杜教筛其他可转到 http://blog.leanote ...
- 《算法设计编程实验:大学程序设计课程与竞赛训练教材》——3.3 积性函数的实验范例...
3.3 积性函数的实验范例 首先,我们必须弄清楚什么是积性函数: 在非数论领域,积性函数是指所有对于任何a和b都有性质f(ab)=f(a)f(b)的函数. 在数论领域,考虑一个函数值为正整数的函数f, ...
- 浅谈积性函数求前缀和
转载至https://blog.csdn.net/skywalkert/article/details/50500009 前置技能 积性函数的定义 若f(n)f(n)的定义域为正整数域,值域为复数,即 ...
最新文章
- 【Kotlin】Kotlin 类的继承 二 ( 属性覆盖 | 属性覆盖的四种情况 | 常量 / 变量 属性覆盖 | 子类初始化与属性覆盖 )
- 读文件计算方法执行时间的实例
- 特征图大小_新手向快速了解图神经网络
- Twain 学习纪录
- ReplacingMergeTree:实现Clickhouse数据更新
- @EnableAsync annotation metadata was not injected
- jQuery 学习-DOM篇(六):jQuery 替换 DOM 元素
- VS2019,C#打包发布生成单个exe
- Mac OS X Tips
- 7-19 求链式线性表的倒数第K项
- 了解Minimax算法
- CSS3弹性盒子布局
- 高端物理学名词_什么是物理高端备课?
- 管理信息系统【四】之 管理信息系统战略规划与开发方法
- limma包的使用技巧
- 【数理知识】曲率 curvature,主曲率 principal curvature,高斯曲率 Gaussian curvature,平均曲率 mean curvature
- python全景图像拼接_python实现图像全景拼接
- vscode无法运行和调试使用了部分stl库的程序
- 问题解决:Weka打开csv文件出错
- 2010年6月计算机组织与结构,2010年职称计算机:Powerpoint组织结构图
热门文章
- LG30刷小米系统_初版BUG较多 小米9成功升级基于Android Q的MIUI系统
- 锐捷网络技能大赛-云平台部分-CentOS部分12-[Mariadb进阶-主从]
- 颜色不变性算法及应用总结
- 组合最优化——二次插值法
- 基于MindStudio的AdvancedEAST模型离线推理
- html5 webview面试,(五)Webview面试问题
- E. Restoring the Permutation
- CDPUserSvc_***停止了工作,无法禁用服务
- 网页设计与制作2.0
- matlab拟合平面,拟合平面,并求法向量