Faulhaber's formula: Difference between revisions
Content deleted Content added
Added Fōrmulæ |
→{{header|Sidef}}: better solution, using Math::Polynomial |
||
Line 2,268: | Line 2,268: | ||
=={{header|Sidef}}== |
=={{header|Sidef}}== |
||
<lang ruby> |
<lang ruby>const AnyNum = require('Math::AnyNum') |
||
const Poly = require('Math::Polynomial') |
|||
Poly.string_config(Hash( |
|||
var formula = gather { |
|||
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| |
|||
⚫ | |||
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 { |
|||
⚫ | |||
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, |
printf("%2d: %s\n", p, faulhaber_formula(p)) |
||
} |
}</lang> |
||
{{out}} |
{{out}} |
||
<pre> |
<pre> |
||
0: |
0: n |
||
1: 1/2 |
1: 1/2 n^2 + 1/2 n |
||
2: 1/3 |
2: 1/3 n^3 + 1/2 n^2 + 1/6 n |
||
3: 1/4 |
3: 1/4 n^4 + 1/2 n^3 + 1/4 n^2 |
||
4: 1/5 |
4: 1/5 n^5 + 1/2 n^4 + 1/3 n^3 - 1/30 n |
||
5: 1/6 |
5: 1/6 n^6 + 1/2 n^5 + 5/12 n^4 - 1/12 n^2 |
||
6: 1/7 |
6: 1/7 n^7 + 1/2 n^6 + 1/2 n^5 - 1/6 n^3 + 1/42 n |
||
7: 1/8 |
7: 1/8 n^8 + 1/2 n^7 + 7/12 n^6 - 7/24 n^4 + 1/12 n^2 |
||
8: 1/9 |
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 |
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> |
||