34 lines
870 B
Text
34 lines
870 B
Text
func is_Zumkeller(n) {
|
|
|
|
return false if n.is_prime
|
|
return false if n.is_square
|
|
|
|
var sigma = n.sigma
|
|
|
|
# n must have an even abundance
|
|
return false if (sigma.is_odd || (sigma < 2*n))
|
|
|
|
# true if n is odd and has an even abundance
|
|
return true if n.is_odd # conjecture
|
|
|
|
var divisors = n.divisors
|
|
|
|
for k in (2 .. divisors.end) {
|
|
divisors.combinations(k, {|*a|
|
|
if (2*a.sum == sigma) {
|
|
return true
|
|
}
|
|
})
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
say "First 220 Zumkeller numbers:"
|
|
say (1..Inf -> lazy.grep(is_Zumkeller).first(220).join(' '))
|
|
|
|
say "\nFirst 40 odd Zumkeller numbers: "
|
|
say (1..Inf `by` 2 -> lazy.grep(is_Zumkeller).first(40).join(' '))
|
|
|
|
say "\nFirst 40 odd Zumkeller numbers not divisible by 5: "
|
|
say (1..Inf `by` 2 -> lazy.grep { _ % 5 != 0 }.grep(is_Zumkeller).first(40).join(' '))
|