31 lines
781 B
Ruby
31 lines
781 B
Ruby
require "prime"
|
|
|
|
class Integer
|
|
|
|
def proper_divisors(prim_div = prime_division)
|
|
return [] if self == 1
|
|
primes = prim_div.flat_map{|prime, freq| [prime] * freq}
|
|
(1...primes.size).each_with_object([1]) do |n, res|
|
|
primes.combination(n).map{|combi| res << combi.inject(:*)}
|
|
end.flatten.uniq
|
|
end
|
|
|
|
def duffinian?
|
|
pd = prime_division
|
|
return false if pd.sum(&:last) < 2
|
|
gcd(proper_divisors(pd).sum + self) == 1
|
|
end
|
|
|
|
end
|
|
|
|
n = 50
|
|
puts "The first #{n} Duffinian numbers:"
|
|
(1..).lazy.select(&:duffinian?).first(n).each_slice(10) do |slice|
|
|
puts "%4d" * slice.size % slice
|
|
end
|
|
|
|
puts "\nThe first #{n} Duffinian triplets:"
|
|
(1..).each_cons(3).lazy.select{|slice| slice.all?(&:duffinian?)}.first(n).each do |group|
|
|
puts "%8d" * group.size % group
|
|
end
|