faulhaber_s_formula_2.sf 567 B

1234567891011121314151617181920212223242526272829
  1. #!/usr/bin/ruby
  2. #
  3. ## http://rosettacode.org/wiki/Faulhaber%27s_formula
  4. #
  5. include('../lib/bacovia.sf')
  6. func bernoulli_polynomials(n, x) {
  7. var sum = Sum()
  8. for k in (0 .. n) {
  9. sum += (binomial(n, k) * bernoulli(n - k) * x**k)
  10. }
  11. return sum
  12. }
  13. func faulhaber_s_formula(n, p) {
  14. 1 + ((bernoulli_polynomials(p+1, n) - bernoulli_polynomials(p + 1, 1)) / (p + 1))
  15. }
  16. for p in (0..5) {
  17. var n = Symbol('n', 7)
  18. var f = faulhaber_s_formula(n, p)
  19. assert_eq(f.numeric, sum_by(1 .. 7, { _**p }))
  20. printf("F(%d) = %s\n", p, f.numeric)
  21. }