Jump to content

Faulhaber's formula: Difference between revisions

(Added Wren)
Line 1,830:
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>
 
=={{header|Nim}}==
{{trans|Kotlin}}
<lang Nim>import math, rationals
 
type
Fraction = Rational[int]
FaulhaberSequence = seq[Fraction]
 
const
Zero = 0 // 1
One = 1 // 1
MinusOne = -1 // 1
Powers = ["⁰", "¹", "²", "³", "⁴", "⁵", "⁶", "⁷", "⁸", "⁹"]
 
#---------------------------------------------------------------------------------------------------
 
func bernoulli(n: Natural): Fraction =
## Return nth Bernoulli coefficient.
 
var a = newSeq[Fraction](n + 1)
for m in 0..n:
a[m] = 1 // (m + 1)
for k in countdown(m, 1):
a[k - 1] = (a[k - 1] - a[k]) * k
result = if n != 1: a[0] else: -a[0]
 
#---------------------------------------------------------------------------------------------------
 
func faulhaber(n: Natural): seq[Fraction] =
## Return nth Faulhaber sequence.
 
var a = 1 // (n + 1)
var sign = -1
for k in 0..n:
sign = -sign
result.add(a * sign * binom(n + 1, k) * bernoulli(k))
 
#---------------------------------------------------------------------------------------------------
 
func npower(k: Natural): string =
## Return the string representing "n" at power "k".
 
if k == 0: return ""
if k == 1: return "n"
var k = k
result = "n"
while k != 0:
result.insert(Powers[k mod 10], 1)
k = k div 10
 
#---------------------------------------------------------------------------------------------------
 
func `$`(fs: FaulhaberSequence): string =
## Return the string representing a Faulhaber sequence.
for i, coeff in fs:
 
# Process coefficient.
if coeff.num == 0: continue
if i == 0:
if coeff == MinusOne: result.add(" - ")
elif coeff != One: result.add($coeff)
else:
if coeff == One: result.add(" + ")
elif coeff == MinusOne: result.add(" - ")
elif coeff > Zero: result.add(" + " & $coeff)
else: result.add(" - " & $(-coeff))
 
# Process power of "n".
let pwr = fs.len - i
result.add(npower(pwr))
 
#———————————————————————————————————————————————————————————————————————————————————————————————————
 
for n in 0..9:
echo n, ": ", faulhaber(n)</lang>
 
{{out}}
<pre>0: n
1: 1/2n² + 1/2n
2: 1/3n³ + 1/2n² + 1/6n
3: 1/4n⁴ + 1/2n³ + 1/4n²
4: 1/5n⁵ + 1/2n⁴ + 1/3n³ - 1/30n
5: 1/6n⁶ + 1/2n⁵ + 5/12n⁴ - 1/12n²
6: 1/7n⁷ + 1/2n⁶ + 1/2n⁵ - 1/6n³ + 1/42n
7: 1/8n⁸ + 1/2n⁷ + 7/12n⁶ - 7/24n⁴ + 1/12n²
8: 1/9n⁹ + 1/2n⁸ + 2/3n⁷ - 7/15n⁵ + 2/9n³ - 1/30n
9: 1/10n¹⁰ + 1/2n⁹ + 3/4n⁸ - 7/10n⁶ + 1/2n⁴ - 3/20n²</pre>
 
=={{header|PARI/GP}}==
Anonymous user
Cookies help us deliver our services. By using our services, you agree to our use of cookies.