这个Groovy代码实际上做了什么?

时间:2011-06-18 11:42:42

标签: groovy

在关注此链接后prime number in Groovy我看到了以下代码(在评论中):

​def t = (0..10000).flatten()
t[0]=0; t[1]=0; // 0 and 1 are not prime
def L = Math.sqrt(t.size()-1)
( [2,(3..L).step(2)].flatten()).each { n ->
  if(t[n]) {
    def delta = n==2?1:2;
    (((n*n)..(t.size())).step(n*delta)).each {
      i -> t[i] = 0
    }
  }
}
println t.findAll({ it != 0 })

这段代码的特别之处在于它更快。我运行这个片段来找到10亿的素数,它可以在不到一分钟的时间内完成工作。但同时也无法弄清楚这是如何运作的。谁能说我这是怎么回事?

2 个答案:

答案 0 :(得分:4)

这是Sieve of Eratosthenes

它做的是重复遍历所有数字的数组,最多1000个,将每个先前找到的素数的所有倍数标记为非素数(通过将数组条目设置为0表示),然后过滤掉所有归零的条目

答案 1 :(得分:0)

筛子(epynomously)占据了一大块,并从谷壳中漂浮出来

大脑破坏了这种算法(我甚至无法验证它是否准确!)

数学

  1. 任何可以被x除以y的数字,x和y中的一个必须是< =比根。 因此你只需要筛选根,因为其他除数已经被覆盖

  2. 所有非素数必须是x素数的乘积(如果它的任何除数不是素数,它将具有非1和非自身除数)*你不需要筛选非素数的倍数

  3. 语法上,我更喜欢只声明x = [],然后如果它是out则分配1,如果它是素数则保留为null。加上我喜欢使用'it',多个声明也会很好,而且更多惯用的inject()和

  4. 我今晚不会写任何代码,所以......我很乐意看到 Groovy在Ruby上获得了一些基础,所以我们的代码真的需要简洁而富有表现力,并且不应该有太多的溢出器询问一个很好的Groovy代码是什么