埃拉托色尼真筛——用于生成素数的算法

2024-04-15

今天读到一篇论文:

奥尼尔,梅丽莎·E.,“正版 埃拉托斯特尼筛法”, http://www.cs.hmc.edu/~oneill/papers/Sieve-JFP.pdf杂志 函数式编程,已出版 剑桥大学出版社在线 2008 年 10 月 9 日 doi:10.1017/S0956796808007004。

它描述了一种使用优先级队列生成素数的算法:

sieve [] = []
sieve (x:xs) = x : sieve' xs (insertprime x xs PQ.empty)
    where
        insertprime p xs table = PQ.insert (p*p) (map (* p) xs) table
        sieve' [] table = []
        sieve' (x:xs) table
            | nextComposite <= x = sieve' xs (adjust table)
            | otherwise = x : sieve' xs (insertprime x xs table)
            where
                nextComposite = PQ.minKey table
                adjust table
                    | n <= x = adjust (PQ.deleteMinAndInsert n' ns table)
                    | otherwise = table
                    where
                        (n, n':ns) = PQ.minKeyValue table

primes = sieve [2 .. ]

该算法乍一看似乎是正确的,但我不明白一件事:

它使用的 PQ 如何处理重复的最小优先级?

我手工做了一些模拟,发现可能会导致错误。

如果有人能解释一下,我将不胜感激您的帮助!


论文中这样描述了正在使用的优先级队列:

鉴于这些需求,优先级队列 是一个有吸引力的选择,特别是因为该数据结构本身支持多个 具有相同优先级的项目(按任意顺序出队)。

由于重复条目在算法中并不是真正有用,因此必须对其进行特殊处理。

The adjust删除最小组合的函数不断调整优先级队列,直到可以确定最小元素的所有重复项都被删除:

adjust table
    | n <= x = adjust (PQ.deleteMinAndInsert n_ ns table)
    | otherwise = table
    where ...

如果当前第一个元素(n) 小到足以被删除,调整再次调用自身以检查剩余队列中的下一个元素。只有当没有剩余小元素时,它才会停止递归。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

埃拉托色尼真筛——用于生成素数的算法 的相关文章

  • 分而治之策略来确定列表中是否有超过 1/3 的相同元素

    我正在使用分治算法来确定列表中是否有超过 1 3 的元素相同 例如 1 2 3 4 不 所有元素都是唯一的 1 1 2 4 5 是的 其中 2 个是相同的 没有排序 是否有分而治之的策略 我陷入了如何划分的困境 def is valid i
  • 带路径压缩算法的加权 Quick-Union

    有一种 带路径压缩的加权快速联合 算法 代码 public class WeightedQU private int id private int iz public WeightedQU int N id new int N iz new
  • Haskell 入门

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 几天来 我一直试图理解 Haskell 中的函数式编程范例 我通过阅读教程和观看截屏视频
  • 标准的能力

    我发现了一些使用标准的旧例子here http www serpentine com blog 2009 09 29 criterion a new benchmarking library for haskell 看起来好像早在 2009
  • 有没有更好的方法将 UTC 时间转换为大纪元时间?

    我想将文件的修改时间设置为从 exif 数据获取的时间 为了从 exif 获取时间 我发现 Graphics Exif getTag Exif gt String gt IO Maybe String 要设置文件修改时间 我发现 Syste
  • 子序列和

    给定一个整数数组 例如 1 2 3 1 查找是否存在总和为0并返回它 例如 1 2 3 or 2 3 1 检查每个子序列是O n 2 这效率太低了 有改进的想法吗 创建一个新数组 其中每个元素等于前一个元素加上该元素的总和 Input 1
  • 找到一条穿过任意节点序列的最短路径?

    In 这个先前的问题 https stackoverflow com questions 7314333 find shortest path from vertex u to v passing through a vertex wOP询
  • Haskell:IORef 的性能

    我一直在尝试在 Haskell 中编码一个需要使用大量可变引用的算法 但与纯粹的惰性代码相比 它 也许并不奇怪 非常慢 考虑一个非常简单的例子 module Main where import Data IORef import Contr
  • 如何从迭代器推导连续内存

    不知何故 本土stl copy VC Dinkumware 上的算法表明它可以使用memcpy 可以轻松复制的数据 一个凡人能做到这一点吗 假设每个元素都是普通可复制的 random access iterator 是否意味着连续内存 标准
  • Haskell - lambda 表达式

    我试图了解什么是有用的以及如何在 Haskell 中实际使用 lambda 表达式 我不太明白使用 lambda 表达式相对于定义函数的约定方式有何优势 例如 我通常会执行以下操作 let add x y x y 我可以简单地打电话 add
  • 归并排序中递归树的高度log(n)+1是怎么来的

    我按照 stackoveflow 的建议阅读了一些问题和答案 我正在遵循 cormen 的 算法简介 一书进行自学 那本书里已经解释得很清楚了 但唯一没有解释的是如何在合并排序分析中计算树的高度 如果在后面的章节中对此进行解释的话 我仍然在
  • 我该如何实现这个折叠功能呢?

    给出了两种数据类型 颜色 和 植物 data Color Red Pink White Blue Purple Green Yellow deriving Show Eq data Plant Leaf Blossom Color Stal
  • 在java中使用BUBBLE SORT对二维字符串数组进行排序

    类似的问题已经被问过 但从来没有关于二维字符串数组 因此在尝试了很长时间之后我找不到我想要的 我正在尝试使用 BubbleSort 对 java 中的 2D 字符串数组进行排序 作为输入 我收到一个二维字符串数组 一个表 以及您应该排序的
  • 检查对以下内容的理解:“变量”与“变量” “价值”、“功能”与“抽象”

    这个问题是后续问题this one https stackoverflow com questions 25327705 is function a sort of variable 25329157 25329157在学习 Haskell
  • 有没有时间复杂度为O(N)的排序算法?

    大多数排序算法的复杂度为 O NN 或 O NlogN 来实现结果 但是 对于特定的输入集 有些算法的复杂度为 O N 我想知道是否有一种排序算法在所有情况下都具有 O N 的复杂度 如果您只能比较 检查两个项目是否为 正在排序的值 那么您
  • 需要解释搜索最小大和的算法

    我正在解决 Codility 问题作为练习 但无法回答其中一个问题 我在互联网上找到了答案 但我不明白这个算法是如何工作的 有人可以引导我逐步完成它吗 这是问题 You are given integers K M and a non em
  • Haskell Data.Decimal 作为 Aeson 类型

    是否可以解析一个数据 十进制 https hackage haskell org package Decimal 0 4 2 docs Data Decimal html使用 Aeson 包从 JSON 获取 假设我有以下 JSON foo
  • 动态规划 (DP) 中的重叠子问题是什么?

    为了使动态规划适用 问题必须具有两个关键属性 最优子结构 and 重叠子问题 1 https en wikipedia org wiki Dynamic programming 对于这个问题 我们只关注后一个属性 有各种不同的定义重叠子问题
  • 如何在Haskell中实现词法分析器和解析器

    我在这里得到了这段代码 它是用Haskell结构的命令式编程语言编写的程序 所以问题是 我如何为这种语言实现词法分析器和解析器 该程序被定义为一系列语句有 6 种类型 goto write stop if goto 和 int int n
  • Prim 的迷宫生成算法:获取相邻单元格

    我基于 Prim 算法编写了一个迷宫生成器程序 该算法是 Prim 算法的随机版本 从充满墙壁的网格开始 选择一个单元格 将其标记为迷宫的一部分 将单元格的墙壁添加到墙壁列表中 While there are walls in the li

随机推荐

  • 创建 3 个 IEnumerables 的并集时,实现 O(n) 性能的最简单方法是什么?

    说a b c都是List
  • FirePHP 并不总是写入日志消息

    我在 Bootstrap php 中设置了记录器 如下所示 logger new Zend Log if environment gt debug 1 stream fopen var www html rta rta log a fals
  • 如何在 Windows 上获取 Arduino 草图的汇编语言列表?

    我希望能够看到我的 Arduino 草图的汇编语言列表 我怎样才能实现这个目标 Update 我正在 Windows 机器上运行 Arduino 软件 一种方法是使用avr objdump on the elf构建创建的文件 例如 在 OS
  • socket.io - 服务器多次发出

    我已经研究了近两天 似乎找不到答案 我正在尝试构建一个应用程序 在其中使用套接字通知我的前端服务器上发生了某些变化 注意 我没有在前端使用任何操作 因此这使得这个问题与在此线程上找到的问题不同 例如 socket io 多次发出 https
  • 由注释限制的有界类型参数

    在 Java 中 可以使边界类型参数必须从特定的类或接口扩展 例如 public class Box
  • @Html.ValidationSummary() 在 Ajax.BeginForm 中不起作用

    使用有什么问题吗 Html ValidationSummary 里面一个Ajax BeginForm form 我遇到以下情况 但无法验证必填字段 表单刚刚发布 也没有抛出任何错误 这是视图 using Ajax BeginForm Reg
  • 在 scenebuilder 17 中加载自定义组件

    我们正在开发 Javafx 项目 该项目在 Java8 上运行良好 最近 我们用Java17更新了项目 我们能够解决 IDEA 的问题 好像Java 9 之后他们已经严格封装了所有的类 要使用它 我们必须在虚拟机选项中使用 export o
  • RStudio 的早期命令持续发出警告

    我正在努力为此创建一个可重现的示例 但我怀疑其他人会明白我的意思 为什么 R 有时似乎会陷入积压的警告 错误消息中 并且在后续命令之后再次重复 例如 你会收到一些警告消息Bad whatever system choking运行一些代码后
  • 如何在 Windows 上通过 Vim 使用 MinGW make

    我已经在我的机器上安装了 Vim 和 MinGW 所以我尝试创建 Hello World 然后在 Vim 中编译 一切正常 但是当我输入时 make它显示错误 make not recognized as an internal or ex
  • JQuery 菜单无法正常工作

    我正在尝试 Jquery 菜单小部件 但由于某种原因它不起作用 我在浏览器和 JSFiddle 上都尝试过 http jsfiddle net evanevee MANH4 2 http jsfiddle net evanvee MANH4
  • Java 中间隔重复算法的开源实现 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在从事一个项目 其中间隔重复至关重要 但我不是该主题的专家 我害怕重新发明方轮 我的研究指出了两个不
  • 用于 Java 集成测试的 Groovy 是否有更好的替代方案? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我计划使用其编程接口来测试我的基于 Java 的 Web 应用程序 为此 我打算使用它们的 RMI We
  • WEB-INF 在 Java EE Web 应用程序中代表什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 互联网上的大多数地方都说它代表WEB INF信息 我比较怀疑 该文件夹包含可执行文件 信息不是一个合适的名字 据我所知 正如你所说 INF 代表
  • 如何从 GTK Builder 检索对象的名称? [复制]

    这个问题在这里已经有答案了 如何获取从 Builder 对象检索的 Gtk Widget 的名称 我特指的是在 Glade 中看到的名字 例如 button1 而不是类的名称 GtkWindow 这个问题与this one https st
  • 基准和处理时间结果的差异

    我一直在尝试对替换数据框中的 NA 的最有效方法进行一些测试 我首先在 100 万行 12 列的数据集上比较 NA 与 0 的替换解决方案 把所有有管道能力的都扔进去microbenchmark我得到以下结果 问题一 有没有办法测试子集左赋
  • Oracle查询将多列转换为一列

    我的表中有 50 列 它只返回一行 我希望 50 列的一行显示为 50 行和 1 列 任何人都可以建议我使用 Oracle 查询吗 您可以使用UNPIVOT对于像这样的一行 仅获取包含值的列 SELECT colvalue FROM SEL
  • 在单独的 cpp 文件中进行 Boost 单元测试

    我想将 Boost 单元测试分成单独的 cpp 文件 例如 Test1 cpp Test2 cpp Test3 cpp 等 这样我就不会在单个 cpp 文件中包含 1000 个测试 到目前为止 当我尝试构建时 我遇到了各种错误 测试1 cp
  • 节或组名称“oracle.manageddataaccess.client”已定义

    将 Oracle ManagedDataAccess dll 从版本 4 121 1 0 更新到版本 4 121 2 0 后 由于我无法使用 NHibernate 保存先前版本中 CLOB 类型的值 因此在客户端计算机上出现以下错误 Sys
  • 使用马哈拉诺比斯距离进行多变量离群值去除

    我的数据有异常值 我怎样才能找到马哈拉诺比斯距离 并用它来删除异常值 首先让我提出一些一般准则 实际上 如果你有很多特征和较少的样本 马哈拉诺比斯算法往往会给出误导性的结果 你可以自己尝试一下 所以你拥有的特征越多 你应该提供的样本就越多
  • 埃拉托色尼真筛——用于生成素数的算法

    今天读到一篇论文 奥尼尔 梅丽莎 E 正版 埃拉托斯特尼筛法 http www cs hmc edu oneill papers Sieve JFP pdf杂志 函数式编程 已出版 剑桥大学出版社在线 2008 年 10 月 9 日 doi