min_25筛(知识总结)

本文深入解析了min_25筛算法,这是一种由日本算竞选手min_25发明的,基于埃筛思想的亚线性筛算法,用于求解积性函数的前缀和。文章详细阐述了算法原理,包括质数部分、质数+合数部分的求解过程,并介绍了算法与埃筛的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路来源

https://www.cnblogs.com/cjyyb/p/9185093.html

https://www.cnblogs.com/zhoushuyu/p/9187319.html

https://www.mina.moe/archives/12287

心得

这个从去年上个月就想学的知识,终于在开学前被学会了

神仙min_25 QAQ 神仙zzt QAQ 神仙yyb QAQ

学会min_25筛比较难,但大概写一份能让初学者看懂的博客更难

然而学会之后,发现这个东西很模板,好像抄个板子改改就能过题

知识点

min_25筛,日本算竞选手min_25发明的,

一种埃筛思想的,求积性函数F(x)前缀和的,亚线性筛,

复杂度O(\frac{n^{3/4}}{log(n)}),不会证,

后来被他优化成O(n^{\frac{2}{3}})的了,但常数比较大,所以用前面这个就行

目的

\sum_{i=1}^nF(i)

F(x)需要满足条件:

1.积性函数,若ab互质,则F(ab)=F(a)*F(b)

2.F(p)是个可以用多项式表示的值

3.F(p^k)可以快速计算

为了求这个式子,根据1、质数、合数把这个式子拆成三部分

质数部分

先求质数的部分,即\sum_{i=1}^n[i\in Prime]F(i),这里不妨令F(x)=x^k

P是质数集合,P_{i}表示第i个质数。

为了求质数部分,引入g(n,j)=\sum_{i=1}^ni^k[i\in P\ or \ min(p)>P_j,p|i,p\in P\ ]

g(n,j)表示1n中,满足i是质数,或最小素因子大于第j个质数的,F(i)的和

考虑g(n,j)如何求,dp思想,最后一次决策,是加入最小素因子等于第j个质数的贡献,

所以g(n,j),是要从g(n,j-1)里,删去最小素因子等于第j个质数的贡献

 

由于满足最小素因子是P_{j}的最小的数是P_{j}^{2}

①若P_{j}^{2}>n,说明什么都没有删去,有g(n,j)=g(n,j-1)

②否则P_{j}^{2}\leq n,此时要删去最小素因子等于第j个质数的贡献,记这样的数是y=x*P_{j}

那么x的最小质因子也大于等于P_{j},就是大于P_{j-1}

首先,提一个P_{j}出来,其贡献是F(P_{j}),这里是P_{j}^{k}

再乘上x的最小质因子大于P_{j-1}的贡献,即g(\frac{n}{P_{j}},j-1)-g(P_{j-1},j-1)

前一项g(\frac{n}{P_{j}},j-1)多算了[1,\frac{n}{P_{j}}]\leq P_{j-1}的质数的贡献,后一项g(P_{j-1},j-1)则减去这个多余的贡献

整理一下,就是g(n,j)=g(n,j-1)-P_{j}^k[g(\frac{n}{P_{j}},j-1)-g(P_j-1,j-1)]

 

①、②,有

