#!/usr/bin/perl

use 5.040.1;

$|++;

my $t0 = time();

my ($N, $c, $x1, $y1, $numerador, $xy1, $z1, $rint) = (50_000, 0, 0, 0, 0, 0, 0, 0); 
open my $fh, '>', $0 . "\.out" or die $!;

for my $x ( 1 .. $N ){
    $x1 = $x * $x;
    for my $y ( 1 .. $N ){
	$y1 = $y * $y;
	$numerador = $x1 + $y1;
	$xy1 = $x * $y + 1;
	for my $z ( 1 .. $N ){
	    $rint = $numerador / $xy1;
	    next unless ( int( $rint ) == $rint );
	    $z1 = $z * $z;
	    next unless ( $rint >= $z1 - $y1 && $rint <= $z1 + $y1 );
	    next unless ( $rint >= $z1 - $x1 && $rint <= $z1 + $x1 );
	    if ( $rint == $z1 ){                       # (que entero deba ser entero no hace falta check, daría error en esto. # el error de division (supongo que mejor que Pentium II, IEEE 754)  
		$c++;
		say "$c)   $x\*\*2 + $y\*\*2 \/ ( $x\*$y \+ 1)  \=   $z\*\*2   -->   $numerador  \/   $xy1  \=  $z1";
		say $fh "$c)   $x\*\*2 + $y\*\*2 \/ ( $x\*$y \+ 1)  \=   $z\*\*2   -->   $numerador  \/   $xy1  \=  $z1";
	    }
	}
	select (undef, undef, undef, 0.001);
    }
}
close $fh;

say "Finished $0 in ", time() - $t0, " secs\n";

exit 2;


