additive_binomial.pl 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. #!/usr/bin/perl
  2. # Daniel "Trizen" Șuteu
  3. # Date: 15 October 2017
  4. # https://github.com/trizen
  5. # Analogy to the binomial coefficient, using addition instead of multiplication.
  6. # Defined as:
  7. # additive_binomial(n, k) = (Sum_{a = n-k+1..n} a) - (Sum_{b = 1..k} b)
  8. # = n*(n+1)/2 - (n-k)*(n-k+1)/2 - k*(k+1)/2
  9. # = n*k - k^2
  10. # = k*(n-k)
  11. # Additionally:
  12. # f(x, n) = Sum_{k=0, n} ( additive_binomial(n, k) + x*k )
  13. # = x*n*(n+1)/2 + (n+1)/3 * n*(n-1)/2
  14. # = x*(n^2 + n)/2 + (n^3 - n)/6
  15. # = {x, 3x+1, 6x+4, 10x+10, 15x+20, 21x+35, 28x+56, 36x+84, 45x+120, 55x+165, ...}
  16. # Where for x=1, we have:
  17. # f(1, n) = {1, 4, 10, 20, 35, 56, 84, 120, 165, 220, 286, 364, 455, 560, 680, 816, 969, ...}
  18. use 5.020;
  19. use strict;
  20. use warnings;
  21. use experimental qw(signatures);
  22. sub additive_binomial ($n, $k) {
  23. $k * ($n - $k);
  24. }
  25. foreach my $n (0 .. 19) {
  26. say join(' ', map { sprintf('%2s', additive_binomial($n, $_)) } 0 .. $n);
  27. }
  28. __END__
  29. 0
  30. 0 0
  31. 0 1 0
  32. 0 2 2 0
  33. 0 3 4 3 0
  34. 0 4 6 6 4 0
  35. 0 5 8 9 8 5 0
  36. 0 6 10 12 12 10 6 0
  37. 0 7 12 15 16 15 12 7 0
  38. 0 8 14 18 20 20 18 14 8 0
  39. 0 9 16 21 24 25 24 21 16 9 0
  40. 0 10 18 24 28 30 30 28 24 18 10 0
  41. 0 11 20 27 32 35 36 35 32 27 20 11 0
  42. 0 12 22 30 36 40 42 42 40 36 30 22 12 0
  43. 0 13 24 33 40 45 48 49 48 45 40 33 24 13 0
  44. 0 14 26 36 44 50 54 56 56 54 50 44 36 26 14 0
  45. 0 15 28 39 48 55 60 63 64 63 60 55 48 39 28 15 0
  46. 0 16 30 42 52 60 66 70 72 72 70 66 60 52 42 30 16 0
  47. 0 17 32 45 56 65 72 77 80 81 80 77 72 65 56 45 32 17 0
  48. 0 18 34 48 60 70 78 84 88 90 90 88 84 78 70 60 48 34 18 0