greatest_common_unitary_divisor.pl 838 B

123456789101112131415161718192021222324252627282930313233343536
  1. #!/usr/bin/perl
  2. # Author: Trizen
  3. # Date: 13 September 2023
  4. # https://github.com/trizen
  5. # Efficient algorithm for finding the greatest common unitary divisor of a list of integers.
  6. use 5.036;
  7. use ntheory qw(:all);
  8. sub gcud (@list) {
  9. my $g = gcd(@list);
  10. foreach my $n (@list) {
  11. next if ($n == 0);
  12. while (1) {
  13. my $t = gcd($g, divint($n, $g));
  14. last if ($t == 1);
  15. $g = divint($g, $t);
  16. }
  17. last if ($g == 1);
  18. }
  19. return $g;
  20. }
  21. say gcud(); #=> 0
  22. say gcud(2); #=> 2
  23. say gcud(10, 20); #=> 5
  24. say gcud(factorial(9), 5040); #=> 35
  25. say gcud(factorial(9), 5040, 120); #=> 5
  26. say gcud(factorial(9), 5040, 0, 120); #=> 5
  27. say gcud(factorial(9), 5040, 1234); #=> 1