faulhaber_s_formula.sf 756 B

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. #!/usr/bin/ruby
  2. #
  3. ## https://rosettacode.org/wiki/Faulhaber%27s_formula
  4. #
  5. func bernoulli({.is_one}) { 1/2 }
  6. func bernoulli({.is_odd}) { 0/1 }
  7. func bernoulli(n) {
  8. var a = []
  9. for m in ^(n+1) {
  10. a[m] = 1/(m + 1)
  11. for j in (m^..0 + 1) {
  12. a[j-1] = j*(a[j-1] - a[j])
  13. }
  14. }
  15. return a[0]
  16. }
  17. func faulhaber_s_formula(p) {
  18. var formula = gather {
  19. { |j|
  20. take "(#{binomial(p+1, j) * j.bernfrac -> as_rat})*n^#{p+1 - j}"
  21. } << 0..p
  22. }
  23. formula.grep! { !.contains('(0)*') }.join!(' + ')
  24. formula -= /\(1\)\*/g
  25. formula -= /\^1\b/g
  26. formula.gsub!(/\(([^+]*?)\)/, { _ })
  27. "1/#{p + 1} * (#{formula})"
  28. }
  29. { |p|
  30. printf("%2d: %s\n", p, faulhaber_s_formula(p))
  31. } << ^10