From 9fb2fe18ccb793b31a1118ab68f00190ee3c11f3 Mon Sep 17 00:00:00 2001 From: "Ivan I. Ovchinnikov" Date: Mon, 13 Feb 2023 12:14:07 +0300 Subject: [PATCH] wip1 mobius --- src/mobius.erl | 48 ++++++++++++++++++++++++++++++++++++++++++++ test/mobius_test.erl | 24 ++++++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 src/mobius.erl create mode 100644 test/mobius_test.erl diff --git a/src/mobius.erl b/src/mobius.erl new file mode 100644 index 0000000..9c502f0 --- /dev/null +++ b/src/mobius.erl @@ -0,0 +1,48 @@ +%%%------------------------------------------------------------------- +%%% @author ivan-igorevich +%%% @copyright (C) 2023, self +%%% @doc +%%% +%%% @end +%%% Created : 13. Feb 2023 8:49 AM +%%%------------------------------------------------------------------- +-module(mobius). +-author("ivan-igorevich"). + +%% API +-export([is_prime/1, prime_factors/1, say/0]). + +%% region is_prime +is_prime(N) when N < 2 -> + false; +is_prime(N) -> + is_prime(N, 2, trunc(math:sqrt(N)) + 1). + +is_prime(_, Max, Max) -> + true; +is_prime(N, I, Max) -> + if + N rem I =:= 0 -> + false; + true -> + is_prime(N, I + 1, Max) + end. +%% endregion + +%region factor +prime_factors(N) -> + prime_factors(N, 2, []). + +prime_factors(X, N, Primes) when X rem N == 0 -> + prime_factors(trunc(X / N), 2, [N | Primes]); +prime_factors(X, N, Primes) -> + case N < math:sqrt(X) + 1 of + true -> + prime_factors(X, N + 1, Primes); + false -> + [X | Primes] + end. +%endregion + +say() -> io:format("The result is: ~p~n", [prime_factors(111)]). + diff --git a/test/mobius_test.erl b/test/mobius_test.erl new file mode 100644 index 0000000..0f54d66 --- /dev/null +++ b/test/mobius_test.erl @@ -0,0 +1,24 @@ +%%%------------------------------------------------------------------- +%%% @author ivan-igorevich +%%% @copyright (C) 2023, self +%%% @doc +%%% +%%% @end +%%% Created : 13. Feb 2023 9:03 AM +%%%------------------------------------------------------------------- +-module(mobius_test). +-include_lib("eunit/include/eunit.hrl"). + +mobius_test_() -> [ + {"Test is_prime", fun test_is_prime/0} +]. + +test_is_prime() -> + ?assertNot(mobius:is_prime(1)), + ?assert(mobius:is_prime(2)), + ?assert(mobius:is_prime(3)), + ?assertNot(mobius:is_prime(58)), + ?assert(mobius:is_prime(59)), + ?assertNot(mobius:is_prime(60)), + ?assertNot(mobius:is_prime(112)), + ?assert(mobius:is_prime(113)).