有没有快速、实用的素数生成器?

2024-01-21

假设我有一个自然数n我想要一个包含所有素数的列表(或其他)n.

经典的素筛算法运行在O(n log n)时间和O(n)空间——对于命令式语言来说这很好,但需要从根本上对列表和随机访问进行就地修改。

有一个涉及优先级队列的功能版本,非常灵活 - 你可以查看一下here https://www.cs.hmc.edu/~oneill/papers/Sieve-JFP.pdf。这具有更好的空间复杂度,约为O(n / log(n))(渐近更好,但在实际规模上有争议)。不幸的是,时间分析很糟糕,但已经很接近了O(n^2)(其实我觉得是关于O(n log(n) Li(n)), but log(n) Li(n)大约是n).

渐近地讲,实际上最好在生成每个数字时使用连续的试除法来检查它的素数,因为这只需要O(1)空间和O(n^{3/2})时间。有没有更好的办法?

Edit:事实证明我的计算完全错误。文章中的算法是O(n (log n) (log log n)),文章对此进行了解释和证明(并参见下面的答案),而不是我上面提出的复杂混乱。我仍然很高兴看到真正的O(n log log n)纯粹的算法(如果有的话)。


这是 Melissa O'Neill 算法的 Haskell 实现(来自链接的文章)。与 Gassa 链接的实现不同,我最大限度地减少了惰性,因此性能分析很清晰 -O(n log n log log n),即 n log log n 中的线性对数,即命令式埃拉托色尼筛法进行的写入次数。

堆实现只是一个锦标赛树。平衡逻辑是push;通过每次交换子树,我们确保对于每个分支,左子树的大小相同或比右子树大一,这确保了深度 O(log n)。

module Sieve where

type Nat = Int

data Heap = Leaf !Nat !Nat
          | Branch !Nat !Heap !Heap
          deriving Show

top :: Heap -> Nat
top (Leaf n _) = n
top (Branch n _ _) = n

leaf :: Nat -> Heap
leaf p = Leaf (3 * p) p

branch :: Heap -> Heap -> Heap
branch h1 h2 = Branch (min (top h1) (top h2)) h1 h2

pop :: Heap -> Heap
pop (Leaf n p) = Leaf (n + 2 * p) p
pop (Branch _ h1 h2)
  = case compare (top h1) (top h2) of
        LT -> branch (pop h1) h2
        EQ -> branch (pop h1) (pop h2)
        GT -> branch h1 (pop h2)

push :: Nat -> Heap -> Heap
push p h@(Leaf _ _) = branch (leaf p) h
push p (Branch _ h1 h2) = branch (push p h2) h1

