Law of cosines - triples: Difference between revisions

→‎{{header|Perl 6}}: Break apart angle calculations to reduce branching logic, clean up unneeded variables, eke out a few more percent points of speed-up
(→‎{{header|Perl 6}}: Break apart angle calculations to reduce branching logic, clean up unneeded variables, eke out a few more percent points of speed-up)
Line 578:
 
=={{header|Perl 6}}==
<lang perl6>submulti triples ($n60, $angle where any(60,90,120)n) {
my %sq = (1..$n).map: { .² => $_ };
my %triples;
(1..^$n).race(:8degree).map: -> $a {
for $a^..$n -> $b {
my $abcos = $a * $a + $b * $b - $a * $b;
my%triples{~($a, %sq{$cos =}, $angleb)}++ ==and 60last if ?? %sq{$ab - $a * $b !!cos}:exists;
$angle == 120 ?? $ab + $a * $b !!
$ab;
if $angle == 60 {
%triples{$angle}{~($a, %sq{$cos}, $b)}++ and last if %sq{$cos}:exists;
}
else {
%triples{$angle}{~($a, $b, %sq{$cos})}++ and last if %sq{$cos}:exists;
}
}
}
%triples.keys
}
 
multi triples (90, $n) {
my %sq = (1..$n).map: { .² => $_ };
my %triples;
(1..^$n).race(:8degree).map: -> $a {
for $a^..$n -> $b }{
my $anglecos == 120$a ??* $aba + $ab * $b !!;
%triples{$angle}{~($a, $b, %sq{$cos}, $b)}++ and last if %sq{$cos}:exists;
}
}
%triples.keys
}
 
multi triples (120, $n) {
my %sq = (1..$n).map: { .² => $_ };
my %triples;
(1..^$n).race(:8degree).map: -> $a {
for $a^..$n -> $b {
my $cos = $a * $a + $b * $b + $a * $abb;
%triples{$angle}{~($a, $b, %sq{$cos})}++ and last if %sq{$cos}:exists;
else {}
}
%triples.keys
}
 
Line 603 ⟶ 619:
say "Integer triangular triples for sides 1..$n:";
for 120, 90, 60 -> $angle {
my %@itt = triples($nangle, $anglen);
if $angle == 60 { push %@itt<60>, "$_ $_ $_" => 1 for 1..$n }
printf "Angle %3d° has %2d solutions: %s\n", $angle, +%@itt{$angle}, %@itt{$angle}.keys.sort(*.&naturally).join(', ');
}
 
my ($angle, $count) = 60, 10_000;
say "\nExtra credit:";
printsay "Number of 60$angle° integer triples in the range 1..$count where the sides are not all the same length: ", +triples($angle, $count);</lang>
say +triples($count, $angle){$angle};</lang>
{{out}}
<pre>Integer triangular triples for sides 1..13:
Line 619 ⟶ 634:
 
Extra credit:
Number of 60° integer triples in the range 1..10000 where the sides are not all the same length: 18394</pre>
 
=={{header|Python}}==
10,339

edits