From 8a123b99e524f45534905c01e47fb845ac7ec227 Mon Sep 17 00:00:00 2001 From: Steven Qu Date: Thu, 14 May 2020 14:56:29 -0400 Subject: [PATCH 1/5] improved prime number generator to check only up to sqrt(n) instead of n --- maths/prime_numbers.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/maths/prime_numbers.py b/maths/prime_numbers.py index f9325996500c..f3a94d090fa2 100644 --- a/maths/prime_numbers.py +++ b/maths/prime_numbers.py @@ -1,4 +1,5 @@ from typing import Generator +import math def primes(max: int) -> Generator[int, None, None]: @@ -21,7 +22,9 @@ def primes(max: int) -> Generator[int, None, None]: """ numbers: Generator = (i for i in range(1, (max + 1))) for i in (n for n in numbers if n > 1): - for j in range(2, i): + # only need to check for factors up to sqrt(i) + bound = int(math.sqrt(i))+1 + for j in range(2, bound): if (i % j) == 0: break else: From 33e375dd7f965affb48fdea0ae5f0ad5b7ec86b5 Mon Sep 17 00:00:00 2001 From: Steven Qu Date: Thu, 14 May 2020 17:45:13 -0400 Subject: [PATCH 2/5] added old version as slow_primes() and named new, faster version primes() --- maths/prime_numbers.py | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/maths/prime_numbers.py b/maths/prime_numbers.py index f3a94d090fa2..4758a1c9b312 100644 --- a/maths/prime_numbers.py +++ b/maths/prime_numbers.py @@ -2,6 +2,33 @@ import math +def slow_primes(max: int) -> Generator[int, None, None]: + """ + Return a list of all primes numbers up to max. + >>> list(primes(0)) + [] + >>> list(primes(-1)) + [] + >>> list(primes(-10)) + [] + >>> list(primes(25)) + [2, 3, 5, 7, 11, 13, 17, 19, 23] + >>> list(primes(11)) + [2, 3, 5, 7, 11] + >>> list(primes(33)) + [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31] + >>> list(primes(10000))[-1] + 9973 + """ + numbers: Generator = (i for i in range(1, (max + 1))) + for i in (n for n in numbers if n > 1): + for j in range(2, i): + if (i % j) == 0: + break + else: + yield i + + def primes(max: int) -> Generator[int, None, None]: """ Return a list of all primes numbers up to max. @@ -23,7 +50,7 @@ def primes(max: int) -> Generator[int, None, None]: numbers: Generator = (i for i in range(1, (max + 1))) for i in (n for n in numbers if n > 1): # only need to check for factors up to sqrt(i) - bound = int(math.sqrt(i))+1 + bound = int(math.sqrt(i)) + 1 for j in range(2, bound): if (i % j) == 0: break From f7fb16ecda6995fec5ca9ee0d64823ae9ba0bf62 Mon Sep 17 00:00:00 2001 From: Steven Qu Date: Thu, 14 May 2020 17:53:10 -0400 Subject: [PATCH 3/5] fixed docstring in slow_primes --- maths/prime_numbers.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/maths/prime_numbers.py b/maths/prime_numbers.py index 4758a1c9b312..7264d6f709ca 100644 --- a/maths/prime_numbers.py +++ b/maths/prime_numbers.py @@ -5,19 +5,19 @@ def slow_primes(max: int) -> Generator[int, None, None]: """ Return a list of all primes numbers up to max. - >>> list(primes(0)) + >>> list(slow_primes(0)) [] - >>> list(primes(-1)) + >>> list(slow_primes(-1)) [] - >>> list(primes(-10)) + >>> list(slow_primes(-10)) [] - >>> list(primes(25)) + >>> list(slow_primes(25)) [2, 3, 5, 7, 11, 13, 17, 19, 23] - >>> list(primes(11)) + >>> list(slow_primes(11)) [2, 3, 5, 7, 11] - >>> list(primes(33)) + >>> list(slow_primes(33)) [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31] - >>> list(primes(10000))[-1] + >>> list(slow_primes(10000))[-1] 9973 """ numbers: Generator = (i for i in range(1, (max + 1))) From a6946153e9c7ec261f82833bb29a4a98d2177e95 Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Fri, 15 May 2020 00:11:04 +0200 Subject: [PATCH 4/5] Add a timeit benchmark --- maths/prime_numbers.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/maths/prime_numbers.py b/maths/prime_numbers.py index 7264d6f709ca..8c4b3ae9b3eb 100644 --- a/maths/prime_numbers.py +++ b/maths/prime_numbers.py @@ -62,3 +62,9 @@ def primes(max: int) -> Generator[int, None, None]: number = int(input("Calculate primes up to:\n>> ").strip()) for ret in primes(number): print(ret) + + # Let's benchmark them side-by-side... + from timeit import timeit + print(timeit("slow_primes(1_000_000)", setup="from __main__ import slow_primes")) + print(timeit("primes(1_000_000)", setup="from __main__ import primes")) + From de8da46f5e40ab6b2d5432d046b1d521a1cf8324 Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Fri, 15 May 2020 00:33:05 +0200 Subject: [PATCH 5/5] Update prime_numbers.py --- maths/prime_numbers.py | 1 - 1 file changed, 1 deletion(-) diff --git a/maths/prime_numbers.py b/maths/prime_numbers.py index 8c4b3ae9b3eb..9aedf6864b0e 100644 --- a/maths/prime_numbers.py +++ b/maths/prime_numbers.py @@ -67,4 +67,3 @@ def primes(max: int) -> Generator[int, None, None]: from timeit import timeit print(timeit("slow_primes(1_000_000)", setup="from __main__ import slow_primes")) print(timeit("primes(1_000_000)", setup="from __main__ import primes")) -