Skip to content

Instantly share code, notes, and snippets.

@davidstosik
Last active August 22, 2019 01:54
Show Gist options
  • Save davidstosik/694d6320de3f81cae491489fb6e5de73 to your computer and use it in GitHub Desktop.
Save davidstosik/694d6320de3f81cae491489fb6e5de73 to your computer and use it in GitHub Desktop.
class NewNewPrimesRetrievalService
def self.process(max)
new(max).process
end
def initialize(max)
@max = max
end
def process
(2..max).each do |number|
primes_so_far << number if prime?(number)
end
primes_so_far
end
private
attr_reader :max
def prime?(number)
primes_so_far.none? do |prime|
number % prime == 0
end
end
def primes_so_far
@_primes_so_far ||= []
end
end
class NewPrimesRetrievalService
def self.process(max)
(2..max).each_with_object([]) do |number, primes|
if primes.all? { |divisor| number % divisor != 0 }
primes << number
end
end
end
end
class PrimesRetrievalService
def self.process(options)
n = options['number']
# 1 is NOT a prime number!
#all_numbers = [*1..n]
all_numbers = [*2..n]
primes = []
all_numbers.each do |number|
solutions = []
divisors = [*2..(number-1)]
divisors.each do |divisor|
solution = (number.to_f/divisor.to_f)
solution = 1 if solution - solution.to_i == 0
solutions << solution
end
if solutions.all? {|i| i.is_a?(Float)} == true
primes << number
end
end
primes
end
end
require "minitest/autorun"
require "benchmark"
require "prime"
require_relative "./primes_retrieval_service.rb"
require_relative "./new_primes_retrieval_service.rb"
require_relative "./new_new_primes_retrieval_service.rb"
module TestHelper
PRIMES_SAMPLE = Prime.first(10)
def primes_sample_before(n)
PRIMES_SAMPLE.select do |prime|
prime <= n
end
end
def test_primes_before_0
test_primes_before(0)
end
def test_primes_before_1
test_primes_before(1)
end
def test_primes_before_10
test_primes_before(10)
end
def test_primes_before_30
test_primes_before(30)
end
private
def test_primes_before(n)
assert_equal primes_sample_before(n), get_primes_before(n)
end
end
class TestPrimesRetrieval < Minitest::Test
include TestHelper
private
def get_primes_before(n)
PrimesRetrievalService.process("number" => n)
end
end
class TestNewPrimesRetrieval < Minitest::Test
include TestHelper
private
def get_primes_before(n)
NewPrimesRetrievalService.process(n)
end
end
class TestNewNewPrimesRetrieval < Minitest::Test
include TestHelper
private
def get_primes_before(n)
NewNewPrimesRetrievalService.process(n)
end
end
class TestBenchmark < Minitest::Test
def test_benchmark
Benchmark.bm(20) do |x|
max = 10000
x.report("Original retriever: ") do
PrimesRetrievalService.process("number" => max)
end
x.report("New retriever: ") do
NewPrimesRetrievalService.process(max)
end
x.report("New New retriever: ") do
NewNewPrimesRetrievalService.process(max)
end
x.report("Trial division: ") do
Prime::TrialDivisionGenerator.new.each do |prime|
break if prime >= max
end
end
x.report("Eratosthenes' sieve: ") do
Prime::EratosthenesGenerator.new.each do |prime|
break if prime >= max
end
end
end
end
end
$ ruby -I:lib/test primes_test.rb
Run options: --seed 20111
# Running:
user system total real
Original retriever: 8.261264 0.458415 8.719679 ( 8.806964)
New retriever: 0.046797 0.001929 0.048726 ( 0.049026)
New New retriever: 0.045379 0.000119 0.045498 ( 0.045645)
Trial division: 0.004188 0.000009 0.004197 ( 0.004240)
Eratosthenes' sieve: 0.000579 0.000008 0.000587 ( 0.000587)
.............
Finished in 8.909285s, 1.4592 runs/s, 1.3469 assertions/s.
13 runs, 12 assertions, 0 failures, 0 errors, 0 skips
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment