bell_numbers.pl 711 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. #!/usr/bin/perl
  2. # Fast algorithm for computing the first n Bell numbers, using Aitken's array.
  3. # See also:
  4. # https://en.wikipedia.org/wiki/Bell_number
  5. use 5.020;
  6. use strict;
  7. use warnings;
  8. use experimental qw(signatures);
  9. ## use Math::AnyNum qw(:overload);
  10. sub bell_numbers ($n) {
  11. my @acc;
  12. my @bell = (1);
  13. foreach my $k (1 .. $n) {
  14. my $t = $bell[-1];
  15. foreach my $i (0 .. $#acc) {
  16. $t += $acc[$i];
  17. $acc[$i] = $t;
  18. }
  19. unshift(@acc, $bell[-1]);
  20. push @bell, $acc[-1];
  21. }
  22. @bell;
  23. }
  24. say join ', ', bell_numbers(15);
  25. __END__
  26. 1, 1, 2, 5, 15, 52, 203, 877, 4140, 21147, 115975, 678570, 4213597, 27644437, 190899322, 1382958545