prime_factors_of_binomial_coefficients.pl 861 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #!/usr/bin/perl
  2. # Author: Daniel "Trizen" Șuteu
  3. # License: GPLv3
  4. # Date: 25 August 2016
  5. # Website: https://github.com/trizen
  6. # An efficient algorithm for prime factorization of binomial coefficients.
  7. use 5.020;
  8. use strict;
  9. use warnings;
  10. use experimental qw(signatures);
  11. use ntheory qw(forprimes todigits vecsum);
  12. sub factorial_power ($n, $p) {
  13. ($n - vecsum(todigits($n, $p))) / ($p - 1);
  14. }
  15. #
  16. # Example for:
  17. # binomial(100, 50)
  18. #
  19. # which is equivalent with:
  20. # 100! / (100-50)! / 50!
  21. #
  22. my $n = 100;
  23. my $k = 50;
  24. my $j = $n - $k;
  25. my @factors;
  26. forprimes {
  27. my $p = factorial_power($n, $_);
  28. if ($_ <= $k) {
  29. $p -= factorial_power($k, $_);
  30. }
  31. if ($_ <= $j) {
  32. $p -= factorial_power($j, $_);
  33. }
  34. if ($p > 0) {
  35. push @factors, ($_) x $p;
  36. }
  37. } $n;
  38. say "Prime factors of binomial($n, $k) = (@factors)";