From 2f05268c149baac05761ee3856f6d74e646d4677 Mon Sep 17 00:00:00 2001 From: Amirreza Kheradmand Date: Fri, 28 Apr 2023 11:33:55 +0330 Subject: [PATCH 1/2] improve isPrime in detection efficiency. Added checks for small primes and even numbers in isPrime function. updated timing logic to use time.Since method --- src/prime.go | 53 +++++++++++++++++++++++++++++----------------------- 1 file changed, 30 insertions(+), 23 deletions(-) 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()) } From bd460953425b156e8a072f28dc8f154b53f12db1 Mon Sep 17 00:00:00 2001 From: Amirreza Kheradmand Date: Sat, 29 Apr 2023 10:43:04 +0330 Subject: [PATCH 2/2] new language: Erlang --- run.sh | 10 ++++++++++ src/prime.erl | 30 ++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 src/prime.erl diff --git a/run.sh b/run.sh index 5756d55..4e897ba 100755 --- a/run.sh +++ b/run.sh @@ -125,4 +125,14 @@ 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 "" 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.