问题描述
|
在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亿的质数,并且在不到一分钟的时间内完成了工作。但是同时无法弄清楚它是如何工作的。谁能说我这是如何工作的?
解决方法
这是Eratosthenes的筛子。
它的作用是反复遍历一个由最多1000个数字组成的数组,将每个先前找到的质数的所有倍数标记为非质数(通过将数组项设置为0表示),然后过滤掉所有归零的项。
, 筛子(大体上)取了一大块并浮出谷壳
大脑破坏了这种算法(我什至无法验证它是否准确!)
数学上
任何可以被x划分为y的数字,x和y之一必须小于根。
因此您只需要筛除根,因为另一个除数已经被覆盖
所有非质数必须是x个质数的乘积(如果其除数中的任何一个都不是质数,则将具有非1且非自身的除数)*您不需要筛除非质数的倍数素数
语法上,我更喜欢只声明x = [],然后分配1,如果它不存在,则将其保留为null,如果它是素数。再加上我喜欢使用\'it \',也可以使用多个声明,并且更多地习惯使用inject()等
我今晚不写任何代码,所以...我很想看看
Groovy在Ruby上获得了一些基础,因此我们的代码确实需要简洁而又富有表现力,并且不应有太多的溢出者来询问一块好看的groovy代码做什么