数论 学习笔记
我是蒻蒻。
数论分块
解决形如 \(\displaystyle\sum_{i=1}^nf(i)g(\lfloor \frac{n}{i}\rfloor)\) 形式的问题。最基础的就是调和级数\(\displaystyle\sum_{i=1}^n\lfloor \frac{n}{i}\rfloor\)。
发现 \(g\) 的函数图像是一个下降的双曲线,我们可以将相同值分成同一块,快速计算同一块的贡献。
记录函数 \(D(n) 表示 \lfloor \frac{n}{i}\rfloor\) 的取值集合,我们发现以下性质:
::::info[性质一]
\(|D(n)|\le 2\sqrt{n}\)。对于 \(i\) 讨论与 \(\sqrt{n}\) 的大小关系即可证明。
::::
::::info[性质二]
\(|D(n)|=\lfloor\sqrt{4n+1}\rfloor-1\)。
::::
::::info[性质三]
单个块 \(i\) 的左右端点为 \(\lfloor \frac{n}{i+1}\rfloor+1\) 和 \(\lfloor \frac{n}{i}\rfloor\)。
同时我们发现 \(R=\lfloor \frac{n}{\lfloor \frac{n}{i}\rfloor} \rfloor\)
::::
::::info[性质四]
\(m\in D(n)\) 是 \(D(m)\in D(n)\) 的充要条件。
::::
通过性质三,我们可以快速处理相同块,结合性质一保证时间复杂度为根号级别。
狄利克雷卷积 (Dirichlet 卷积)
Dirichlet 卷积是一种在数论函数之间的二元运算。
\((f*g)(n)=\displaystyle\sum_{ij=n}f(i)g(j)\)。
同理,\((f*g)(n)=\displaystyle\sum_{d|n}f(d)g(\frac{n}{d})\)。
不一样的是,\((f+g)(n)=f(n)+g(n)\)
我们定义一些常用的数论符号:
单位函数 \(\varepsilon(n)\),当 \(n\) 值为 \(1\),否则为 \(0\)。
幂函数 \(\mathrm{Id}_k(n)=n^k\)
除数函数 \(\sigma_k(n)=\displaystyle\sum_{d|n}d^k\)
欧拉函数 \(\varphi(n)\) 表示 \(1\sim n\) 中与 \(n\) 互质的数的个数。
上面的函数都是积性函数,可以使用 Dirichlet 卷积转化。
重要的是,有等式 \((f*1)(n)=\displaystyle\sum_{d|n}f(d)\)。
同时 Dirichlet 卷积满足:交换律,结合律,分配律,单位元,逆元。
前四个直接拆拆贡献,这里我们说说逆元。
::::info[Dirichlet 逆元]
我们定义 \(g=f^{-1}\),使得 \((f*g)\) 等价于 \(\varepsilon\)。
这意味着 \((f*g)(n)\displaystyle =\sum_{ab=n}f(a)g(b)=\varepsilon(n)\)。
形式类似于一个方程组,\(f(1)\ne 0\),则可以推出:
\(g(n)=\frac{\varepsilon(n)-\displaystyle \sum_{ab=n,k\ne 1}f(a)g(b)
}{f(1)}\)
::::
莫比乌斯反演
说说莫比乌斯函数 \(\mu(n)\)。
-
\(n=1\) 时,\(\mu(n)=1\)
-
若存在质数 \(p\) 使得 \(p^2|n\),则 \(\mu(n)=0\)
-
否则,令 \(k\) 为 \(\displaystyle\sum_{i\in \text{primes}}[i|n]\),\(\mu(n)=(-1)^k\)。
易于证明,莫比乌斯函数是积性函数。
::::info[莫比乌斯函数的性质及证明]
\(\displaystyle\sum_{d|n}\mu(d)=\varepsilon(n)\)。证明如下。
令 \(\displaystyle n=\prod_{i=1}^{k}p_i^{e_i}\),\(\displaystyle m=\prod_{i=1}^{k}p_i\)
我们得到:
\(\displaystyle\sum_{d|n}\mu(d)=\sum_{d|m}\mu(d)=\sum_{i=0}^k\begin{pmatrix} k\\i\end{pmatrix}\times (-1)^i=(1+(-1))^k=[k=0]=[n=1]=\varepsilon(n)\)
其中用到了二项式定理。
::::
以 Dirichlet 卷积的形式,可以写成 \(\mu *1=\varepsilon\)。因此 \(\mu\) 是常值函数 \(1\) 的 Dirichlet 的逆。
对于此性质,我们可以得到:
\([i\perp j]=[\gcd(i,j)=1]=\displaystyle\sum_{d|\gcd(i,j)}\mu(d)=\sum_d[d|i][d|j]\mu(d)\)。
它将互素的条件转化为关于莫比乌斯函数的求和式,方便进一步推导。
以上为莫比乌斯函数的定义以及性质,接下来想想怎么求。
对于求 \(\mu(n)\) 显然可以考虑质因数分解。时间复杂度为 \(O(n)\)。
::::info[具体实现]
int mu(int x){
int ret=1;
for(int i=2;i*i<=x;i++){
if(x%i)continue;
ret=-ret,x/=i;
if(x%i==0)return 0;
}
if(x>1)ret=-ret;
return ret;
}
::::
对于求 \(\mu(1\sim n)\),利用它是积性函数,我们可以线性筛 \(O(n)\) 求出。
::::info[具体实现]
const int maxn=1e6+10;// 要求的大小
int mu[maxn];
vector<int>primes;
bool not_prime[maxn];
void get_mu(int n){
mu[1]=1;
for(int i=2;i<=n;i++){
if(!not_prime[i]){
primes.push_back(i);
mu[i]=-1;
}
for(int p:primes){
if(i*p>n)break;
not_prime[i*p]=1;
if(i%p==0){
mu[i*p]=0;
break;
}
mu[i*p]=-mu[i];
}
}
}
::::
莫比乌斯函数最重要的应用:莫比乌斯反演。
\(\displaystyle f(n)=\sum_{d|n}g(d)\Longleftrightarrow g(n)=\sum_{d|n}\mu(\frac{n}{d})f(d)\)
::::info[证明]
原命题等价于 \(f=g*1\Longleftrightarrow g=f*\mu\)
两边同时对 \(\mu\) 做卷积:\(f=g*1\Longleftrightarrow f*\mu=g*(1*\mu)=g\)
::::

浙公网安备 33010602011771号