Zumkeller numbers

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(' '))

Output:

Last updated

Was this helpful?