学习笔记:数论
0x00 前言
本文(可能)包含的内容:
- 学习数论的前置知识
- 各类数论函数与其性质(和证明)
- 如何使用各类筛求积性函数值
- 在 OI 题目中的应用
参考资料:
- 论文 ALGEBRAIC AND ANALYTIC PROPERTIES OF ARITHMETIC FUNCTIONS
- 算法学习笔记(18):欧拉函数
- 算法学习笔记(36): 莫比乌斯反演
- OI Wiki 筛法
- OI Wiki 杜教筛
阅读本文您应该有初中数学水平,如果没有建议阅读初一至初三的数学书。
如果文中有数学记号或专有名词您不懂其意思,请看 0xF0 附件。
0x01 数学杂项
狄利克雷卷积
定义:对于两个数论函数 \(f,g\),他们的狄利克雷卷积 \((f*g)(n)=\sum\limits_{d|n}f(n)g(\frac{n}{d})\),即 \((f*g)(n)=\sum\limits_{ab=n}f(a)g(b)\)
性质:两个积性函数 \(f,g\) 的狄利克雷卷积也是积性函数。
证明:设 \(h\) 为 \(f,g\) 的狄利克雷卷积,即 \(h(n)=\sum\limits_{d|n}f(n)g(\frac{n}{d})\),\(gcd(x,y)=1\)
证毕。
0x10 数论函数
本 part 记录了几种常见的数论函数及其性质(和证明),有一些过于简单的会放在 0xF2 中。
0x11 欧拉函数
欧拉函数,符号为 \(\varphi\),意为 \(\varphi(n)=\sum\limits_{i=1}^{n-1}[\gcd(i,n)=1]\),即所有小于 \(n\) 的数中有几个数和 \(n\) 互质。
接下来是性质(和证明),设 \(p \in prime\)
性质1: \(\varphi(p)=p-1\),证明显然。
性质2:\(\varphi(p^k)=p^k-p^{k-1}\quad(k \in \mathbb{Z+})\)
证明:\(p^k\) 有且仅有质因数 \(p\),而比它小的 \(p^{k-1}-1\) 个数中,也存在几个数含有质因数 \(p\):
\(p,2p,3p,\cdots,(p^{k-1}-1)p\),一共有 \(p^{k-1}-1\) 个数。
于是在 \(1 \sim p^k-1\) 中,与 \(p^k\) 互质的数的个数为 \((p^k-1)-(p^{k-1}-1)=p^k-p^{k-1}\)。
证毕。
性质3:\(\varphi(ax)=a\varphi(x)\quad(a|x)\)
性质4:\(\varphi(x)\varphi(y)=\varphi(xy)\quad (\gcd(x,y)=1)\),所以欧拉函数是积性函数。
性质5:设 \(n\) 的质因数分解为 \(\prod\limits_{i=1}^mp_i^{a_i}\),那么 \(\varphi(n)=n\prod\limits_{i=1}^m(1-\frac{1}{p_i})\)
性质6:\(\sum\limits_{d|n}\varphi(d)=n\)
证明:设 \(f(n)=\sum\limits_{d|n}\varphi(d)\),当 \(gcd(x,y)=1\) 时:
所以 \(f\) 是积性函数,那么设 \(n\) 的质因数分解为 \(\prod\limits_{i=1}^mp_i^{a_i}\),由 \(f\) 是积性函数可得:
由性质2,可得 \(f(p^c)=\varphi(1)+\varphi(p)+\varphi(p^2)+\cdots+\varphi(p^c)=1+(p-1)+(p^2-p)+\cdots+(p^c-p^{c-1})=p^c\)
所以 \(f(n)=\prod_{i=1}^mf(p_i^{a_i})=\prod_{i=1}^mp_i^{a_i}=n\)
原命题得证。
证毕。
0x12 莫比乌斯函数
莫比乌斯函数,符号为 \(\mu\),定义如下:
性质1:\(\mu(x)\mu(y)=\mu(xy)\quad(\gcd(x,y)=1)\)
证明:如果 \(x = 1\) 或 \(y = 1\),显然。
如果 \(\mu(x) = 0\) 或 \(\mu(y) = 0\),显然。
否则 \(\mu(x) \mu(y) = (-1)^{m_x} (-1)^{m_y} = (-1)^{m_x+m_y} = \mu(xy)\)
证毕。
性质2:\(\sum\limits_{d|n}\mu(d)=\epsilon(n)\)
证明:与欧拉函数的性质6证明类似。
0x20 筛法
本 part 记录了几种常见的筛法筛积性函数和素数的方法。
0x21 埃拉托斯特尼筛法(埃氏筛)
筛质数
考虑如果一个数 \(x\) 是合数,那么 \(x\) 的倍数也是合数,所以如果我们从小到大考虑每个数,然后同时把当前这个数的所有(比自己大的)倍数记为合数,那么运行结束的时候没有被标记的数就是素数了。
CI N = 2e5; bool Mx[N + 5];
void Eratosthenes (int n) {
RI i, j; Mx[1] = 1; for (i = 2; i <= n; ++ i) if (! Mx[i]) for (j = 2; i * j <= n; ++ j) Mx[i * j] = 1;
}
时间复杂度 \(O(n\log\log n)\)
0x22 线性筛(欧拉筛)
考虑到埃氏筛一个合数可能被筛多遍,如果省掉无意义的步骤,复杂度就降为 \(O(n)\) 了。
筛质数
CI N = 2e5; int P[N + 5], Nt; bool Mx[N + 5];
void Euler (int n) {
RI i, j; for (i = 2; i <= n; ++ i) for (! Mx[i] && (P[++ Nt] = i), j = 1; j <= Nt && i * P[j] <= n; ++ j) if (Mx[i * P[j]] = 1, ! (i % P[j])) break;
}
筛欧拉函数
根据欧拉函数的如下性质:
- \(\varphi(p)=p-1\quad(p \in prime)\)
- \(\varphi(x\times p)=\varphi(x)\times p\quad(p\mid x)\)
- \(\varphi(x\times p)=\varphi(x)\times(p-1)\quad(\gcd(p,x)=1)\)
可以在筛质数的同时筛出欧拉函数。
CI N = 1e5; int P[N + 5], Pt, phi[N + 5], n; bool Mx[N + 5];
void C (int d)
{
RI i, j; phi[1] = 1; for (i = 2; i <= d; ++ i) for (! Mx[i] && (P[++ Pt] = i, phi[i] = i - 1), j = 1; j <= Pt && i * P[j] <= d; ++ j) {
if (Mx[i * P[j]] = 1, ! (i % P[j]) && (phi[P[j] * i] = phi[i] * P[j], 1)) break;
else phi[i * P[j]] = phi[i] * (P[j] - 1);
}
}
筛莫比乌斯函数
CI N = 1e5; int P[N + 5], Pt, mu[N + 5], n; bool Mx[N + 5];
void C (int d)
{
RI i, j; mu[1] = -1; for (i = 2; i <= d; ++ i) for (! Mx[i] && (P[++ Pt] = i, mu[i] = -1), j = 1; j <= Pt && i * P[j] <= d; ++ j) {
if (Mx[i * P[j]] = 1, ! (i % P[j]) && (mu[P[j] * i] = 0, 1)) break;
else mu[i * P[j]] = -mu[i];
}
}
0x30 例题
P2158 [SDOI2008] 仪仗队
思路
显然,如果一个坐标 \((x,y)\),\(\gcd(x,y) \ne 1\),那么这个点一定会被 \((\frac{x}{\gcd(x,y)},\frac{y}{\gcd(x,y)})\) 这个点挡住。那么,这个式子就很显然了:
这个式子可以拆成三部分:
其中因为对于所有 \((x,x)\) 的点,都会被 \((2,2)\) 挡住,所以中间这部分为 \(1\)。由图像可知,式子前后两部分是对称的,所以这个式子可以化简为:
而 \(\sum_{y=1}^{x-1} [\gcd(x,y)=1]\) 这部分刚好是 \(\varphi\) 的定义,所以最终式子为:
可以先线性筛筛出 \(1 \sim n\) 的欧拉函数,然后 \(O(n)\) 统计答案。
P2398 GCD SUM
通过欧拉函数的性质,可以将这个式子化简为:
这样就可以 \(O(n)\) 解决问题了,可以再套一个整除分块,但是 \(n \le 10^5\),所以没必要。
P3455 [POI2007]ZAP-Queries
假设 \(b \ge a\),那么题目显然让我们求
将 \(x\) 除掉,得:
根据莫比乌斯函数的性质,得:
将 \(d\) 改为枚举 \(d\) 的形式,得:
发现 \(\sum\limits_{d=1}^{\lfloor\frac{a}{x}\rfloor} \mu(d)\) 可以提到前面去,得:
如果 \([d | \gcd(i,j)] = 1\),那么 \(i,j\) 都要是 \(d\) 的倍数,于是得:
由于有多组数据,所以套一个整除分块,复杂度 \(O(T\sqrt n)\),其中 \(T\) 为数据组数,\(n\) 为 \(\min(a,b)\)。
0xF0 附件
0xF1 算式中出现的符号及其含义
符号 | 含义 | 例子 |
---|---|---|
\(x \mid y,x \nmid y\) | 前者为 \(y\) 整除 \(x\),即 \(x\) 是 \(y\) 的因数;后者与前者相反 | \(1 \mid 2,2\mid6 ,4\mid 20,3 \nmid 4,4 \nmid 9\) |
\(\gcd(x,y)\) | \(x\) 和 \(y\) 的最大公因数 | \(\gcd(2,4)=2,\gcd(3,7)=1\) |
\(\sum\) | 求和,具体见例子 | \(\sum\limits_{i=1}^na_i=a_1+a_2+\cdots+a_n,\sum\limits_{d\mid n}d=n的所有因数相加\) |
\(\prod\) | 求积,具体见例子 | \(\prod\limits_{i=1}^n a_i=a_1 \times a_2 \times \cdots \times a_n\) |
\(\forall\) | 所有满足某条件的数 | \(\forall x\mid y\) 指 \(x\) 的取值范围为 \(y\) 的因数,或 \(y\) 的因数集合 |
\([A]\) | 如果 \(A\) 为 false,那么 \([A]=0\);如果 \(A\) 为 true,那么 \([A]=1\) | \([2\mid 3]=0,[\gcd(2,4)=2]=1,[1=0]=0\) |
\(\lfloor x \rfloor\) | 向下取整 | \(\lfloor 1.2 \rfloor = 1,\lfloor 4.9 \rfloor = 4,\lfloor 5 \rfloor = 5\) |
0xF2 描述中出现的专有名词或字母含义
- 数论函数: 指在整数集中定义的函数。
- 积性函数:如果数论函数 \(f\),对于满足 \(\gcd(x,y)=1\) 的 \(\forall x,y\),\(f(x)f(y)=f(xy)\) ,那么 \(f\) 就是一个积性函数。
- \(\mathbb{Z}\):指整数集,\(\mathbb{Z+}\) 指正整数集。
- \(\epsilon\):单位函数,定义为 \(\epsilon(1)=1,\epsilon(n)=0\quad(n\ge2)\)。
- \(Id\):单位函数,定义为 \(Id(n)=n\)。