45 lines
1.3 KiB
Erlang
45 lines
1.3 KiB
Erlang
%%
|
|
%% Pythagorian triples in Erlang, J.W. Luiten
|
|
%%
|
|
-module(triples).
|
|
-export([main/1]).
|
|
|
|
%% Transformations t1, t2 and t3 to generate new triples
|
|
t1(A, B, C) ->
|
|
{A-2*B+2*C, 2*A-B+2*C, 2*A-2*B+3*C}.
|
|
t2(A, B, C) ->
|
|
{A+2*B+2*C, 2*A+B+2*C, 2*A+2*B+3*C}.
|
|
t3(A, B, C) ->
|
|
{2*B+2*C-A, B+2*C-2*A, 2*B+3*C-2*A}.
|
|
|
|
%% Generation of triples
|
|
count_triples(A, B, C, Tot_acc, Cnt_acc, Max_perimeter) when (A+B+C) =< Max_perimeter ->
|
|
Tot1 = Tot_acc + Max_perimeter div (A+B+C),
|
|
{A1, B1, C1} = t1(A, B, C),
|
|
{Tot2, Cnt2} = count_triples(A1, B1, C1, Tot1, Cnt_acc+1, Max_perimeter),
|
|
|
|
{A2, B2, C2} = t2(A, B, C),
|
|
{Tot3, Cnt3} = count_triples(A2, B2, C2, Tot2, Cnt2, Max_perimeter),
|
|
|
|
{A3, B3, C3} = t3(A, B, C),
|
|
{Tot4, Cnt4} = count_triples(A3, B3, C3, Tot3, Cnt3, Max_perimeter),
|
|
{Tot4, Cnt4};
|
|
count_triples(_A, _B, _C, Tot_acc, Cnt_acc, _Max_perimeter) ->
|
|
{Tot_acc, Cnt_acc}.
|
|
|
|
count_triples(A, B, C, Pow) ->
|
|
Max = trunc(math:pow(10, Pow)),
|
|
{Tot, Prim} = count_triples(A, B, C, 0, 0, Max),
|
|
{Pow, Tot, Prim}.
|
|
|
|
count_triples(Pow) ->
|
|
count_triples(3, 4, 5, Pow).
|
|
|
|
%% Display a single result.
|
|
display_result({Pow, Tot, Prim}) ->
|
|
io:format("Up to 10 ** ~w : ~w triples, ~w primitives~n", [Pow, Tot, Prim]).
|
|
|
|
main(Max) ->
|
|
L = lists:seq(1, Max),
|
|
Answer = lists:map(fun(X) -> count_triples(X) end, L),
|
|
lists:foreach(fun(Result) -> display_result(Result) end, Answer).
|