Я пытаюсь создать разложение простых чисел, используя метод fermats .
Эта строка выдает ошибку
find_factors(A, B, FactorThis) when is_a_square(B) == true ->
вызов локальной / импортированной функции is_a_square / 1 недопустим в охране
Единственная возможная альтернатива, которую я вижу этой реализации, состоит в том, чтобы использовать какой-либо оператор case в функции. Я избегал этого, поскольку это могло бы испортить хвостовую рекурсию. Я эрланг нуб. Какие есть еще способы реализовать эту функцию?
get_int_part_of_sqrt(N) ->
trunc(math:sqrt(N)).
is_a_square(N) ->
get_int_part_of_sqrt(N) * get_int_part_of_sqrt(N) == N.
calculate_new_b(A, FactorThis) ->
NewB = trunc(abs((A * A) - FactorThis)),
io:format("Calculate_new_b A^2 ~w- FT ~w= NB ~w ~n",[A*A,FactorThis,NewB]),
find_factors(A, B, FactorThis) when is_a_square(B) == true ->
io:format("find_factors true ~w ~w~n", [A, B]),
{ok, A + get_int_part_of_sqrt(B), A - get_int_part_of_sqrt(B)};
find_factors(A, B, FactorThis) ->
io:format("find_factors false ~w ~w~n", [A, B]),
NewA = A + 1,
NewB = calculate_new_b(NewA, FactorThis),
find_factors(NewA, NewB, FactorThis).
Исследования1
Исследования2
Под ред.
исправлен аргумент в вызове Calculate_New_b
добавлено пропущенное get_int_part_of_sqrts.