package simulation.
sieve.
try2;
/*
* Objectize the algorithm.
*/
class Sieve2
{
def eratosthenes
(a_limit
)
{
def primes =
[]
sieve
(a_limit
) { primeNumber ->
primes
<< primeNumber
}
primes
}
def sieve
(a_limit, a_foundPrime
)
{
def numbers = Numbers.
newInstance(a_limit
)
(2..
a_limit).
each { factor ->
numbers.
each(factor
) { number ->
if (number.
hasPrimeFactor(factor
))
{
number.
isNotPrime()
}
}
if (numbers.
contains(factor
))
{
a_foundPrime
(factor
)
}
}
}
}
class Numbers
{
def numbers =
[]
Numbers
(a_limit
)
{
a_limit.
times { number ->
numbers
<< Number.
newInstance(number
)
}
}
def contains(a_number
)
{
def contains =
false
for (number
in numbers
)
{
if (number.
number == a_number
)
{
contains =
true
break
}
}
contains
}
def each(a_factor, a_closure
)
{
numbers.
each { number ->
if (number.
number > a_factor && number.
mayBePrime())
{
a_closure
(number
)
}
}
}
def String toString
()
{
numbers.
toString()
}
}
class Number
{
def number
Number(a_number
)
{
number = a_number
}
def isNotPrime
()
{
number =
0
}
def mayBePrime
()
{
number !=
0
}
def hasPrimeFactor
(a_factor
)
{
number != a_factor && number % a_factor ==
0
}
def String toString
()
{
number
}
}
...