数论函数与数论恒等式
省选前最后要学的新知识了,下周开始模板复习。
1. 取整函数
r=⌊r⌋+{r},⌊r⌋∈Z,{r}∈[0,1)
r=⌈r⌉−c,⌈r⌉∈Z,c∈[0,1)
几个不等式:
插入/删除取整号
r<n⟺⌊r⌋<n
证明:
r<n⟺n−⌊r⌋>{r}≥0⟺⌊r⌋<n
同理有:
r>n⟺⌈r⌉>n
r≤n⟺⌈r⌉≤n
证明:
r≤n⟺⌈r⌉−c≤n⟺⌈r⌉−n≤c<1⟺⌈r⌉<n+1⟺⌈r⌉≤n
同理有:
r≥n⟺⌊r⌋≥n
整除边界值
⌊pi⌋=⌊pk⌋⇒k≤⎢⎣⎢⎢⎢p⌊pi⌋⎥⎦⎥⎥⎥
证明:
由于:
pi=⌊pi⌋+c1pk=⌊pk⌋+c2
满足c∈[0,1),联立以上若干式,可得:
0≤pk−⌊pi⌋<1
满足:
k≤p⌊pi⌋⟺k≤⎢⎣⎢⎢⎢p⌊pi⌋⎥⎦⎥⎥⎥
2. 数论函数
欧拉函数
φ(i)=∑k≤i[(i,k)=1]
性质: 欧拉函数是积性函数。
证明:
φ(ij)=∑k≤ij[(ij,k)=1]=∑k≤ij[(i,k)=1][(j,k)=1]=∑j(p−1)+q≤ij,q≤j[(i,j(p−1)+q)=1][(j,j(p−1)+q)=1]=∑(p−1)+q/j≤i,q≤j[(i,j(p−1)+q)=1][(j,q)=1]
设k=(p−1)+q/j,则原式为:
∑k≤i,q≤j[(i,kj)=1][(j,q)=1]
其中k是一个有理数,因为素数有无穷多个,对于任意大的i,j,总可以找到一个素数作为模。容易利用同余式证明模意义下存在:
(i,j)=1 then (i,kj)=1⟺(i,k)=1
则原式就是:
∑k≤i,q≤j[(i,k)=1][(j,q)=1]
注意到:
φ(i)φ(j)=⎛⎝∑k≤i[(i,k)=1]⎞⎠⎛⎝∑k≤j[(j,k)=1]⎞⎠=∑k≤i,p≤j[(i,k)=1][(j,p)=1]=∑k≤i,p≤j[(i,k)=1][(j,p)=1]
则有:∀(m,n)=1,φ(mn)=φ(m)φ(n)。
因子个数函数
d(n)=∑i[i|n]
性质: d(i)=∏(pk(i)+1)。证明依赖唯一分解定理和乘法原理。其中pk(i)表示第k个素数在i的唯一分解中的幂次。
函数d与另一个函数e(n)密切相关,它被定义为n的最小素因子在唯一分解中的幂次。
下列性质给出了O(n)求解d函数的方法。
- j为ij最小的素因子,d(ij)=d(i)(e(i)+2)(e(i)+1)
- (i,j)=1⇒d(ij)=d(i)∗d(j)
而e(i)的维护十分方便,因此可以得到:
const int MAXN = 50005;
int prime[MAXN], not_prime[MAXN], e[MAXN], d[MAXN], top = 0;
void get_prime(int n)
{
e[1] = 0, d[1] = 1;
for (int i = 2; i <= n; i++) {
if (!not_prime[i]) { prime[++top] = i, e[i] = 1, d[i] = 2; }
for (int j = 1; j <= top && prime[j]*i <= n; j++) {
not_prime[prime[j]*i] = 1;
if (i%prime[j] == 0) {
d[prime[j]*i] = d[i]/(e[i]+1)*(e[i]+2);
e[prime[j]*i] = e[i]+1;
break;
}
e[prime[j]*i] = 1;
d[prime[j]*i] = d[i]*d[prime[j]];
}
}
for (int i = 1; i <= 20; i++)
cout << d[i] << " ";
puts("");
}
莫比乌斯函数
μ(d)=[∀p,p(i)≤1](−1)∑p(i)
符号p(k)为k中蕴含素因子p的个数。
性质:
- 莫比乌斯函数是积性函数
- ∑d|nμ(d)=[n=1]
- (反演定理):
F(n)=∑d|nf(n)⟺f(n)=∑d|nμ(nd)F(d)
证明:
∑d|nμ(nd)F(d)=∑d|nμ(nd)∑k|df(k)=∑k|nf(k)∑k|d,d|nμ(nd)
令d=pk,q=n/k,原式=
∑k|nf(k)∑pk|nμ(npk)=∑k|nf(k)∑p|qμ(qp)=∑k|nf(k)[q=1]=f(n)
- 另一种形式的反演定理:
F(i)=∑k≥1f(ki)⟺f(i)=∑k≥1μ(k)F(ki)
处理的技巧
参见:http://blog.csdn.net/oiljt12138/article/details/70188437