首页 > 其他分享 >【学习笔记】狄利克雷卷积与高级筛法

【学习笔记】狄利克雷卷积与高级筛法

时间:2023-06-08 17:36:12浏览次数:47  
标签:lfloor right 筛法 狄利克 卷积 dfrac sum rfloor left

狄利克雷卷积

概念

对于数论函数 \(f,g\),定义其狄利克雷卷积 \(h=f*g\),满足:

\[h(n)=(f*g)(n)=\sum_{d\mid n} f(d)g\left(\dfrac{n}{d}\right) \]

运算律:

  • 满足交换律,显然具有对称性。

  • 满足结合律,等价于三个 \(d_i\) 贡献到 \(n\)。

  • 满足加法的分配率。

常见数论函数:

  • \(\mathrm{I}\),常函数,值恒为 \(1\)。

  • \(\mathrm{Id}_k\),幂函数,值为 \(n^k\)。

  • \(\epsilon\),狄利克雷卷积的单位元,除 \(\epsilon(1)=1\) 外其余均为 \(0\)。

  • \(\mu\),莫比乌斯函数,狄利克雷卷积的逆元。

  • \(\varphi\),欧拉函数。

  • \(\sigma_k\),除数函数,定义 \(\sigma_k(n)=\sum_{d\mid n}d^k\)。

常见数论函数卷积变换

  • \(\mu *\mathrm{I}=\epsilon\)。

  • \(\varphi *\mathrm{I}=\mathrm{Id}\)

  • \(\mathrm{Id}_k *\mathrm{I}=\sigma_k\)

  • \(\mu* \mathrm{Id}=\varphi\)

  • \((\mu \cdot \mathrm{Id}_k)*\mathrm{Id}_k=\epsilon\)

  • \((\varphi\cdot \mathrm{Id}_k)*\mathrm{Id}_k=\mathrm{Id}_{k+1}\)

杜教筛

原理

求数论函数前缀和。

设 \(h=f*g,S=\sum f\),容易推得:

\[\begin{aligned} \sum_{i=1}^n h(i)&=\sum_{i=1}^n \sum_{j\mid i} f(j)g\left(\dfrac{i}{j}\right)\\ &=\sum_{j=1}^n g(j)\sum_{i=1}^{\left\lfloor n/i\right\rfloor} f(i)\\ &=\sum_{i=1}^n g(i)S\left(\left\lfloor \dfrac{n}{i}\right\rfloor\right) \end{aligned} \]

整理一下可以写成:

\[g(1)S(n)=\sum_{i=1}^n h(i)-\sum_{i=2}^{n} g(i)S\left(\left\lfloor \dfrac{n}{i}\right\rfloor\right) \]

如果构造出可以快速计算前缀和的函数 \(g,h\),就可以递归求解了。

时间复杂度

首先需要证明的是:

\[\left\lfloor\dfrac{\left\lfloor\tfrac{n}{a}\right\rfloor}{b}\right\rfloor=\left\lfloor\dfrac{n}{ab}\right\rfloor \]

设 \(\mathrm{RHS}=k\),则有:

\[k\times ab\le n<(k+1)\times ab \]

于是:

\[k\times b\le \dfrac{n}{a}<(k+1)\times b \]

从而:

\[k\times b\le \left\lfloor\dfrac{n}{a}\right\rfloor<(k+1)\times b \]

\[k\le \dfrac{\left\lfloor\tfrac{n}{a}\right\rfloor}{b}<k+1 \]

即:

\[\left\lfloor\dfrac{\left\lfloor\tfrac{n}{a}\right\rfloor}{b}\right\rfloor=\left\lfloor\dfrac{n}{ab}\right\rfloor \]


