Skip to content

Instantly share code, notes, and snippets.

@jmromer
Last active December 26, 2015 19:39
Show Gist options
  • Save jmromer/7202472 to your computer and use it in GitHub Desktop.
Save jmromer/7202472 to your computer and use it in GitHub Desktop.
class Integer
def is_prime?
return false if self < 2
(2..Math::sqrt(self)).each do |i|
return false if self % i == 0
end
return true
end
end
require 'benchmark'
class Integer
def is_prime_v0?
return false if self < 2
(2...self).each { |i| return false if self % i == 0 }
return true
end
def is_prime_v1?
return false if self < 2
(2..Math::sqrt(self)).each { |i| return false if self % i == 0 }
return true
end
def is_prime_v2?
return false if self < 2
i = 2
while i*i <= self do
return false if self % i == 0
i += 1
end
return true
end
def is_prime_v3?
return true if self == 2
return false if (self < 2) || (self % 2 == 0)
i = 3
while i*i <= self do
return false if self % i == 0
i += 2
end
return true
end
end
trial_num = 1
[10, 25, 50, 75, 100, 500, 1000, 20000].each do |n|
puts "\n\nTrial #{trial_num} (n = #{n}) :\n"
Benchmark.bmbm do |x|
x.report("v0: all to n:") { for i in 1..n; i.is_prime_v0?; end }
x.report("v1: all to sqrt-n:") { for i in 1..n; i.is_prime_v1?; end }
x.report("v2: all to n by n^2:") { for i in 1..n; i.is_prime_v2?; end }
x.report("v3: by n^2, skipping:") { for i in 1..n; i.is_prime_v3?; end }
end
trial_num += 1
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment