diff --git a/run.sh b/run.sh index d9ccfb5..fa6bc9f 100755 --- a/run.sh +++ b/run.sh @@ -125,7 +125,17 @@ sleep 5 # cpu cool down python3 ./src/prime.py echo "" +echo "*-------------- erlang ---------------*" +erl -eval 'erlang:display(erlang:system_info(otp_release)), halt().' -noshell +erlc -o src ./src/prime.erl +sleep 5 + +erl -pa src -noshell -s prime main -s init stop + +rm ./src/prime.beam +echo "" +echo "" echo "*------------ Php -------------*" @@ -143,4 +153,3 @@ sleep 5 # cpu cool down Rscript ./src/prime.R echo "" - diff --git a/src/prime.erl b/src/prime.erl new file mode 100644 index 0000000..67e259d --- /dev/null +++ b/src/prime.erl @@ -0,0 +1,30 @@ +-module(prime). +-export([is_prime/1, main/0]). + +is_prime(N) when N =< 1 -> + false; +is_prime(N) -> + is_prime_helper(N, 2, round(math:sqrt(N))). + +is_prime_helper(_, I, End) when I > End -> + true; +is_prime_helper(N, I, End) -> + case N rem I of + 0 -> false; + _ -> is_prime_helper(N, I + 1, End) + end. + +main() -> + Start = erlang:system_time(millisecond), + C = count_primes(0, 9000000, 0), + io:format("~p~n", [C]), + End = erlang:system_time(millisecond), + io:format("~pms~n", [End - Start]). + +count_primes(I, Max, C) when I < Max -> + case is_prime(I) of + true -> count_primes(I + 1, Max, C + 1); + false -> count_primes(I + 1, Max, C) + end; +count_primes(_, _, C) -> + C. diff --git a/src/prime.go b/src/prime.go index bf14248..0609ac0 100644 --- a/src/prime.go +++ b/src/prime.go @@ -1,34 +1,41 @@ package main import ( - "fmt" - "math" - "time" + "fmt" + "math" + "time" ) func isPrime(n int) bool { - if n <= 1 { - return false - } + if n <= 1 { + return false + } - end := int(math.Sqrt(float64(n))) - for i := 2; i <= end; i++ { - if n%i == 0 { - return false - } - } - return true + if n == 2 || n == 3 { + return true + } + if n%2 == 0 { + return false + } + + end := int(math.Sqrt(float64(n))) + for i := 3; i <= end; i += 2 { + if n%i == 0 { + return false + } + } + return true } func main() { - start := float64(time.Now(). UnixMilli()) - c := 0 - for i := 0; i < 9000000; i++ { - if isPrime(i) { - c++ - } - } - fmt.Println(c) - end := float64(time.Now().UnixMilli()) - fmt.Printf("%vms", end-start) + start := time.Now() + c := 0 + for i := 0; i < 9000000; i++ { + if isPrime(i) { + c++ + } + } + fmt.Println(c) + elapsed := time.Since(start) + fmt.Printf("%vms", elapsed.Milliseconds()) }