Faulhaber's formula: Difference between revisions

Content deleted Content added
Laurence (talk | contribs)
Added Fōrmulæ
Trizen (talk | contribs)
→‎{{header|Sidef}}: better solution, using Math::Polynomial
Line 2,268: Line 2,268:


=={{header|Sidef}}==
=={{header|Sidef}}==
<lang ruby>func faulhaber_s_formula(p) {
<lang ruby>const AnyNum = require('Math::AnyNum')
const Poly = require('Math::Polynomial')


Poly.string_config(Hash(
var formula = gather {
{ |j|
fold_sign => true, prefix => "",
suffix => "", variable => "n"
take "(#{binomial(p+1, j) * j.bernfrac -> as_rat})*n^#{p+1 - j}"
))
} << 0..p
}


func anynum(n) {
formula.grep! { !.contains('(0)*') }.join!(' + ')
AnyNum.new(n.as_rat)

formula -= /\(1\)\*/g
formula -= /\^1\b/g
formula.gsub!(/\(([^+]*?)\)/, { _ })

"1/#{p + 1} * (#{formula})"
}
}


func faulhaber_formula(p) {
{ |p|
(p+1).of { |j|
printf("%2d: %s\n", p, faulhaber_s_formula(p))
Poly.monomial(p - j + 1)\
} << ^10</lang>
.mul_const(anynum(bernoulli(j)))\
{{out}}
.mul_const(anynum(binomial(p+1, j)))
<pre>
}.reduce(:add).div_const(p+1)
0: 1/1 * (n)
1: 1/2 * (n^2 + n)
2: 1/3 * (n^3 + 3/2*n^2 + 1/2*n)
3: 1/4 * (n^4 + 2*n^3 + n^2)
4: 1/5 * (n^5 + 5/2*n^4 + 5/3*n^3 + -1/6*n)
5: 1/6 * (n^6 + 3*n^5 + 5/2*n^4 + -1/2*n^2)
6: 1/7 * (n^7 + 7/2*n^6 + 7/2*n^5 + -7/6*n^3 + 1/6*n)
7: 1/8 * (n^8 + 4*n^7 + 14/3*n^6 + -7/3*n^4 + 2/3*n^2)
8: 1/9 * (n^9 + 9/2*n^8 + 6*n^7 + -21/5*n^5 + 2*n^3 + -3/10*n)
9: 1/10 * (n^10 + 5*n^9 + 15/2*n^8 + -7*n^6 + 5*n^4 + -3/2*n^2)
</pre>

By not simplifying the formulas, we can have a much cleaner code:
<lang ruby>func faulhaber_s_formula(p) {
"1/#{p + 1} * (" + gather {
{ |j|
take "#{binomial(p+1, j) * j.bernfrac -> as_rat}*n^#{p+1 - j}"
} << 0..p
}.join(' + ') + ")"
}
}


for p in (^10) {
{ |p|
printf("%2d: %s\n", p, faulhaber_s_formula(p))
printf("%2d: %s\n", p, faulhaber_formula(p))
} << ^10</lang>
}</lang>
{{out}}
{{out}}
<pre>
<pre>
0: 1/1 * (1*n^1)
0: n
1: 1/2 * (1*n^2 + 1*n^1)
1: 1/2 n^2 + 1/2 n
2: 1/3 * (1*n^3 + 3/2*n^2 + 1/2*n^1)
2: 1/3 n^3 + 1/2 n^2 + 1/6 n
3: 1/4 * (1*n^4 + 2*n^3 + 1*n^2 + 0*n^1)
3: 1/4 n^4 + 1/2 n^3 + 1/4 n^2
4: 1/5 * (1*n^5 + 5/2*n^4 + 5/3*n^3 + 0*n^2 + -1/6*n^1)
4: 1/5 n^5 + 1/2 n^4 + 1/3 n^3 - 1/30 n
5: 1/6 * (1*n^6 + 3*n^5 + 5/2*n^4 + 0*n^3 + -1/2*n^2 + 0*n^1)
5: 1/6 n^6 + 1/2 n^5 + 5/12 n^4 - 1/12 n^2
6: 1/7 * (1*n^7 + 7/2*n^6 + 7/2*n^5 + 0*n^4 + -7/6*n^3 + 0*n^2 + 1/6*n^1)
6: 1/7 n^7 + 1/2 n^6 + 1/2 n^5 - 1/6 n^3 + 1/42 n
7: 1/8 * (1*n^8 + 4*n^7 + 14/3*n^6 + 0*n^5 + -7/3*n^4 + 0*n^3 + 2/3*n^2 + 0*n^1)
7: 1/8 n^8 + 1/2 n^7 + 7/12 n^6 - 7/24 n^4 + 1/12 n^2
8: 1/9 * (1*n^9 + 9/2*n^8 + 6*n^7 + 0*n^6 + -21/5*n^5 + 0*n^4 + 2*n^3 + 0*n^2 + -3/10*n^1)
8: 1/9 n^9 + 1/2 n^8 + 2/3 n^7 - 7/15 n^5 + 2/9 n^3 - 1/30 n
9: 1/10 * (1*n^10 + 5*n^9 + 15/2*n^8 + 0*n^7 + -7*n^6 + 0*n^5 + 5*n^4 + 0*n^3 + -3/2*n^2 + 0*n^1)
9: 1/10 n^10 + 1/2 n^9 + 3/4 n^8 - 7/10 n^6 + 1/2 n^4 - 3/20 n^2
</pre>
</pre>