Last active
April 25, 2020 22:30
-
-
Save neilvcarvalho/2c87e09ac1c4a9de72ac236485bbb209 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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