Skip to content

Instantly share code, notes, and snippets.

@neilvcarvalho
Last active April 25, 2020 22:30
Show Gist options
  • Save neilvcarvalho/2c87e09ac1c4a9de72ac236485bbb209 to your computer and use it in GitHub Desktop.
Save neilvcarvalho/2c87e09ac1c4a9de72ac236485bbb209 to your computer and use it in GitHub Desktop.
require 'benchmark'
require 'prime'
limite = 1000000
Benchmark.bm(7) do |x|
# x.report("Mais simples") do
# primos = [2]
# (3..limite).each do |dividendo|
# divisores = 0
# (2..(dividendo-1)).each do |divisor|
# if dividendo % divisor == 0
# divisores += 1
# break
# end
# end
# if divisores == 0
# primos << dividendo
# end
# end
# puts " - #{primos.size} números encontrados"
# end
# x.report("Simples metade") do
# primos = [2]
# (3..limite).each do |dividendo|
# divisores = 0
# (2..(dividendo/2).floor).each do |divisor|
# if dividendo % divisor == 0
# divisores += 1
# end
# end
# if divisores == 0
# primos << dividendo
# end
# end
# puts " - #{primos.size} números encontrados"
# end
# x.report("Div primos") do
# primos = [2]
# (3..limite).each do |dividendo|
# divisores = 0
# primos.each do |divisor|
# if dividendo % divisor == 0
# divisores += 1
# end
# end
# if divisores == 0
# primos << dividendo
# end
# end
# puts " - #{primos.size} números encontrados"
# end
# x.report("Div primos break") do
# primos = [2]
# (3..limite).each do |dividendo|
# divisores = 0
# primos.each do |divisor|
# if dividendo % divisor == 0
# divisores += 1
# break
# end
# end
# if divisores == 0
# primos << dividendo
# end
# end
# puts " - #{primos.size} números encontrados"
# end
# x.report("Simples sqrt") do
# primos = [2]
# (3..limite).each do |dividendo|
# divisores = 0
# (2..Math.sqrt(dividendo).floor).each do |divisor|
# if dividendo % divisor == 0
# divisores += 1
# end
# end
# if divisores == 0
# primos << dividendo
# end
# end
# puts " - #{primos.size} números encontrados"
# end
x.report("Sqrt break") do
primos = [2]
(3..limite).each do |dividendo|
divisores = 0
(2..Math.sqrt(dividendo).floor).each do |divisor|
if dividendo % divisor == 0
divisores += 1
break
end
end
if divisores == 0
primos << dividendo
end
end
puts " - #{primos.size} números encontrados"
end
x.report("Sqrt find") do
primos = [2]
(3..limite).each do |dividendo|
divisores = 0
primeiro_divisivel = (2..Math.sqrt(dividendo).floor).find { |divisor| dividendo % divisor == 0 }
if primeiro_divisivel.nil?
primos << dividendo
end
end
puts " - #{primos.size} números encontrados"
end
x.report("Sqrt break pula pares") do
primos = [2]
dividendo = 3
while dividendo < limite
divisores = 0
(2..Math.sqrt(dividendo).floor).each do |divisor|
if dividendo % divisor == 0
divisores += 1
break
end
end
if divisores == 0
primos << dividendo
end
dividendo += 2
end
puts " - #{primos.size} números encontrados"
end
x.report("Crivo de Eratóstenes") do
# Create an array from 0..max
# Starting at 2, delete every multiple of 2 from the array.
# Then, go back to the beginning, and delete every multiple of 3.
# Repeat this starting from the next available number at the beginning of the array.
# Do this until the square of number you are checking is greater than your max number.
# Finally, compact the original array.
lista = (2..limite).to_a
raiz_quadrada = Math.sqrt(limite).floor
numero_checado = 2
while numero_checado <= raiz_quadrada
lista.reject! { |n| n != numero_checado && n % numero_checado == 0 }
numero_checado = lista.find { |n| n > numero_checado }
end
puts " - #{lista.size} números encontrados"
end
x.report("Crivo implementado no Ruby") do
primos = Prime::EratosthenesGenerator.new.take_while { |n| n <= limite }
puts " - #{primos.size} números encontrados"
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment