#!/usr/bin/ruby

#
## https://rosettacode.org/wiki/Faulhaber%27s_formula
#

func faulhaber_s_formula(p) {

    var formula = gather {
        { |j|
            take "#{binomial(p+1, j) * bern(j,1) -> as_rat}*x^#{p+1 - j}"
        } << 0..p
    }

    var str = Poly(formula.join(' + ')).to_s
    str = "1/#{p+1} * (#{str})"
    return str
}

{ |p|
    printf("%2d: %s\n", p, faulhaber_s_formula(p))
} << ^10