power_divisors.pl 762 B

1234567891011121314151617181920212223242526272829303132333435
  1. #!/usr/bin/perl
  2. # Daniel "Trizen" Șuteu
  3. # Date: 17 August 2021
  4. # https://github.com/trizen
  5. # Generate all the k-th power divisors of a given number.
  6. use 5.036;
  7. use ntheory qw(:all);
  8. sub power_divisors ($n, $k=1) {
  9. my @d = (1);
  10. my @pp = grep { $_->[1] >= $k } factor_exp($n);
  11. foreach my $pp (@pp) {
  12. my ($p, $e) = @$pp;
  13. my @t;
  14. for (my $i = $k ; $i <= $e ; $i += $k) {
  15. my $u = powint($p, $i);
  16. push @t, map { mulint($_, $u) } @d;
  17. }
  18. push @d, @t;
  19. }
  20. sort { $a <=> $b } @d;
  21. }
  22. say join(', ', power_divisors(3628800, 2)); # square divisors
  23. say join(', ', power_divisors(3628800, 3)); # cube divisors
  24. say join(', ', power_divisors(3628800, 4)); # 4th power divisors