Fuzion Logo
fuzion-lang.dev — The Fuzion Language Portal

Rosetta Code Faulhaber Example

From rosettacode.org:

[The following task description was taken from rosettacode.org:]

In mathematics, Faulhaber's formula, named after Johann Faulhaber, expresses the sum of the p-th powers of the first n positive integers as a (p + 1)th-degree polynomial function of n, the coefficients involving Bernoulli numbers.

# http://rosettacode.org/wiki/Faulhaber's_formula
faulhaber_example is
bernoulli (n i32) num.fraction i32
pre
n >= 0
=>
local_mutate : mutate is
local_mutate.instate_self (()->
a := local_mutate.env.new (array n+1 (i -> 11))
for
m in 0..n
do
a <- (a.get.put m (1 ⁄ (m+1)))
for k in m..1 : -1 do
a <- (a.get.put (k-1) ((a.get[k - 1] - a.get[k]) * (k ⁄ 1)))
if n != 1
a.get[0]
else
-a.get[0])
binomial(n, k i32)
pre
n > 0
k >= 0
=> factorial n / (factorial k * factorial n-k)
factorial(n i32)
=>
for
res := 1, res * i
i in 1..n
do
else
res
faulhaber(p i32) =>
yak "$p : "
q := 1 ⁄ (p+1)
for
j in 0..p
sign := 11, sign * (-11)
do
b := binomial(p+1, j) ⁄ 1
coeff := q * sign / (11) * b * bernoulli j
if coeff != (01)
if j = 0
if coeff = (11)
else
if coeff = (-11)
yak "-"
else
yak "$coeff"
else
if coeff = (11)
yak " + "
else
if coeff = (-11)
yak " - "
else
if coeff > (01)
yak " + $coeff"
else
yak " - {-coeff}"
pwr := p + 1 - j
if pwr > 1
yak "n^$pwr"
else
yak "n"
for i in 0..11 do
faulhaber i
say ""
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
last changed: 2025-05-12