modular_bell_numbers.pl 765 B

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. #!/usr/bin/perl
  2. # A fast algorithm for computing the n-th Bell number modulo a native integer.
  3. # See also:
  4. # https://oeis.org/A325630 -- Numbers k such that Bell(k) == 0 (mod k).
  5. # https://en.wikipedia.org/wiki/Bell_number
  6. use 5.020;
  7. use strict;
  8. use warnings;
  9. use Math::GMPz;
  10. use ntheory qw(addmod);
  11. use experimental qw(signatures);
  12. sub bell_number ($n, $m) {
  13. my @acc;
  14. my $t = 0;
  15. my $bell = 1;
  16. foreach my $k (1 .. $n) {
  17. $t = $bell;
  18. foreach my $j (@acc) {
  19. $t = addmod($t, $j, $m);
  20. $j = $t;
  21. }
  22. unshift @acc, $bell;
  23. $bell = $acc[-1];
  24. }
  25. $bell;
  26. }
  27. say bell_number(35, 35); #=> 0
  28. say bell_number(35, 1234); #=> 852
  29. say bell_number(123, 4171); #=> 3567