Law of cosines - triples: Difference between revisions

Added Prolog Solution
(Added Wren)
(Added Prolog Solution)
Line 1,417:
Angle 120 has 2 solutions: {{3,5,7},{7,8,13}}
Non-equilateral angle 60 triangles for sides 1..10000: 18394
</pre>
 
=={{header|Prolog}}==
{{works with|SWI Prolog}}
<lang prolog>find_solutions(Limit, Solutions):-
find_solutions(Limit, Solutions, Limit, []).
 
find_solutions(_, S, 0, S):-
!.
find_solutions(Limit, Solutions, A, S):-
find_solutions1(Limit, A, A, S1, S),
A_next is A - 1,
find_solutions(Limit, Solutions, A_next, S1).
 
find_solutions1(Limit, _, B, Triples, Triples):-
B > Limit,
!.
find_solutions1(Limit, A, B, [Triple|Triples], T):-
is_solution(Limit, A, B, Triple),
!,
B_next is B + 1,
find_solutions1(Limit, A, B_next, Triples, T).
find_solutions1(Limit, A, B, Triples, T):-
B_next is B + 1,
find_solutions1(Limit, A, B_next, Triples, T).
 
is_solution(Limit, A, B, t(Angle, A, B, C)):-
X is A * A + B * B,
Y is A * B,
(
Angle = 90, C is round(sqrt(X)), X is C * C
;
Angle = 120, C2 is X + Y, C is round(sqrt(C2)), C2 is C * C
;
Angle = 60, C2 is X - Y, C is round(sqrt(C2)), C2 is C * C
),
C =< Limit,
!.
 
write_triples(Angle, Solutions):-
find_triples(Angle, Solutions, List, 0, Count),
writef('There are %w solutions for gamma = %w:\n', [Count, Angle]),
write_triples1(List),
nl.
 
find_triples(_, [], [], Count, Count):-
!.
find_triples(Angle, [Triple|Triples], [Triple|Result], C, Count):-
Triple = t(Angle, _, _, _),
!,
C1 is C + 1,
find_triples(Angle, Triples, Result, C1, Count).
find_triples(Angle, [_|Triples], Result, C, Count):-
find_triples(Angle, Triples, Result, C, Count).
 
write_triples1([]):-!.
write_triples1([t(_, A, B, C)]):-
writef('(%w,%w,%w)\n', [A, B, C]),
!.
write_triples1([t(_, A, B, C)|Triples]):-
writef('(%w,%w,%w) ', [A, B, C]),
write_triples1(Triples).
 
main:-
find_solutions(13, Solutions),
write_triples(60, Solutions),
write_triples(90, Solutions),
write_triples(120, Solutions).</lang>
 
{{out}}
<pre>
There are 15 solutions for gamma = 60:
(1,1,1) (2,2,2) (3,3,3) (3,8,7) (4,4,4) (5,5,5) (5,8,7) (6,6,6) (7,7,7) (8,8,8) (9,9,9) (10,10,10) (11,11,11) (12,12,12) (13,13,13)
 
There are 3 solutions for gamma = 90:
(3,4,5) (5,12,13) (6,8,10)
 
There are 2 solutions for gamma = 120:
(3,5,7) (7,8,13)
</pre>
 
1,777

edits