50 lines
821 B
Ruby
50 lines
821 B
Ruby
|
require 'prime'
|
||
|
|
||
|
def odd_composites
|
||
|
enum = Enumerator.new do |y|
|
||
|
a = 3
|
||
|
loop do
|
||
|
y << a unless Prime.prime?(a)
|
||
|
a += 2
|
||
|
end
|
||
|
end
|
||
|
enum
|
||
|
end
|
||
|
|
||
|
def squares
|
||
|
enum = Enumerator.new do |y|
|
||
|
n = 1
|
||
|
loop do
|
||
|
y << n ** 2
|
||
|
n += 1
|
||
|
end
|
||
|
end
|
||
|
enum
|
||
|
end
|
||
|
|
||
|
|
||
|
def find_sum(num)
|
||
|
found = false
|
||
|
primes = Prime::EratosthenesGenerator.new
|
||
|
prime = 0
|
||
|
squares_enum = squares
|
||
|
while prime < num
|
||
|
prime = primes.next
|
||
|
squares_enum.rewind
|
||
|
twice_square = squares_enum.next * 2
|
||
|
while twice_square < num
|
||
|
return [prime, twice_square / 2] if twice_square + prime == num
|
||
|
twice_square = squares_enum.next * 2
|
||
|
end
|
||
|
end
|
||
|
found
|
||
|
end
|
||
|
|
||
|
def property?(num)
|
||
|
find_sum(num)
|
||
|
end
|
||
|
|
||
|
def find_incorrect_up_to(n)
|
||
|
odd_composites.take_while { |x| x < n }.reject{ |x| property?(x) }
|
||
|
end
|