Skip to content

Instantly share code, notes, and snippets.

@dzhlobo
Created June 23, 2015 11:58
Show Gist options
  • Save dzhlobo/af32838349ba78a1e311 to your computer and use it in GitHub Desktop.
Save dzhlobo/af32838349ba78a1e311 to your computer and use it in GitHub Desktop.
Prime numbers
class PrimeNumbers
include Enumerable
def self.prime_numbers_below(edge)
new(max_number: edge)
end
def initialize(max_number:)
@max_number = max_number
end
def each(&block)
prime_numbers.each(&block)
end
private
attr_accessor :max_number
def prime_numbers
@_prime_number = sieve.map.with_index do |value, index|
index if value
end.select { |number| number }
end
def sieve
@_sieve ||= ::Sieve.new(size: max_number)
end
end
class Sieve < Array
def initialize(size:)
super(size) do |index|
if index == 0 || index == 1 || (index > 2 && index.even?)
false
else
true
end
end
sift
freeze
end
private
def sift
current_index = 3
while (current_index < size)
unless self[current_index]
current_index += 1
next
end
non_prime_index = current_index * current_index
while non_prime_index < size
self[non_prime_index] = false
non_prime_index += current_index * 2
end
current_index += 1
end
end
end
require 'minitest/autorun'
class TestPrimeNumbers < MiniTest::Unit::TestCase
def test_prime_numbers_below_10
assert_equal(PrimeNumbers.prime_numbers_below(10).to_a, [2, 3, 5, 7])
end
def test_prime_numbers_below_100
assert_equal(PrimeNumbers.prime_numbers_below(100).to_a,
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97])
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment