#!/usr/bin/perl -w
use strict;
use v5.10;
use threads;
use threads::shared;
use Math::BigFloat qw();
$| = 1;
my $a :shared;
my $b :shared;
my $c :shared;
my $q :shared = 0;
sub progress {
$SIG{TERM} = $SIG{INT} = sub { threads->exit(); };
for (;;) {
select '', '', '', 0.5;
print "a: $a, b: $b, c: $c, q: $q\e[K\r";
}
}
my $thread = async \&progress;
$SIG{TERM} = $SIG{INT} = sub {
$thread->kill("INT");
$thread->join();
print "\ra: $a, b: $b, c: $c, q: $q\e[K\n";
say "goodbye.";
exit;
};
my $sqrt3 = sqrt(3);
my $best45 = 100;
my $best30 = 100;
sub maketriple {
my ($m, $n) = @_;
my $m2 = $m * $m;
my $n2 = $n * $n;
$a = abs($m2 - $n2);
$b = 2 * $m * $n;
$c = $m2 + $n2;
($a, $b) = $a < $b ? ($a, $b) : ($b, $a);
my $delta45 = Math::BigFloat->new(100 * ($b - $a) / $c);
my $delta30 = Math::BigFloat->new(100 * ($b - ($a * $sqrt3)) / $c);
my $absdelta30 = abs($delta30);
if ($absdelta30 < $best30) {
$best30 = $absdelta30;
say "better 30° found! ($a, $b, $c), Δ30°: $delta30%\e[K";
print "a: $a, b: $b, c: $c, q: $q\e[K\r";
}
if ($delta45 < $best45) {
$best45 = $delta45;
say "better 45° found! ($a, $b, $c), Δ45°: $delta45%\e[K";
print "a: $a, b: $b, c: $c, q: $q\e[K\r";
}
#if (5406093003 == $a) {
# $thread->kill('INT');
# $thread->join();
# exit;
#}
}
my @pairs;
sub addpairs {
my ($m, $n) = @_;
return if 0 == $m && 1 == $n;
maketriple $m, $n;
push @pairs, [$m, $n];
$q++;
}
addpairs 1, 2;
while (@pairs) {
my $pair = shift @pairs;
$q--;
my ($m, $n) = @$pair;
addpairs 2 * $m - $n, $m;
addpairs 2 * $m + $n, $m;
addpairs $m + 2 * $n, $n;
}
$thread->kill("INT");
$thread->join();