factorial_from_primes_simple.pl 621 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. #!/usr/bin/perl
  2. # Author: Daniel "Trizen" Șuteu
  3. # License: GPLv3
  4. # Date: 18 July 2016
  5. # Website: https://github.com/trizen
  6. # A fast algorithm, based on powers of primes,
  7. # for exactly computing very large factorials.
  8. use 5.020;
  9. use strict;
  10. use warnings;
  11. use experimental qw(signatures);
  12. use ntheory qw(forprimes);
  13. use Math::AnyNum qw(:overload sumdigits);
  14. sub factorial_power ($n, $p) {
  15. ($n - sumdigits($n, $p)) / ($p - 1);
  16. }
  17. sub factorial ($n) {
  18. my $f = 1;
  19. forprimes {
  20. $f *= $_**factorial_power($n, $_);
  21. } $n;
  22. return $f;
  23. }
  24. for my $n (0 .. 50) {
  25. say "$n! = ", factorial($n);
  26. }