这说明当我们整除分块向下递归时,递归到 \(n'=\left\lfloor \dfrac{n}{d}\right\rfloor\),枚举 \(d'\) 得到 \(\left\lfloor \dfrac{n'}{d'}\right\rfloor=\left\lfloor \dfrac{\left\lfloor \tfrac{n}{d}\right\rfloor}{d'}\right\rfloor\),一定可以表示为 \(\left\lfloor \dfrac{n}{k}\right\rfloor\) 的形式,而这一定在第一层递归时处理到(不考虑先后顺序),于是在记忆化的加持下,计算复杂度只需要考虑第一层递归即可。

设当前块长 \(i\),对复杂度的贡献就是 \(O\left(\sqrt{\dfrac{n}{i}}\right)\)。

当 \(i> \sqrt{n}\) 时,第二层最大 \(O(n^{1/4})\),所以总复杂度 \(O(n^{3/4})\)。

当 \(i\le \sqrt{n}\) 时,就写成:

\[\begin{aligned} T(n)&=O\left(\sum_{i=1}^{\sqrt{n}} \sqrt{\dfrac{n}{i}}\right)\\ &=O\left(\sqrt{n}\int_{1}^n \dfrac{1}{\sqrt{x}} \mathrm{d}x\right)\\ &=O(x^{3/4}) \end{aligned} \]

但较小的前缀和是可以预处理出的,假设预处理出了 \([1,n^k]\) 的前缀和,那么也就是只有 \(\dfrac{n}{i}>n^k\) 的部分才需要递归,也就变成:

\[\begin{aligned} T(n)&=O\left(n^k+\sum_{i=1}^{n^{1-k}} \sqrt{\dfrac{n}{i}}\right)\\ &=O\left(n^k+\sqrt{n}\int_{1}^{n^{1-k}} \dfrac{1}{\sqrt{x}}\mathrm{d}x\right)\\ &=O(n^k+n^{1-k/2}) \end{aligned} \]

取 \(k=\dfrac{2}{3}\) 得到理论最优复杂度 \(O(n^{2/3})\)。

整除分块时(无论嵌套几层)使用杜教筛求数论函数前缀和,由于所有询问的区间右端点为 \(\left\lfloor \dfrac{n}{\left\lfloor \tfrac{n}{d}\right\rfloor}\right\rfloor\),可以表示为上述记忆化的形式,所以并不会增加复杂度。

常用构造

最常用的是 \(\mu *\mathrm{I}=\epsilon\) 以及 \(\varphi *\mathrm{I}=\mathrm{Id}\)。

在此基础上有:\((\mu\cdot \mathrm{Id}_k)*\mathrm{Id}_k=\epsilon\),\((\varphi\cdot \mathrm{Id}_k) * \mathrm{Id}_{k}=\mathrm{Id}_{k+1}\)。

另外根据 \(\sigma_k\) 的定义有 \(\mathrm{Id}_k*\mathrm{I}=\sigma_k\)。

例题

Luogu-P5218 无聊的水题 II

容易发现是要求选出一个集合满足 \(\gcd=1\)。

设 \(F(n)\) 为值域 \([1,n]\) 的方案数,那么 \(\gcd=k\) 就是 \(F\left(\left\lfloor \dfrac{n}{k}\right\rfloor\right)\),可以单步容斥。

\[F(n)=2^n-1-\sum_{k=2}^n F\left(\left\lfloor \dfrac{n}{k}\right\rfloor\right) \]

式子长得像杜教筛,复杂度 \(O(n^{3/4})\) 不太好过。

考虑设 \(f(d)\) 为 \(\gcd=d\) 的方案数,\(g(d)\) 为 \(d \mid \gcd\) 的方案数,则 \(g(d)=2^{\left\lfloor n/d\right\rfloor}-1\),且有:

\[g(d)=\sum_{d\mid n} f(n) \]

根据莫比乌斯反演有:

\[f(d)=\sum_{d\mid n} \mu\left(\dfrac{n}{d}\right) g(n) \]

所以:

\[f(1)=\sum_{i=1}^n \mu(i)g(i)=\sum_{i=1}^n \mu(i)(2^{\left\lfloor n/i\right\rfloor}-1) \]

杜教筛预处理+整除分块即可,使用光速幂复杂度 \(O(n^{2/3})\)。

LOJ-6229 这是一道简单的数学题

把 \(j\) 的上下界改成 \([1,n]\),处理一下 \(i=j\) 的情况即可。

简单反演得到:

\[\sum_{T=1}^n\sum_{d\mid T} \mu(d)d^2 S_1\left(\left\lfloor \dfrac{n}{d}\right\rfloor\right)^2 \]

\(S_1(x)\) 是 \(1\) 次自然数幂和。

于是要求 \(\sum_{d\mid n} \mu(d)d^2\) 的前缀和,不难发现这个函数是 \((\mu \cdot \mathrm{Id}_2)* \mathrm{I}\),根据狄利克雷卷积的交换律以及结合律,可以得到 \((\mu \cdot \mathrm{Id}_2)*\mathrm{I}*\mathrm{Id}_2=(\mu \cdot \mathrm{Id}_2)*\mathrm{Id}_2*\mathrm{I}=\epsilon*\mathrm{I}=\mathrm{I}\)。

于是有:

\[S_f(n)=n-\sum_{i=2}^{n} i^2S_f\left(\left\lfloor \dfrac{n}{i}\right\rfloor\right) \]

杜教筛处理即可。

LOJ-6491 [XXOI 2018]简单的最大公约数

和上面的题差不多,先设 \(f(m)\) 表示值域 \([1,m]\),\(n\) 个数 \(\gcd=1\) 的方案数,答案是 \(\sum_{k=1}^m k\times f\left(\left\lfloor \dfrac{m}{k}\right\rfloor\right)\),最终求解用整除分块。

\[f(m)=m^n-\sum_{i=2}^m f\left(\left\lfloor \dfrac{m}{i}\right\rfloor\right) \]

直接算还是 \(O(n^{3/4})\)。

希望预处理一些 \(f\)。

依旧是莫比乌斯反演,把 \(f(m,k)\) 扩充到值域 \([1,m]\),\(\gcd=k\) 的方案数,\(g(m,k)\) 定义为值域 \([1,m]\),\(k\mid \gcd\) 的方案数,于是反演得到:

\[g(m,k)=\left\lfloor \dfrac{m}{k}\right\rfloor^{n} \]

\[f(m,k)=\sum_{k\mid m'} \mu\left(\dfrac{m'}{k}\right) \left\lfloor \dfrac{m}{m'}\right\rfloor^{n} \]

只关心 \(k=1\),所以有:

\[f(m)=\sum_{k=1}^m \mu(k) \left\lfloor \dfrac{m}{k}\right\rfloor^{n} \]

这个直接求一行比较困难,考虑差分:

\[\begin{aligned} \Delta f(m)&=f(m)-f(m-1)\\ &=\sum_{k=1}^m \mu(k) \left(\left\lfloor \dfrac{m}{k}\right\rfloor^{n}-\left\lfloor \dfrac{m-1}{k}\right\rfloor^{n}\right) \end{aligned} \]

分析一下什么时候 \(\left\lfloor \dfrac{m}{k}\right\rfloor\neq \left\lfloor \dfrac{m-1}{k}\right\rfloor^{n}\),显然一定是 \(k\mid m\),即 \(m\) 恰好到了下一个块里。

于是这个预处理就是调和级数 \(O(n\log n)\) 的,由于 \(\mu\) 的性质,实际产生贡献的会更少。

这样大致处理 \(2\times 10^6\) 左右,再套类似杜教筛的东西就可以通过了。


另一个做法是使用欧拉反演,即利用 \(\varphi *\mathrm{I}=\mathrm{Id}\) 的性质,可以得到:

\[\begin{aligned} &\sum_{i_1=1}^m\sum_{i_2=1}^m\cdots\sum_{i_n=1}^m \gcd(i_1,i_2,\cdots,i_n)\\ =&\sum_{i_1=1}^m\sum_{i_2=1}^m\cdots\sum_{i_n=1}^m \sum_{d\mid \gcd(i_1,i_2,\cdots,i_n)} \varphi(d)\\ =&\sum_{d=1}^m \varphi(d) \left\lfloor\dfrac{m}{d}\right\rfloor^n \end{aligned} \]

杜教筛朴素计算即可。

PN 筛

Powerful Number

定义一个数 \(n\) 是 Powerful Number(PN) 当且仅当 \(n=\prod_{p\in \mathbf{P}} p_i^{c_i},c_i>1\)。

每个 PN 一定可以被唯一表示为 \(a^2b^3\) 的形式,次数为偶数的放在 \(a\) 部分,次数为奇数的将 \(3\) 次放在 \(b\) 部分,剩余放在 \(a\) 部分。

于是可以通过,,枚举 \(a\) 的值来计算 PN 的个数,大致是:

\[O\left(\sum_{i=1}^{\sqrt{n}}\sqrt[3]{\dfrac{n}{i^2}}\right)=O\left(\int_1^{\sqrt{n}} \sqrt[3]{\dfrac{n}{i^2}}\right)=O(\sqrt{n}) \]

所以可以通过 DFS 来得出所有 PN。

求积性函数前缀和

模板题为例。

给定积性函数 \(f\),求其前缀和。

考虑构造积性函数 \(g\),满足 \(g(p)=f(p)\),这里 \(g(p)=f(p)=p(p-1)\),可以构造 \(g=\varphi\cdot\mathrm{Id}\)。

再找到积性函数 \(h\),满足 \(f=g*h\),由于 \(f(p)=g(1)h(p)+g(p)h(1)\),积性函数 \(1\) 处点值一定为 \(1\),所以 \(f(p)=h(p)+g(p)\),即 \(h(p)=0\),这样所有可以被质因子筛到的点值处都是 \(0\),也就是所有非 PN 点值都是 \(0\)。

这样化简 \(f\) 前缀和的式子:

\[\begin{aligned} &\sum_{i=1}^n f(i)\\ =&\sum_{i=1}^n \sum_{j\mid i}g(i)h\left(\dfrac{i}{j}\right)\\ =&\sum_{i=1}^n h(i)S_g\left(\left\lfloor\dfrac{n}{i}\right\rfloor\right)\\ =&\sum_{\substack{i=1\\ \text{i is PN}}}^n h(i)S_g\left(\left\lfloor\dfrac{n}{i}\right\rfloor\right) \end{aligned}\]

\(g\) 的前缀和可以用杜教筛求出(有更优秀的也可以),计算答案在 DFS 求出所有 PN 时进行,其中求 \(h\) 可以求出所有 \(h(p^c)\) 再累乘。

求 \(h(p^c)\) 最常规的办法是利用 \(f=g*h\),移项得到 \(h(p^c)=f(p^c)-\sum_{i=0}^{c-1} h(p^i)g(p^{c-i})\)。

复杂度分析

求 \(g\) 前缀和复杂度认为是杜教筛复杂度 \(O(n^{2/3})\)。

由素数密度 \(\pi(n)=O\left(\dfrac{n}{\log n}\right)\) 知,只预处理 \(O(\sqrt{n})\) 的质数,暴力枚举每个 \(p^c\) 并 \(O(\log n)\) 计算 \(h\) 的值,复杂度是 \(O(\sqrt{n}\log n)\),实际这个上界比较松。

于是得到大致是 \(O(n^{2/3})\) 的复杂度。

算法流程总结

  1. 用积性函数拟合出合适的 \(g\)。

  2. 构造快速求 \(g\) 前缀和的方法。

  3. 预处理出 \(h(p^c)\)。

  4. DFS 出所有 PN 并计算答案。

例题

LOJ-6053 简单的函数

\(p\) 处点值是 \(p-1\),除了 \(f(2)=3\),先不考虑这一点的话拟合成 \(\varphi\) 是非常好的,在此基础上 \(\varphi(2)=1\),所以将 \(2\) 的倍数处拟合成 \(3\varphi\)(肯定不是 \(\varphi+2\)吧)。

\[g(n)=\begin{cases}3\varphi(n)&2\mid n\\\varphi(n)&2\nmid n\end{cases} \]

把 \(\varphi\) 提出一个会好一点,顺便把系数也带出来:

\[l(n)=\begin{cases}\varphi(n)&2\mid n\\0&2\nmid n\end{cases} \]

于是 \(g(n)=\varphi(n)+2l(n)\),也即 \(S_g(n)=S_\varphi(n)+2S_l(n)\)。

注意到 \(S_l(n)\) 有意义的 \(n\) 都是偶数,可以用一个 \(S(n)=\sum_{i=1}^n \varphi(2i)\) 来代替,即 \(S_l(n)=S\left(\left\lfloor\dfrac{n}{2}\right\rfloor\right)\)。

把 \(\varphi(2n)\) 详写成关于 \(n\) 的:

\[\varphi(2n)=\begin{cases}2\varphi(n)&2\mid n\\\varphi(n)&2\nmid n\end{cases} \]

参照上面的化简方法,得到:

\[\varphi(2n)-\varphi(n)=\begin{cases}\varphi(n)&2\mid n\\0&2\nmid n\end{cases} \]

这个和 \(l\) 一模一样,这里当然再把 \(S_l\) 换成 \(S\)。

\[S(n)=S_\varphi(n)+S\left(\left\lfloor\dfrac{n}{2}\right\rfloor\right) \]

放回最初的式子 \(S_g(n)=S_\varphi(n)+2S_h(n)=S_\varphi(n)+2S\left(\left\lfloor\dfrac{n}{2}\right\rfloor\right)\),这样一直把 \(S\) 展开,就是一个倍增的形式,单次计算是 \(O(\log n)\),所求点值都在杜教筛射程范围内。

构造的另一函数 \(h\) 就是朴素的 \(O(\sqrt{n}\log n)\) 预处理。

根据 PN 的数量级和预处理的复杂度,总体仍是 \(O(n^{2/3})\)。

参考资料

狄利克雷卷积

杜教筛

PN 筛

标签:lfloor,right,筛法,狄利克,卷积,dfrac,sum,rfloor,left
From: https://www.cnblogs.com/SoyTony/p/Learning_Notes_about_Dirichlet_Convolution_and_Senior_Si

相关文章

  • 【数学】各种积性函数的线性筛法
    【数学】各种积性函数的线性筛法前置芝士:几种特殊的积性函数的定义及基本性质。定义积性函数:若函数\(f(x)\)满足\(f(x)=1\)且\(\forallx,y\inN^+,gcd(x,y)=1\),都有\(f(xy)=f(x)f(y)\),则\(f(x)\)为积性函数。完全积性函数:若函数满足\(f(x)=1\)且\(\forallx,y\in......
  • 算法学习笔记(24): 狄利克雷卷积和莫比乌斯反演
    狄利克雷卷积和莫比乌斯反演看了《组合数学》,再听了学长讲的……感觉三官被颠覆……目录狄利克雷卷积和莫比乌斯反演狄利克雷卷积特殊的函数函数之间的关系除数函数和幂函数欧拉函数和恒等函数卷积的逆元莫比乌斯函数与莫比乌斯反演求法数论分块(整除分块)莫比乌斯反演的经典结......
  • 筛法
    埃氏筛如何求出\(1\simn\)中有几个质数?考虑这样一件事情:对于任意一个大于\(1\)的正整数\(n\),那么它的\(x\)倍就是合数\((x>1)\)。利用这个结论,我们可以避免很多次不必要的检测。如果我们从小到大考虑每个数,然后同时把当前这个数的所有(比自己大的)倍数记为合数,那么运行结束......
  • 基于深度学习的图像分类:使用卷积神经网络实现猫狗分类器
    摘要:深度学习在计算机视觉领域中具有广泛的应用。本文将介绍如何使用卷积神经网络(CNN)实现一个猫狗分类器。我们将使用Python和TensorFlow框架搭建一个简单的卷积神经网络模型,并利用猫狗图像数据集进行训练和测试。通过本文,读者将了解到深度学习在图像分类任务中的基本原理和实践应......
  • 筛法--朴素筛法和埃式筛法和线性筛法
    朴素筛法:#include<iostream>#include<algorithm>usingnamespacestd;constintN=1000010;intprimes[N],cnt;boolst[N];voidget_primes(intn){for(inti=2;i<=n;i++){if(!st[i])//st==0代表的是这个数是质数{......
  • 使用CNN做电影评论的负面检测——本质上感觉和ngram或者LSTM同,因为CNN里图像检测卷积
    代码如下:from__future__importdivision,print_function,absolute_importimporttensorflowastfimporttflearnfromtflearn.layers.coreimportinput_data,dropout,fully_connectedfromtflearn.layers.convimportconv_1d,global_max_poolfromtflearn.layers......
  • 使用CNN做文本分类——将图像2维卷积换成1维
    使用CNN做文本分类from__future__importdivision,print_function,absolute_importimporttensorflowastfimporttflearnfromtflearn.layers.coreimportinput_data,dropout,fully_connectedfromtflearn.layers.convimportconv_1d,global_......
  • 使用神经网络-垃圾邮件检测-LSTM或者CNN(一维卷积)效果都不错【代码有问题,pass】
     fromsklearn.feature_extraction.textimportCountVectorizerimportosfromsklearn.naive_bayesimportGaussianNBfromsklearn.model_selectionimporttrain_test_splitfromsklearnimportmetricsimportmatplotlib.pyplotaspltimportnumpyasnpfromskle......
  • FFT——快速处理卷积
    前置知识卷积符号为\(*\)。设多项式\(A(x)=a_0+a_1x+a_2x^2+\cdots+a_nx^n,B(x)=b_0+b_1x_1+b_2x^2+\cdots+b_nx^n\),则有\[(A*B)[n]=\sum_{i=0}^nA(i)\timesB(n-i)\]即\((A*B)[n]\)的意义是将两个多项式相乘后\(n\)次项的系数。单......
  • 在树莓派上实现numpy的conv2d卷积神经网络做图像分类,加载pytorch的模型参数,推理mnist
    这几天又在玩树莓派,先是搞了个物联网,又在尝试在树莓派上搞一些简单的神经网络,这次搞得是卷积识别mnist手写数字识别训练代码在电脑上,cpu就能训练,很快的:importtorchimporttorch.nnasnnimporttorch.optimasoptimfromtorchvisionimportdatasets,transformsimportn......