double_summation_formula.sf 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #!/usr/bin/ruby
  2. # Daniel "Trizen" Șuteu
  3. # Date: 14 November 2019
  4. # https://github.com/trizen
  5. # Single summation formula for a double summation.
  6. # Given any function f(k), let:
  7. # F(n) = Sum_{k=1..n} f(k)
  8. # S(n) = Sum_{k=1..n} F(k)
  9. # then:
  10. # S(n) = Sum_{k=1..n} Sum_{j=1..k} f(j)
  11. # S(n) = Sum_{k=1..n} f(k) * (n - k + 1)
  12. # By splitting the sum into two sums, we get:
  13. # A(n) = Sum_{k=1..n} f(k)
  14. # B(n) = Sum_{k=1..n} f(k)*k
  15. # Which allows us to represent S(n) as:
  16. # S(n) = (n+1)*A(n) - B(n)
  17. func f(k) { # any function f(k)
  18. k.euler_phi
  19. }
  20. func F(n) { # partial sums of f(k)
  21. sum(1..n, {|k|
  22. f(k)
  23. })
  24. }
  25. func S1(n) { # partial sums of F(k)
  26. sum(1..n, {|k|
  27. F(k)
  28. })
  29. }
  30. func S2(n) { # equivalent with S1(n)
  31. sum(1..n, {|k|
  32. f(k) * (n - k + 1)
  33. })
  34. }
  35. #-------------------------------
  36. func A(n) {
  37. sum(1..n, {|k|
  38. f(k)
  39. })
  40. }
  41. func B(n) {
  42. sum(1..n, {|k|
  43. k * f(k)
  44. })
  45. }
  46. func S3(n) {
  47. (n+1)*A(n) - B(n)
  48. }
  49. #-------------------------------
  50. say F(100) #=> 3044
  51. say S1(100) #=> 104359
  52. say S2(100) #=> 104359
  53. say S3(100) #=> 104359