primes :: [Nat]
primes
  = let helper n h
          = case compare n (top h) of
                LT -> n : helper (n + 2) (push n h)
                EQ -> helper (n + 2) (pop h)
                GT -> helper n (pop h)
      in 2 : 3 : helper 5 (leaf 3)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有快速、实用的素数生成器? 的相关文章

  • 在编译时生成素数

    我对如何在编译时生成素数数组感兴趣 我相信唯一的方法是使用元编程 在 C 中 不确定这在其他语言中如何工作 快速说明 我不想只是说int primes x 2 3 5 7 11 因为我想在竞争性编程中使用这种方法 其中源文件不能大于10KB
  • 逐字遍历句子

    如何逐字遍历任何给定的句子 java中有内置函数吗 我不知道如何开始 像这样的事情 String sentence Your sentence here String words sentence split s splits by whi
  • Scala 函数定义参数列表中不同的括号样式

    Scala 中以下两个函数定义有什么区别 1 def sum f Int gt Int a Int b Int Int code 2 def sum f Int gt Int a Int b Int Int code SBT 的控制台 RE
  • Python,质数检查器[重复]

    这个问题在这里已经有答案了 你好 我正在创建一个函数来检查一个数字是否是素数 但它告诉我 9 是一个素数 def eprimo num if num lt 2 return False if num 2 return True else f
  • 分解大于 100 位的整数 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 X and Y是大于 100 位的整数 求整数P其在范围 X Y 并且保证了 最佳 素数分解 即具有最多的分解 unique主要原因 我所
  • 最低共同祖先算法

    所以我一直在研究实现最低共同祖先算法 我研究了许多不同的算法 主要是 Trajan 解决方案的变体或 RMQ 的变体 我正在使用非二叉树 我的树经常会在查询之间发生变化 因此预处理不一定值得 树的节点数不应超过 50 75 个 我想知道的是
  • 如何使用networkx删除有向图中的所有相关节点?

    我不确定我的问题的正确术语是什么 所以我只会解释我想做的事情 我有一个有向图 删除节点后我希望所有独立相关的节点也被删除 这是一个例子 假设我删除节点 11 我希望节点 2 也被删除 在我自己的示例中 它们将是 2 以下的节点 现在也必须删
  • 加权图的 BFS 算法 - 寻找最短距离

    我看过很多帖子 即 post1 https stackoverflow com questions 30409493 using bfs for weighted graphs post2 https cs stackexchange co
  • 埃拉托斯特尼筛法是生成 1 到 N 素数的最佳算法吗?

    我在一次采访中被问到这个问题 我使用埃拉托色尼筛子概念和数组实现了一种算法 有没有更好的方法来解决这个问题 对于不知道筛子的人 请点击以下链接 http en wikipedia org wiki Sieve of Eratosthenes
  • 读取4个点的坐标。他们做一个正方形吗?

    我计算点之间的距离 如果距离相等 则点构成一个正方形 否则不 仅当我按以下顺序读取坐标 A x y B x y C x y D x y 或相反时 我的代码才有效 但是如果我这样读 例如 A x y B x y D x y C x y 它将不
  • 递归:n项级数之和

    需要递归函数 系列是 1 2 3 3 4 5 4 5 6 7 递归求 n 的级数之和 我无法想到应该在函数中传递哪些参数 我的方法 我认为我应该传递 n 要相乘的项数 但我无法想到的是我应该如何在同一个函数中 和 以及我的 return 语
  • 如何在大空间尺度上加速A*算法?

    From http ccl northwestern edu netlogo models community Astardemo http ccl northwestern edu netlogo models community Ast
  • RNG 技术的可移植性和可重复性

    我可以使用两种方法之一来创建一个伪随机数序列 该序列具有两个重要特征 1 它可以在不同的机器上重现 2 该序列永远不会重复范围内的数字 直到所有数字都被发出 我的问题是 这两种方法在可移植性 操作系统 Python 版本等 方面是否存在潜在
  • 我可以在 Java 8 中使用 Clojure 函数作为 Lambda 函数吗?

    我在 Clojure 中使用了许多库来生成符合 Clojure lang IFN https github com clojure clojure blob master src jvm clojure lang IFn java 界面 它
  • 模式识别算法

    过去我必须开发一个充当规则评估器的程序 你有一个先行词和一些后续词 动作 所以如果先行词评估为真 则执行的动作 当时我用的是修改版RETE算法 http en wikipedia org wiki Rete algorithm RETE 有
  • 使用 elm 高阶函数处理键盘事件

    我正在尝试创建一个高阶函数来创建仅捕获特定关键代码的函数 该代码的灵感来自 EvanonEnter来自他的 todomvc 实现的函数 仅捕获 Enter 函数 onKeyCode Int gt Msg gt Attribute Msg o
  • 竞争性编码 - 以最低成本清除所有级别:未通过所有测试用例

    当我遇到这个问题时 我正在一个竞争性编码网站上解决问题 问题指出 游戏中有 N 个关卡和 M 种可用武器 等级编号从 0 到 N 1 武器编号从 0 到 M 1 您可以按任意顺序清除这些级别 在每个关卡中 需要这些 M 武器的某些子集才能通
  • Haskell 中的“修复”是什么?为什么“修复错误”会打印无限字符串?为什么“拿 10 美元修复错误”也有同样的作用?

    长话短说 我在看西蒙 佩顿 琼斯的演讲 https www youtube com watch v re96UgMk6GQ 并且当时21 41 https youtu be re96UgMk6GQ t 1301他引用了一句话 我正在解决一个
  • 从数字列表中生成所有唯一对,n 选择 2

    我有一个元素列表 假设是整数 我需要进行所有可能的两对比较 我的方法是 O n 2 我想知道是否有更快的方法 这是我在java中的实现 public class Pair public int x y public Pair int x i
  • 在 Python 中,部分函数应用(柯里化)与显式函数定义

    在 Python 中 以下方式是否被认为是更好的风格 根据更一般的 可能是内部使用的功能显式定义有用的功能 或者 使用偏函数应用来显式描述函数柯里化 我将通过一个人为的例子来解释我的问题 假设编写一个函数 sort by scoring 它

