Faulhaber's formula: Difference between revisions

(Added c#)
Line 1,262:
f(8) = 1/9 * (n^9 + (9/2)*n^8 + (6/1)*n^7 + (-21/5)*n^5 + (2/1)*n^3 + (-3/10)*n)
f(9) = 1/10 * (n^10 + (5/1)*n^9 + (15/2)*n^8 + (-7/1)*n^6 + (5/1)*n^4 + (-3/2)*n^2)
</pre>
 
=={{header|Phix}}==
{{trans|C#}}
<lang Phix>include builtins\pfrac.e -- (0.8.0+)
 
function bernoulli(integer n)
sequence a = {}
for m=0 to n do
a = append(a,{1,m+1})
for j=m to 1 by -1 do
a[j] = frac_mul({j,1},frac_sub(a[j+1],a[j]))
end for
end for
if n!=1 then return a[1] end if
return frac_uminus(a[1])
end function
 
function binomial(integer n, k)
if n<0 or k<0 or n<k then ?9/0 end if
if n=0 or k=0 then return 1 end if
integer num = 1,
denom = 1
for i=k+1 to n do
num *= i
end for
for i=2 to n-k do
denom *= i
end for
return num / denom
end function
procedure faulhaber(integer p)
string res = sprintf("%d : ", p)
frac q = {1, p+1}
for j=0 to p do
frac bj = bernoulli(j)
if frac_ne(bj,frac_zero) then
frac coeff = frac_mul({binomial(p+1,j),p+1},bj)
string s = frac_sprint(coeff)
if j=0 then
if s="1" then
s = ""
end if
else
if s[1]='-' then
s[1..1] = " - "
else
s[1..0] = " + "
end if
end if
res &= s&"n"
integer pwr = p+1-j
if pwr>1 then
res &= sprintf("^%d", pwr)
end if
end if
end for
printf(1,"%s\n",{res})
end procedure
for i=0 to 9 do
faulhaber(i)
end for</lang>
{{out}}
<pre>
0 : n
1 : 1/2n^2 + 1/2n
2 : 1/3n^3 + 1/2n^2 + 1/6n
3 : 1/4n^4 + 1/2n^3 + 1/4n^2
4 : 1/5n^5 + 1/2n^4 + 1/3n^3 - 1/30n
5 : 1/6n^6 + 1/2n^5 + 5/12n^4 - 1/12n^2
6 : 1/7n^7 + 1/2n^6 + 1/2n^5 - 1/6n^3 + 1/42n
7 : 1/8n^8 + 1/2n^7 + 7/12n^6 - 7/24n^4 + 1/12n^2
8 : 1/9n^9 + 1/2n^8 + 2/3n^7 - 7/15n^5 + 2/9n^3 - 1/30n
9 : 1/10n^10 + 1/2n^9 + 3/4n^8 - 7/10n^6 + 1/2n^4 - 3/20n^2
</pre>
 
7,795

edits