sum_of_polygonal_numbers_function_recursive.sf 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #!/usr/bin/ruby
  2. # Author: Daniel "Trizen" Șuteu
  3. # Date: 12 August 2021
  4. # https://github.com/trizen
  5. # Count the number of ways of writing n as the sum of k m-polygonal numbers.
  6. # See also:
  7. # https://en.wikipedia.org/wiki/Polygonal_number
  8. # https://en.wikipedia.org/wiki/Sum_of_squares_function
  9. # OEIS sequences:
  10. # https://oeis.org/A008441 -- Number of ways of writing n as the sum of 2 triangular numbers.
  11. # https://oeis.org/A008443 -- Number of ordered ways of writing n as the sum of 3 triangular numbers.
  12. # https://oeis.org/A008438 -- Number of ways of writing n as the sum of 4 triangular numbers.
  13. # https://oeis.org/A008439 -- Number of ways of writing n as the sum of 5 triangular numbers.
  14. # https://oeis.org/A008440 -- Number of representations of n as sum of 6 triangular numbers.
  15. func sum_of_polygonals_count(n, k, f, g, h) is cached {
  16. return 1 if (n == 0)
  17. return 0 if (k <= 0)
  18. return (g(n) ? 1 : 0) if (k == 1)
  19. var count = 0
  20. for a in (0 .. h(n)) {
  21. if (k > 2) {
  22. count += __FUNC__(n - f(a), k-1, f, g, h)
  23. }
  24. elsif (g(n - f(a))) {
  25. ++count
  26. }
  27. }
  28. return count
  29. }
  30. var v = 3 # 3 = triangular numbers
  31. var f = { .polygonal(v) }
  32. var g = { .is_polygonal(v) }
  33. var h = { .ipolygonal_root(v) }
  34. for k in (1..9) {
  35. say ("k = #{k}: ", 15.of {|n| sum_of_polygonals_count(n, k, f, g, h) })
  36. }
  37. __END__
  38. k = 1: [1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0]
  39. k = 2: [1, 2, 1, 2, 2, 0, 3, 2, 0, 2, 2, 2, 1, 2, 0]
  40. k = 3: [1, 3, 3, 4, 6, 3, 6, 9, 3, 7, 9, 6, 9, 9, 6]
  41. k = 4: [1, 4, 6, 8, 13, 12, 14, 24, 18, 20, 32, 24, 31, 40, 30]
  42. k = 5: [1, 5, 10, 15, 25, 31, 35, 55, 60, 60, 90, 90, 95, 135, 125]
  43. k = 6: [1, 6, 15, 26, 45, 66, 82, 120, 156, 170, 231, 276, 290, 390, 435]
  44. k = 7: [1, 7, 21, 42, 77, 126, 175, 253, 357, 434, 567, 735, 833, 1057, 1302]
  45. k = 8: [1, 8, 28, 64, 126, 224, 344, 512, 757, 1008, 1332, 1792, 2198, 2752, 3528]
  46. k = 9: [1, 9, 36, 93, 198, 378, 633, 990, 1521, 2173, 2979, 4113, 5370, 6858, 8955]