g(n,j)=\left\{\begin{matrix} g(n,j-1)&P_j^2> n\\ g(n,j-1)-P_{j}^k[g(\frac{n}{P_j},j-1)-g(P_j-1,j-1)]&P_j^2\le n \end{matrix}\right.

也即,g(n,j)=\left\{\begin{matrix} g(n,j-1)&P_j^2> n\\ g(n,j-1)-F(P_{j})[g(\frac{n}{P_j},j-1)-g(P_j-1,j-1)]&P_j^2\le n \end{matrix}\right.

 

最终,g(n,|P|)即为所求,其中|P|是小于等于n的质数集合的大小,

毕竟,min(p)>P_{|P|}的数在[1,n]里不存在

和埃筛的关系

个人感觉,就是先把所有数都当做质数,求一个和,

然后不断的用最小质因数P_{j}的出现,把那些最小质因数是P_{j}的合数从这个和中减掉,逼近最终的和,

当所有的合数都被划去时,就是真实的最终的和

 

以下段落截取自yyb大佬的博客,

根据上面的转移,需要的质数只有不大于\sqrt n的,所以只需要筛出这些质数就好了。

我们来思考一下g函数所代表的含义,

我们可以理解为在模拟埃氏筛法的过程,

g(n,j)表示[1,n]排成一列放在这里,但是你已经晒过一些质数了,

你把前j个质数的倍数全部划掉了,剩下的求个F(x)的和就是g函数。

所以转移的过程可以理解为已经筛完了前j-1个质数,现在考虑删除第j个质数的过程。

看到这里一定会感觉上面十分的有道理,但是又有一些疑问。

在上面的计算过程中,始终只考虑了≤\sqrt n的质数,那么,那些>\sqrt n的质数呢?

其实,我们的g函数要计算的本来就只有质数的值,所以,我们的g函数算出来的结果并不是真正的结果。

还记得上面对于这类积性函数有什么要求吗?能够快速的计算F(x),x \epsilon Prime

所以,我们先假设所有的数的计算方法都等同于质数的计算方法,所以我们可以快速的计算前缀和

也就是g(n,0),虽然这个值是假的。但是,如果g中只包含了质数的值的话,那么它的计算结果就是真正的结果。

因此,预处理g的过程,我们理解为一个计算所有质数的值的过程。

质数+合数部分

引入S(n,j)=\sum_{i=1}^nF(i)[min(p)\ge P_j,p\in P,p|i\ ]

即求i满足最小质因数大于等于P_{j}F(i)之和

也有维护大于的,二者转移式有微小差别,这里维护大于等于的

这个和分为两部分,

一部分是大于等于P_{j}的质数,g(n,|P|)-\sum_{i=1}^{j-1}F(P_i)用所有质数的和减去小于P_{j}的那些质数的和

一部分是最小质因数大于等于P_{j}的合数,

考虑先枚举最小质因子P_{k}(k\geq j)

再枚举P_{k}的幂次e,表明P_{k}出现了几次,提一个F(P_{k}^{e})的贡献出来,

剩下的质因数,就需要大于等于P_{k+1}了,这部分是S(\frac{n}{P_{k}^{e}},k+1)

当然,对于这个合数,也可能就这一个质因数,

形如P_{k}^{e}[e\geq 2],所以枚举e\geq 1的时候,再加上F(P_{k}^{e+1})

写成公式的话,是

S(n,j)=g(n,|P|)-\sum_{i=1}^{j-1}f(P_i)+\sum_{k\ge j}\sum_{e}(F(P_k^e)S(\frac{n}{P_k^e},k+1)+F(P_k^{e+1}))

终极目的

第二维正着推求出g,第二维倒着推求出S,答案=质数+合数+F(1),

结合S的定义,答案是S(n,0)+F(1)

细节

比如为了复杂度,实际用到的gS状态没那么多,

g是基于数论分块的,所以只有2*\sqrt n个第二维的状态,

所以要开id1和和id2数组用于离散化这些状态,

记Sqr=sqrt(n),不妨[l,r]这个区间段的n/l值相同,是第j个状态

若n/l<=Sqr,就用n/l记状态,id1[n/l]=j,

否则一定有r<=Sqr,就用r记状态,id2[r]=j,

还有必要写吗,这些不是都可以白嫖主义吗

<think>好的,我现在需要处理用户关于Halcon中select_shape函数的查询。用户希望了解该函数的功能和用法,并需要示例教程。首先,我需要回忆自己对这个函数的了解,并结合提供的引用内容来组织回答。 首先,根据引用1中的函数原型和功能,select_shape_proto(可能用户指的是select_shape)用于根据特征选区域。引用3提到select_shape可以传入多个特征,通过操作符和最小/最大值数组进行复杂选,比如选圆形、无孔洞且面积适中的物体。此外,引用2提到了SelectedShape()通过特定方法获取形状,可能涉及区域选择的后续处理。 我需要确认用户提到的select_shape是否与引用中的select_shape_proto相关,但根据引用3,Halcon确实有select_shape函数,用于区域选。接下来,我需要整理函数参数,例如特征、操作符、最小和最大值,并解释其用法。 用户可能需要具体的参数说明和示例。比如,引用3中的示例展示了如何同时选多个特征,如圆形度、孔洞数量和面积。需要详细说明每个参数的作用,比如Feature参数可以接受哪些特征名称,如'area'、'circularity'等,Operation参数如何决定逻辑组合(如'and'或'or')。 此外,动态计算特征阈值也是关键点,如引用3提到的,可能需要根据实际情况调整Min和Max的范围。应该给出一个具体的示例代码,说明如何调用该函数,并解释每一步的作用,确保用户能理解如何应用在实际项目中。 还需要注意用户可能遇到的常见问题,比如参数顺序错误、特征名称拼写错误或范围设置不合理,导致选结果不符合预期。在注意事项部分应提醒这些点,帮助用户避免常见错误。 最后,根据用户要求生成相关问题,可能涉及其他选函数、性能优化或特征选择策略,这样可以帮助用户扩展知识面。 总结回答结构:功能说明、参数详解、示例教程、注意事项、相关问题。确保使用中文,数学公式正确,引用标记正确添加在相关段落末尾。</think>### `select_shape` 函数使用说明 `select_shape` 是 Halcon 中用于根据几何特征选区域(Region)的核心函数,常用于机器视觉中的目标检测与分类。以下从功能、参数、示例和注意事项详细说明。 --- #### **一、功能概述** 通过设定特征条件(如面积、圆形度、孔洞数量等)从输入区域集合中选符合条件的区域,支持多特征组合选[^3]。例如: - 选面积在 $[100, 500]$ 像素的区域 - 选圆形度高(接近 $1$)且无孔洞的物体 --- #### **二、参数详解** **函数原型**: ```halcon select_shape( Regions, // 输入区域集合 SelectedRegions, // 输出选后的区域集合 Features, // 特征名称列表(如 'area', 'circularity') Operation, // 逻辑操作符('and'/'or') Min, // 特征最小值列表 Max // 特征最大值列表 ) ``` 1. **`Features`** 支持的特征类型(部分常见): - **面积**:`'area'` - **圆形度**:`'circularity'`(范围 $0$ 到 $1$,$1$ 表示完美圆) - **孔洞数量**:`'num_holes'` - **长宽比**:`'ratio'`(宽度/高度) 2. **`Operation`** 决定多个特征的组合逻辑: - `'and'`:所有特征条件同时满足 - `'or'`:任一特征条件满足 3. **`Min` 与 `Max`** 每个特征对应的阈值范围 $[\text{Min}_i, \text{Max}_i]$,动态调整可适应不同场景[^3]。 --- #### **三、示例教程** **目标**:选圆形度高(≥0.9)、无孔洞且面积在 $[500, 2000]$ 像素的区域。 **代码实现**: ```halcon * 读取图像并分割区域 read_image(Image, 'parts.png') threshold(Image, Regions, 128, 255) * 选条件设置 Features := ['circularity', 'num_holes', 'area'] Operation := 'and' MinValues := [0.9, 0, 500] * 圆形度≥0.9,孔洞数=0,面积≥500 MaxValues := [1.0, 0, 2000] * 圆形度≤1.0,孔洞数=0,面积≤2000 * 执行选 select_shape(Regions, SelectedRegions, Features, Operation, MinValues, MaxValues) ``` **效果**:输出区域仅保留符合所有条件的物体。 --- #### **四、注意事项** 1. **特征名称大小写敏感**:需严格匹配 Halcon 文档,如 `'area'` 不能写为 `'Area'`。 2. **范围合理性**:避免设置矛盾范围(如 `Min > Max` 会导致无输出)。 3. **性能优化**:先通过简单特征(如面积)粗,再叠加复杂特征(如圆形度)[^1]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小衣同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值