mysterious_sum-pentagonal_numbers.pl 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. #!/usr/bin/perl
  2. # Author: Daniel "Trizen" Șuteu
  3. # Date: 14 August 2016
  4. # License: GPLv3
  5. # Website: https://github.com/trizen
  6. # Mysterious sum-pentagonal numbers.
  7. # A strange fact: at this very moment, as far as
  8. # I searched, nothing is known about this numbers...
  9. use 5.010;
  10. use strict;
  11. use warnings;
  12. use Memoize qw(memoize);
  13. memoize('sum_pentagonal');
  14. sub p {
  15. $_[0] * (3 * $_[0] - 1) / 2;
  16. }
  17. sub sum_pentagonal {
  18. my ($n) = @_;
  19. my $i = 1;
  20. my $sum = 0;
  21. while (1) {
  22. my $p1 = p($i);
  23. if ($n - $p1 == 0) {
  24. return $sum + $n;
  25. }
  26. elsif ($n - $p1 < 0) {
  27. last;
  28. }
  29. $sum += (-1)**($i - 1) * sum_pentagonal($n - $p1);
  30. my $p2 = p(-$i);
  31. if ($n - $p2 == 0) {
  32. return $sum + $n;
  33. }
  34. elsif ($n - $p2 < 0) {
  35. last;
  36. }
  37. $sum += (-1)**($i - 1) * sum_pentagonal($n - $p2);
  38. ++$i;
  39. }
  40. $sum;
  41. }
  42. foreach my $n (1 .. 100) {
  43. say "s($n) = ", sum_pentagonal($n);
  44. }
  45. __END__
  46. s(1) = 1
  47. s(2) = 3
  48. s(3) = 4
  49. s(4) = 7
  50. s(5) = 16
  51. s(6) = 22
  52. s(7) = 42
  53. s(8) = 59
  54. s(9) = 91
  55. s(10) = 130
  56. s(11) = 192
  57. s(12) = 276
  58. s(13) = 388
  59. s(14) = 534
  60. s(15) = 752
  61. s(16) = 1011
  62. s(17) = 1376
  63. s(18) = 1833
  64. s(19) = 2448
  65. s(20) = 3216
  66. s(21) = 4232
  67. s(22) = 5514
  68. s(23) = 7152
  69. s(24) = 9206
  70. s(25) = 11823
  71. s(26) = 15094
  72. s(27) = 19198
  73. s(28) = 24282
  74. s(29) = 30624
  75. s(30) = 38450