split_summation.sf 920 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. #!/usr/bin/ruby
  2. # Daniel "Trizen" Șuteu
  3. # Date: 26 June 2018
  4. # https://github.com/trizen
  5. # Formula for splitting a sum taken over the product of two functions:
  6. #
  7. # a(n) = Sum_{k=1..n} f(k)*g(k)
  8. #
  9. # into:
  10. #
  11. # a(n) = [Sum_{k=1..n} f(k)] * [Sum_{k=1..n} g(k)] - Sum_{k=1..n} g(k)*[[Sum_{j=1..n} f(j)] - f(k)]
  12. # a(n) = [Sum_{k=1..n} f(k)] * [Sum_{k=1..n} g(k)] - Sum_{k=1..n} f(k)*[[Sum_{j=1..n} g(j)] - g(k)]
  13. #
  14. func f(n) {
  15. euler_phi(n)
  16. }
  17. func g(n,k) {
  18. floor(n/k) * floor(1 + n/k) / 2
  19. }
  20. func normal_summation(n) {
  21. sum(1..n, {|k|
  22. f(k) * g(n,k)
  23. })
  24. }
  25. func split_summation(n) {
  26. var S = sum(1..n, {|k| f(k) })
  27. var T = sum(1..n, {|k| g(n,k) })
  28. var V = sum(1..n, {|k|
  29. g(n,k) * (sum(1..n, {|j| f(j) }) - f(k))
  30. })
  31. S*T - V
  32. }
  33. say 15.of(normal_summation) #=> [0, 1, 4, 9, 17, 26, 41, 54, 74, 95, 122, 143, 183, 208, 247]
  34. say 15.of(split_summation) #=> =//=