编程C,C ++,Java,PHP,Ruby,图灵,VB
计算机科学加拿大 
编程C,C ++,Java,PHP,Ruby,图灵,VB  

用户名:   Password: 
 登记登记   
 Haskell示例:埃拉多斯坦的筛子
指数 -> 编程,一般编程 -> 功能规划
查看上一个主题 可打印的版本下载主题订阅本主题私人信息刷新页面 查看下一个主题
作者 信息
WTD.




邮政发布: Sun 4月03日,2005年5:13 PM  帖子主题:Haskell示例:埃拉多斯坦的筛子

维基百科 on the sieve.

代码:
模块筛子在哪里

筛[] = []
筛(x:xs) = x : sieve remaining
  where
    remaining = [y | y < - xs,y` mod` x / = 0]


非常简单地,在没有数字的列表上运行筛子会明确向我们提供结果。

在第二种情况下,我们在数字的列表上运行筛子,其中x是第一个umber,xs表示其他一切,这可能是空列表。

我们通过将x预先完成x来创建一个新列表,以便在剩下的任何内容上运行筛子。

它在我们看到真正的工作的Where条款中。在这里,我们使用列表理解筛选出XS中的XS中的所有数字。列表理解遍历xs,将每个元素绑定到y,如果y不均匀地令x。

您将注意到,筛选算法的第四步没有实现。这有一个非常好的原因。 Haskell是一种懒惰评估的语言。例如,这意味着我可以创建无限长的列表,语言没有问题...直到我试图找到它的结尾。

但是,筛子的第四步会要求我找到列表的结尾。但是,具有无限的清单,发现结束是指无限循环。

但这也是一个优势。它使其非常容易写一些如:

代码:
拿1000美元筛[2 ..]


从筛子中获得了一千个素质。

你可以看看这个,想知道它是如何工作的。当然,我正在计算无限数量的素数,因为我指定了输入列表的终结。

好吧,再次,Haskell懒洋洋地评估,这个功能是递归的。一旦计算出一千次预防,它就会不再有必要的工作并停止。
赞助
赞助
赞助
赞助
WTD.




邮政发布: Sun 4月03日,2005年7:10 PM  帖子主题:(没有主题)

在这里,我们看到一个包含的解决方案

代码:
筛子'n = snd $直到
  (\(input, _) -> input == [])
  (\([email protected](x:xs), output) ->
    if x ^ 2 > last input
      then ([], output ++ input)
      else ([y | y < - xs,y` mod`x / = 0],输出++ [x]))
  ([2..n], [])


这是更复杂的。让我们先看看直到函数。

第一个参数是一个函数,它确定何时何时函数终止。在这种情况下,如果输入列表是空的,则终止。

第二个参数更新输入。在这种情况下,输入(第三个参数)是充满数字的输入列表,以及用于已知主题的输出列表。如果执行筛子的第4个组分。如果最大的主要平方大于输入列表中的最大数字,则输入列表中的所有内容都是素数。

否则,我们将通过输入列表中最大已知的素数删除可分隔的任何可分隔,然后再次移走。



代码:
SND $


仅在元组中获取第二个元素。在这种情况下,输出列表。
WTD.




邮政发布: Sun 4月03日,2005年7:17 PM  帖子主题:(没有主题)

对于略微清洁功能,我们可以使用:

代码:
([] ==) . fst


代替:

代码:
\(input, _) -> input == []


前者只是局部应用和组合物的一个例子,与后者的λ表达。
GordonbGood.




邮政发布: 2016年12月15日星期四上午3:30  帖子主题:Re:Haskell示例:eRatosthenes的筛子 - 基于真实的阵列版本......

到目前为止已发布的是什么**不是** eRatosthenes(SOE)的筛子既不是算法,也不是按照以下文章如此良好解释的表现: http://www.cs.hmc.edu/~oneill/papers/Sieve-JFP.pdf. 基本上,当算法需要使用暗示划分的`mod`功能时,它不是SOE,它仅使用数据结构和重复添加来标记数据结构中的复合数字表示。特纳筛仅是一款非常糟糕的试验筛网,虽然非常简洁。

使用一条保护的可变的可变阵列在Haskell中的真正筛子,其非常迅速为合理的范围:

代码:
{ - #options_ghc -o2 -rtsopts -fllvm# - }

导入data.word.
导入data.bits.
导入data.array.st.st.(runSTUArray)
导入data.array.base.

爱好者:: Word32 -> [Word32]
SOE TOP = 2:[从integral i * 2 + 3 |(i, False) <- assocs bufb] where
 bufb = runstuarray $ do
  let bfLmt = (top - 3) `div` 2
  cmpstsb <- newArray (0, bfLmt) False :: ST s (STUArray s Int Bool)
  let cullp i =
         let p = i + i + 3 in
         let s = (p * p - 3) `div` 2 in
         if s > bfLmt then loop (n - 1) else do
           isCmpst < - Unsaferead cmpstsb i
           如果iSCMPST然后CULLP(i + 1) else -- is Prime
           让Cull J = - 非常紧密的内循环,其中一直都花了
                 if j > bfLmt then cullp (i + 1) else do
                   unsaceewrite cmpstsb j真实
                   cull (j + p)在cull s中的cullp 0



它符合CPU高速缓存大小的限制,为许多现代CPU的256千字节表示两兆比兆位和大约四百万的筛选范围(仅仅是两个是唯一甚至的盛会);之后,对于给定的范围,它将逐渐变慢,因为它开始使用CPU L3缓存(如果有一个),然后是主RAM内存,这相对非常慢。上面的代码将在现代CPU上剔除大约四毫秒的筛分范围的筛选范围,尽管它至少需要长时间才能才能列出所产生的素质,例如:

代码:
main =打印$ longet $ 4000000


对于远高于此的筛分范围,需要页面分段筛。
从上一个显示帖子:   
   指数 -> 编程,一般编程 -> 功能规划
查看上一个主题 告诉一个朋友可打印的版本下载主题订阅本主题私人信息刷新页面 查看下一个主题

11  [ 4 Posts ]
跳到:   


Style:  
搜索: