优化计算 200 万以下所有素数总和的 Haskell 代码

2024-06-25

欧拉计划中的问题 10。我在那里看到了一些讨论,但仅限于 C。

我用下面的代码来计算:

print . sum . sieve $ [2..2000000] where
    sieve [] = []
    sieve (x:xs) = x : sieve (filter ((/= 0) . (`mod` x)) xs)

需要很多年的时间来计算。我想知道是否有更有效的计算方法?


在 haskell 中描述了许多非常快速的计算素数的方法haskellwiki 素数页面 http://www.haskell.org/haskellwiki/Prime_numbers。具体来说,第二个似乎足够好,所以你可以这样写:

main = print . sum . takeWhile (< 2000000) $ primes 

primes = 2: 3: sieve (tail primes) [5,7..] 

sieve (p:ps) xs = h ++ sieve ps [x | x <- t, rem x p /= 0]  
  where (h,~(_:t)) = span (< p*p) xs 

运行它我们得到:

ghc --make -O2 Euler10.hs
time ./SOAns
142913828922

real    0m1.598s
user    0m1.577s
sys 0m0.017s

wiki 描述了为什么你的解决方案这么慢,主要原因是为每个数字设置了一个筛子,最多 2000000,而每个素数一个就足够了。

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

优化计算 200 万以下所有素数总和的 Haskell 代码 的相关文章

  • 获取 N 的素数列表

    我正在尝试编写一个函数 它接受一个 Int 并返回直到并包括该 Int 的所有素数 例如 8 的素数列表 List 3 5 7 这是我到目前为止所拥有的 def isPrime i Int Boolean if i lt 1 false e
  • 访问三个静态数组比访问一个包含 3 倍数据的静态数组更快?

    我有 700 个项目 我循环遍历这 700 个项目 为每个项目获取项目的三个属性并执行一些基本计算 我使用两种技术实现了这一点 1 三个 700 元素的数组 三个属性各一个数组 所以 item0 a array1 0 item0 b arr
  • 如何从有向无环图导出FRP?

    我目前正在研究我的下一个项目 目前处于预规划阶段 因此这个问题只是为了了解现有技术的概述 Setup 我有一个具有多个输入和输出的有向无环图 DAG 现在考虑人工神经网络 处理这种结构的常见方法是在每个 时间 步骤上处理整个网络 我相信这是
  • 对参数进行排序以利用柯里化

    我最近两次重构代码以更改参数的顺序 因为代码太多 黑客喜欢flip or x gt foo bar x 42正在发生 在设计函数签名时 哪些原则可以帮助我充分利用柯里化 对于轻松支持柯里化和部分应用的语言 有一系列令人信服的论点 最初来自
  • 埃拉托色尼筛法的 Java 实现可以超过 n = 2^32?

    目前我有这个质数生成器 其限制为 n Sieve public class Main public static void main String args long N 2000000000 initially assume all in
  • 如何强制 Theano 在 GPU 上并行化操作(测试用例:numpy.bincount)

    我正在寻找使用 GPU 加速 bincount 计算的可能性 参考numpy中的代码 x new numpy random randint 0 1000 1000000 timeit numpy bincount x new 100 loo
  • 使用具有来自平面数字数组的最大和的子数组填充数组

    我需要填充一个数组 其中可能包含不确定数量的子数组 托盘 每个子数组的最大尺寸为 265 厘米 我有一个整数 包 的平面数组 需要在托盘中进行最佳排列 例如 50 厘米 45 厘米 30 厘米 如何动态创建一个系统来创建代表具有最佳空间优化
  • 记录语法和求和类型

    我有关于 Haskell 中的总和类型的问题 我想创建一个由两个或多个其他类型组成的总和类型 并且每个类型可能包含多个字段 一个简单的例子是这样的 data T3 T1 a Int b Float T2 x Char deriving Sh
  • 不明确的类型变量

    相关我之前关于遍历数据结构的问题 https stackoverflow com questions 1855371 avoiding boilerplate when dealing with many unrelated types 当
  • 我怎样才能优化这个vba循环代码?

    嗨 我写了这段代码 但这段代码非常慢 我该如何优化这段代码 Private Sub printItem r lastCol objStream FirstCol 1 Dim strFirst As String strFirst CStr
  • 自动函子实例

    给定以下代数类型 ghci gt data Foo a Foo a 然后我实例化其中之一 ghci gt let f Foo foo 最后 我想打电话给fmap将函数应用为 a gt b gt Foo a gt Foo b ghci gt
  • Haskell 中的 Monad 和 Purity

    我的问题是 Haskell 中的 monad 是否真正保持了 Haskell 的纯度 如果是的话 又是如何保持的 我经常读到副作用是如何不纯粹的 但有用的程序 例如 I O 需要副作用 下一句指出 Haskell 对此的解决方案是 mona
  • Java 中更高级的泛型

    假设我有以下课程 public class FixExpr Expr
  • 优化 SQL Server 中的排名索引

    我们有一个宽表 目前正在尝试优化 该表有 50 列 统计数据 我们最终希望按降序排列 目前有超过 500 万行 我们正在寻找在降低复杂性和提高读取速度方面优化该表的方法 写入速度对我们来说也很重要 但读取更关键 这些统计数据的排名应尽可能接
  • Haskell 类型族中的类型歧义

    我正在尝试整理以下课程Domain及其实例TrivialDomain LANGUAGE TypeFamilies data Transition Transition class Domain d where type Set d type
  • 用于 GNU C++ 的 SSE SSE2 和 SSE3 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一个简单的教程可以帮助我快速掌握 GNU C 中的 SSE SSE2 和 SSE3 如何在SSE中
  • 如何构图“也许”镜头?

    如果我有嵌套记录的镜头 其中每个镜头返回一个Maybe 我怎样才能让它们组合起来 这样如果 遍历 中有任何东西返回一个Nothing最终结果是Nothing data Client Client clientProperties Maybe
  • 如何向http-client-tls提供客户端证书?

    我在用http 客户端 tls http hackage haskell org package http client tls 0 2 1 2连接到需要客户端证书的启用 TLS 的服务器 我怀疑我需要调整TLS设置 http hackag
  • Haskell:打印文本编码

    Haskell 新手在这里 ghc version The Glorious Glasgow Haskell Compilation System version 6 12 1 在尝试调试第三方 Haskell 程序中与区域设置相关的奇怪错
  • 如何定义类别实例的相等性?

    为了证明例如类别法则对于某种数据类型的某些操作 如何决定如何定义相等性 考虑使用以下类型来表示布尔表达式 data Exp ETrue EFalse EAnd Exp Exp deriving Eq 试图证明这一点是否可行Exp形成一个具有

随机推荐