faulhaber_s_formula.sf 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. #!/usr/bin/ruby
  2. # The formula for calculating the sum of consecutive
  3. # numbers raised to a given power, such as:
  4. # 1^p + 2^p + 3^p + ... + n^p
  5. # where p is a positive integer.
  6. # See also:
  7. # https://en.wikipedia.org/wiki/Faulhaber%27s_formula
  8. # The Faulhaber's formula
  9. # See: https://en.wikipedia.org/wiki/Faulhaber%27s_formula
  10. func faulhaber_formula (n, p) {
  11. sum(0..p, {|k|
  12. binomial(p + 1, k) * bernoulli(k) * n**(p + 1 - k)
  13. }) / (p+1)
  14. }
  15. # Alternate expression using Bernoulli polynomials
  16. # See: https://en.wikipedia.org/wiki/Faulhaber%27s_formula#Alternate_expressions
  17. func bernoulli_polynomials (n, x) {
  18. sum(0..n, {|k|
  19. binomial(n, k) * bernoulli(n - k) * x**k
  20. })
  21. }
  22. func faulhaber_formula_2 (n, p) {
  23. (bernoulli_polynomials(p + 1, n) - bernoulli(p + 1)) / (p + 1)
  24. }
  25. for p in (0..20) {
  26. var n = 100.irand
  27. var r = faulhaber_formula(n, p)
  28. assert_eq(r, faulhaber_formula_2(n, p))
  29. assert_eq(r, n.faulhaber_sum(p)) # built-in
  30. printf("faulhaber_#{p}(%2d) = %s\n", n, r)
  31. }