075 Singular integer right triangles.pl 866 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. #!/usr/bin/perl
  2. # Author: Daniel "Trizen" Șuteu
  3. # Date: 18 August 2016
  4. # License: GPLv3
  5. # Website: https://github.com/trizen
  6. # https://projecteuler.net/problem=75
  7. # Runtime: 1.708s
  8. use 5.010;
  9. use strict;
  10. use integer;
  11. use ntheory qw(gcd);
  12. my $limit = 1_500_000;
  13. my $end = sqrt($limit);
  14. my %triangle;
  15. foreach my $n (1 .. $end - 1) {
  16. for (my $m = $n + 1 ; $m <= $end ; $m += 2) {
  17. if (gcd($n, $m) == 1) { # m and n coprime
  18. my $k = 1;
  19. while (1) {
  20. my $x = $k * ($m**2 - $n**2);
  21. my $y = $k * (2 * $m * $n);
  22. my $z = $k * ($m**2 + $n**2);
  23. last if $x + $y + $z > $limit;
  24. ++$triangle{$x + $y + $z};
  25. ++$k;
  26. }
  27. }
  28. }
  29. }
  30. my $count = 0;
  31. foreach my $v (values %triangle) {
  32. ++$count if $v == 1;
  33. }
  34. say $count;