随机推荐

  • 在正百分比变化前面添加 + 号

    我正在从 API 获取数据以显示在我的 iOS 应用程序中 其中一些数据是百分比 因此当它为负数时 它会显示为 0 98 没问题 但为了清楚起见 我希望将正数变化显示为 0 98 而不仅仅是 0 98 这是我更新标签时的代码 func up
  • 如何在表格中汇总多个逻辑回归模型?

    我有一个数据集 其中年龄作为连续因素 性别作为因素和 4 个组 structure list Age c 9 12 16 57 Age 1 structure c 2L 3L 3L 7L Label c 8 1 2 3 4 5 6 7 cl
  • 我应该如何重新配置​​箭头“->”以在完成路径设置后不打印?

    我正在尝试创建一条最佳路径来收集尽可能多的 1 但是在执行代码后 我仍然有一个箭头指向任何内容 因为没有更多的地方可以去了 如何删除代码末尾的箭头 import java util Arrays import java util Scann
  • 如何在 C++ 中使用 BOOST_AUTO 模拟“const auto”?

    使用BOOST AUTO我们可以模拟宏autoC 11 之前不可用的关键字 BOOST AUTO var 1 2 int var 3 auto var 1 2 the same in C 11 有没有什么办法可以模仿const auto c
  • 该视图未返回 HttpResponse 对象。它返回 None 相反

    我有以下简单的看法 为什么会导致这个错误呢 The view auth lifecycle views user profile didn t return an HttpResponse object It returned None i
  • 使用来自 Thales nShield HSM 的 PKCS11interop c# 包装器库导出/导入 RSA 密钥对?

    我已使用 PKCS11Interop 生成密钥 API 在 HSM 中生成了 RSA 公私密钥对 我想导出密钥对 我使用 Findobject API 来获取密钥 该 API 返回一个 ObjectHandle 在使用 GetAttribu
  • Discord.js 如何检查用户是否不接受私信

    我想知道 Discord 机器人是否可以检查该机器人尝试 DM 发送的特定用户是否接受直接消息 现在这是我的代码 exports run client message gt try message author send ok hand c
  • Rvalue ref 和完美转发

    我读过一些关于 的论文 我只是好奇是否有 void fnc 1 int p void fnc int r fnc 1 r am I suppose to should I call it like so fnc 1 std forward
  • solr ReplicationHandler - SnapPull 无法下载文件

    在从主服务器到从服务器的复制过程中 我们不断收到此异常 我们的索引大小是 9 7 G 我们正在尝试从头开始复制一个从站 2013 年 10 月 30 日 18 22 16 996 explicit fetchindex cmd 错误 Rep
  • 使用获取的属性进行核心数据跨存储查询

    背景 我有一个由两个存储组成的核心数据数据库 一个用于我的数据的存储库 一个用于用户数据的存储 通过获取的属性在它们之间链接 假设我有两个实体 它们之间的关系是 0 到 1 卡 0 gt 1 卡状态 1 Card 包含参考数据和一些属性 e
  • 使用 Python 请求对 magiccardmarket 进行 OAuth 身份验证

    我想以编程方式获取特定用户的库存http www cardmarket com http www cardmarket com 但似乎无法让 OAuth 身份验证在以下 Python 代码片段中工作 简单地使用 requests oauth
  • React Native 根据条件显示 View

    在我的渲染方法中 我想显示两个之一View组件取决于我的条件props e g render return
  • 将映射转换为结构

    我正在尝试将映射转换为结构 如下所示 我有一张地图 iex 6 gt user basic auth gt Basic Ym1hOmphYnJhMTc firstname gt foo lastname gt boo 该值应应用于结构 ie
  • UILabel 不会使用 AutoLayout 在 UIScrollView 内自动换行

    我有一个UILabel里面一个UIScrollView我正在尝试自动换行 我想使用 AutoLayout 进行布局配置 这UILabel当单词不在 a 内时 它会完美换行UIScrollView 我只需将行数设置为 0 并将换行模式设置为自
  • 如何禁用 C++ 中的转义序列

    我使用C 处理很多文件 我必须在源代码中编写文件名 如下所示 F somepath subpath myfile 我想知道是否有任何方法可以摆脱键入 来在字符串文字上下文中获取字符 即 我希望我可以写 F somepath subpath
  • 如何在构建过程中强制执行代码样式格式化?

    有没有一种方法 使用 ANT 可以自动重新格式化代码以遵循某些约定 我有几个开发人员正在开发一个程序 并且希望确保在提交之前构建时所有类的代码格式保持一致 进行预提交的最佳方法是在源代码控制服务器上使用预提交挂钩 通过这种方式 您可以强制任
  • 如何使列表视图在中心显示特定项目?

    是否有一种通用方法可以将列表视图的特定项目 例如 1000 个中的第 500 个 放置在其中心 现在我正在使用这段代码 lvData Items iIndex MakeVisible False 它很简单 但有一个缺陷 大多数所需的项目出现
  • 在 Shiny 中选择最近更改的反应式表达式

    我有一个反应式表达式 我想从最近更改的其他两个反应式表达式中获取其值 我做了以下例子 ui r shinyUI bootstrapPage column 4 wellPanel actionButton button Button chec
  • 让一个产品风味成为另一个产品风味的子风味

    我正在我的应用程序中设置产品口味 但遇到了一个问题 我的两种产品口味非常相似 只有一些资源不同 我们将它们称为 FlavorA 和 FlavorB 我想将其设置为 FlavorA 是 Fl avorB 的父级 这样 FlavorB 可以覆盖
  • 有没有快速、实用的素数生成器?

    假设我有一个自然数n我想要一个包含所有素数的列表 或其他 n 经典的素筛算法运行在O n log n 时间和O n 空间 对于命令式语言来说这很好 但需要从根本上对列表和随机访问进行就地修改 有一个涉及优先级队列的功能版本 非常灵活 你可以