数论学习笔记
数论学习笔记
定义
一些概念
- 数论函数(算术函数)
定义域为正整数,陪域为复数的函数。每个算术函数都可视为复数的序列。
最重要的算术函数是积性及加性函数。算术函数的最重要操作为狄利克雷卷积。
- 积性函数
满足
\[gcd(a, b)=1\quad f(ab)=f(a)f(b) \]则 \(f\) 是积性函数。
同理有加性函数
- 完全积性函数
同理有完全加性函数
- 艾弗森约定(艾佛森括号)
- **符号函数 **
一些数论函数
- 欧拉函数
\(\varphi(n)\) 是小于等于 \(n\) 的正整数中与 \(n\) 互质的数的数目
\[\varphi(n)=\sum\limits_{d\le n}[\gcd(d,n)=1]\\ \varphi(n)=n\times\prod\limits_{P_i\mid n}\frac{P_i-1}{P_i}\qquad P_i\in\mathbb{P} \]- 恒等函数
- 单位函数
- 幂函数
- 单位元函数
- 莫比乌斯函数
- 约数个数函数
- 约数和函数
狄利克雷卷积
定义
卷积(又称叠积(convolution)、褶积或旋积),是透过两个函数 \(f\) 和 \(g\) 生成第三个函数的一种数学算子。狄利克雷卷积是其中的一种。
狄利克雷卷积是定义在数论函数集上的一种二元运算,相当于是在这个定义上的一种乘法,而普通函数加法就是该定义上的加法。
\[(f\ast g)(n)=\sum_{d\mid n}f(d)\cdot g(\frac nd) \]运算
就和一般实数上的乘法与加法十分类似
-
交换律: \(f\ast g=g\ast f\)
-
结合律: \((f\ast g)\ast h=f\ast(g\ast h)\)
-
分配率: \(f\ast (g+h)=f\ast g + f\ast h\)
正如实数中有 \(\forall n,\ 1\times n=n\) 及 \(\forall n\ne0,\ n\times n^{-1}=1\) 一样,这里也存在**单位元函数 \(\varepsilon\) **,使得
- \(\forall f,\ f\ast\varepsilon=\varepsilon\ast f=f\)
- \(\forall f(1)\ne0,\ f\ast f^{-1}=\varepsilon\)
定理
一些定理
- 两个积性函数的狄利克雷卷积一定也是一个积性函数。
一些等式
\[\begin{align*} &I\ast I=d \qquad&(1)\\ &I\ast id=\sigma &(2)\\ &\varphi\ast I=id &(3)\\ &I\ast\mu=\varepsilon &(4) \end{align*} \]证明 \((4)\)? :
\[\because \varphi\ast I=id\\ id\ast\mu=\varphi\\ \therefore \varphi\ast I\ast\mu=\varphi=\varphi\ast\varepsilon\\ \therefore I\ast\mu=\varepsilon \]即 \(I\) 与 \(\mu\) 互为反函数, \(I=\mu^{-1},\ \mu=I^{-1}\)
\[\begin{align*} &d(ij)=\sum_{x\mid i}\sum_{y\mid j}[\gcd(x,y)=1]\qquad&(5)\\ &\sum_{d\mid n}\varphi(d)=n &(6)\\ &\mu\ast id=\varphi &(7)\\ \end{align*} \]
证明 \((7)\)? :
\[\begin{align*} \because\mu\ast I&=\varepsilon\\ \therefore id\ast\mu\ast I&=id\ast\varepsilon=id\\ \because\varphi\ast I&=id\\ \therefore id\ast\mu&=\varphi \end{align*} \]莫比乌斯反演
性质
莫比乌斯函数不仅是积性函数,还有如下性质:
\[\sum_{d\mid n}\mu(d)= \begin{cases} 1\quad n=1\\ 0\quad n\ne1 \end{cases} \]结论
结论 1
\[F(n)=\sum_{d\mid n}f(d) \implies f=\mu\ast F \]称数论函数 \(F(n)\) 为数论函数 \(f(n)\) 的莫比乌斯变换,数论函数 \(f(n)\) 为数论函数 \(F(n)\) 的莫比乌斯逆变换(反演)。
证明:
\[\because F(n)=\sum_{d\mid n}f(d)\times1=\sum_{d\mid n}f(d)I(\frac nd)\\ \therefore F=f\ast I\\ \because I\ast\mu=\varepsilon\\ \therefore F\ast\mu=f\ast\varepsilon\\ \therefore f=\mu\ast\varepsilon \]结论 2
\[[P=1]=\sum_{d\mid P}\mu(d) \]证明:
\[\begin{align*} [P=1]&=\varepsilon(P)\\\\ &=(I\ast\mu)(P)\\\\ &=\sum_{d\mid P}\mu(d) \end{align*} \]应用:
例 1
\[[\gcd(i,j)=1]=\sum_{d\mid \gcd(i,j)}\mu(d)=\sum_{d\mid i\and d\mid j}\mu(d) \]模板代码
线性筛
许多积性函数对质数有特殊性质,使得我们可以简单地计算函数值,
同时,又因为任意两个质数互质,于是我们可以利用质数和数论函数的积性筛出更一般的数的函数值。
使用线性筛可以 \(O(n)\) 地筛出大部分积性函数的值。
欧拉函数
#include
#include
int n, phi[N];
std::vector prime;//筛出的质数
std::bitset cmpst;//composite 合数
inline void Euler() {
cmpst.reset();
phi[1] = 1;//特殊值
for (register int i=2, tmp; i<=n; ++i) {
if (!cmpst[i]) {
prime.push_back(i);
phi[i] = i-1;//质数的phi值
}
for (register int p : prime) {
tmp = i*p;
if (tmp > n) break;
cmpst[tmp] = 1;//标记合数
if (i%p == 0) {//线性筛的核心操作:此时p是i的最小质因数
phi[tmp] = phi[i] * p;
break;
} phi[tmp] = phi[i] * phi[p];//合数的phi值,利用phi的积性
}
}
}
莫比乌斯函数
#include
#include
#define N 50030
int mu[N];
bitset nap;//not a prime
vector prime;
inline void seive(int n = N - 20) {
mu[1] = 1; nap[1] = 1;
for (rg int i=2; i<=n; ++i) {
if (!nap[i]) {
mu[i] = -1;
prime.push_back(i);
}
for (rg int p : prime) {
if (i * p > n) break;
nap[i * p] = 1;
if (i % p == 0) { mu[i * p] = 0; break; }
mu[i * p] = -mu[i];
}
}
}
整除分块(数论分块)
对于多组询问求形如下式的值
\[\sum_{i=1}^n S(\lfloor\frac ki\rfloor)f(i) \]其中 \(S\) 与 \(f\) 都是可以 \(O(1)\) 求值的函数
我们可以使用整除分块将其从 \(O(n)\) 优化至 \(O(\sqrt n)\) 。
原理:当 \(i\) 在一些区间 \([l,r],\ l,r\in[1,n]\) 中时, \(\lfloor\frac ki\rfloor\) 为定值。
我们可以在预处理中将 \(f\) 前缀和为 \(sum\_f\)
已知 \(l,k\) ,我们可以 \(O(1)\) 求出 \(r=\lfloor\frac k{\lfloor \frac ki\rfloor}\rfloor\) 。。
特别注意:有时候 \(i>k\) 了就会出现除以 0 的情况。(易知当 \(k\ge n\) 时不会出现)
int ans = 0;
for (int l=1, r; l<=n; l=r+1) {
r = (l > k) ? n : min( k / (k / l), n );
ans += S(l) * ( num_f(r) - sum_f(l-1) );
}
return ans;
典型例题
GCD - Extreme (II)
UVA11426
\(1\le n\le4\times10^6+1\) ,数据组数: \(T\le100\) ,求:
\[\sum_{i=1}^n\sum_{j=i+1}^n\gcd(i,j) \]解:
\[\begin{align*} \sum_{i=1}^n\sum_{j=i+1}^n\gcd(i,j)&= \sum_{j=1}^n\sum_{i=1}^{j-1}\gcd(i,j)\\ &=\sum_{d=1}^nd\sum_{j=1}^n\sum_{i=1}^{j-1}[\gcd(i,j)=d]\\ &=\sum_{d=1}^nd\sum_{j=1}^{\lfloor\frac nd\rfloor}\sum_{i=1}^{j-1}[\gcd(i,j)=1]\\ \end{align*} \]注意到:
\[\because \varphi(j)=\sum_{i=1}^j[\gcd(i,j)=1]\\ \therefore \sum_{i=1}^{j-1}[\gcd(i,j)=1]= \begin{cases} 0&j=1\\ \varphi(j)\quad&j>1 \end{cases}\\ \]于是我们定义 \(\varphi\) 的从 2 开始的前缀和 \(\operatorname{\varphi_s}(x)=\sum\limits_{i=2}^x\varphi(i)\) ,它可以用线性筛筛出来后 \(O(1)\) 求出。
那么继续:
\[\begin{align*} \sum_{i=1}^n\sum_{j=i+1}^n\gcd(i,j) &=\sum_{d=1}^nd\sum_{j=1}^{\lfloor\frac nd\rfloor}\sum_{i=1}^{j-1}[\gcd(i,j)=1]\\ &=\sum_{d=1}^nd\times\operatorname{\varphi_s}(\lfloor\frac nd\rfloor) \end{align*} \]利用整除分块,可以做到 \(O(n+T\sqrt n)\)
[NOI2010] 能量采集
P1447