divisors_of_factorial_below_limit.pl 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. #!/usr/bin/perl
  2. # Daniel "Trizen" Șuteu
  3. # Date: 18 December 2018
  4. # https://github.com/trizen
  5. # Generate the divisors of n! below a given limit.
  6. use 5.020;
  7. use warnings;
  8. use experimental qw(signatures);
  9. use ntheory qw(primes todigits vecsum valuation factorial);
  10. sub divisors_of_factorial ($f, $limit = factorial($f)) {
  11. my @primes = @{primes($f)};
  12. my @d = (1);
  13. foreach my $p (@primes) {
  14. # Maximum power of p in f!
  15. my $pow = ($f - vecsum(todigits($f, $p))) / ($p - 1);
  16. foreach my $n (@d) {
  17. if ($n * $p <= $limit) {
  18. last if (valuation($n, $p) >= $pow);
  19. push @d, $n * $p;
  20. }
  21. }
  22. }
  23. return \@d;
  24. }
  25. my $n = 30;
  26. my $limit = 10**12;
  27. my $d = divisors_of_factorial($n, $limit);
  28. printf "There are %s divisors of $n! below $limit\n", scalar(@$d);
  29. printf "Sum of divisors of $n! below $limit = %s\n", vecsum(@$d);
  30. __END__
  31. There are 372197 divisors of 30! below 1000000000000
  32. Sum of divisors of 30! below 1000000000000 = 53793088959503349