#wrong approach, should just do recursive trial division... def eratosthenes_sieve(n) sieve = Array.new(n + 1, true) sieve[0] = false sieve[1] = false 2.step(to: Math.sqrt(n)) do |i| if sieve[i] (i * i).step(to: n, by: i) do |j| sieve[j] = false end end end result = sieve.map_with_index { |b, i| b ? i : nil }.compact end def prime_factors(n) nums = eratosthenes_sieve(n).select { |i| n % i == 0 } nums = nums + nums.map { |i| n / i } end puts eratosthenes_sieve(600851475143) puts prime_factors(600851475143).max