Commits

Shlomi Fish committed b7cdd39

Solved Euler Project problem #139.

Comments (0)

Files changed (1)

project-euler/139/139-take1.pl

+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+=head1 DESCRIPTION
+
+Let (a, b, c) represent the three sides of a right angle triangle with integral length sides. It is possible to place four such triangles together to form a square with length c.
+
+For example, (3, 4, 5) triangles can be placed together to form a 5 by 5 square with a 1 by 1 hole in the middle and it can be seen that the 5 by 5 square can be tiled with twenty-five 1 by 1 squares.
+
+However, if (5, 12, 13) triangles were used then the hole would measure 7 by 7 and these could not be used to tile the 13 by 13 square.
+
+Given that the perimeter of the right triangle is less than one-hundred million, how many Pythagorean triangles would allow such a tiling to take place?
+=cut
+
+=head1 Keywords
+
+Pythagoras, Euler's Formula, Hypoteneuse
+
+=cut
+
+sub gcd
+{
+    my ($n, $m) = @_;
+
+    if ($m == 0)
+    {
+        return $n;
+    }
+
+    return gcd($m,$n % $m);
+}
+
+my $limit = 100_000_000;
+my $half_limit = ($limit >> 1);
+
+my $hypotenuse_lim = int($limit/2);
+
+my $major_side_limit = int($limit/2);
+
+# Euclid's formula
+my $m_limit = int(sqrt($hypotenuse_lim));
+
+my $count = 0;
+
+for my $m (2 .. $m_limit)
+{
+    if ($m % 1000 == 0)
+    {
+        print "M=$m\n";
+    }
+    my $n = ((($m & 0x1) == 0) ? 1 : 2);
+
+    N_LOOP:
+    while ($n < $m)
+    {
+        if (gcd( $m, $n ) == 1)
+        {
+            my $half_sum = $m * ($m + $n);
+            if ($half_sum > $half_limit)
+            {
+                last N_LOOP;
+            }
+
+            my ($aa, $bb, $cc) = ($m*$m-$n*$n, 2*$m*$n, $m*$m+$n*$n);
+
+            if ($cc % abs($bb-$aa) == 0)
+            {
+                $count += int( $half_limit / $half_sum );
+            }
+        }
+    }
+    continue
+    {
+        $n += 2;
+    }
+}
+
+print "Count = $count\n";
+
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.