Sieve of Eratosthenes - Try 2 - Objectize
5
esumerfd
Generate prime numbers blow some limit using the Sieve of Eratosthenes algorithm. This snippet uses some object abstractions to simplify the algorithm.
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
}
}
...
/*
* 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
}
}
...






There are currently no comments for this snippet.