From ad217c66165898d62b76cc89ba09c2d7049b6448 Mon Sep 17 00:00:00 2001 From: quant12345 Date: Fri, 29 Sep 2023 17:50:16 +0500 Subject: [PATCH 01/16] Replacing the generator with numpy vector operations from lu_decomposition. --- arithmetic_analysis/lu_decomposition.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/arithmetic_analysis/lu_decomposition.py b/arithmetic_analysis/lu_decomposition.py index eaabce5449c5..094b20abfecc 100644 --- a/arithmetic_analysis/lu_decomposition.py +++ b/arithmetic_analysis/lu_decomposition.py @@ -88,15 +88,19 @@ def lower_upper_decomposition(table: np.ndarray) -> tuple[np.ndarray, np.ndarray lower = np.zeros((rows, columns)) upper = np.zeros((rows, columns)) + + # in 'total', the necessary data is extracted through slices + # and the sum of the products is obtained. + for i in range(columns): for j in range(i): - total = sum(lower[i][k] * upper[k][j] for k in range(j)) + total = np.sum(lower[i, :i] * upper[:i, j]) if upper[j][j] == 0: raise ArithmeticError("No LU decomposition exists") lower[i][j] = (table[i][j] - total) / upper[j][j] lower[i][i] = 1 for j in range(i, columns): - total = sum(lower[i][k] * upper[k][j] for k in range(j)) + total = np.sum(lower[i, :i] * upper[:i, j]) upper[i][j] = table[i][j] - total return lower, upper From 07dfc067e475f36ddce1549f33197f15f65f59d1 Mon Sep 17 00:00:00 2001 From: quant12345 Date: Fri, 29 Sep 2023 17:53:57 +0500 Subject: [PATCH 02/16] Revert "Replacing the generator with numpy vector operations from lu_decomposition." This reverts commit ad217c66165898d62b76cc89ba09c2d7049b6448. --- arithmetic_analysis/lu_decomposition.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/arithmetic_analysis/lu_decomposition.py b/arithmetic_analysis/lu_decomposition.py index 094b20abfecc..eaabce5449c5 100644 --- a/arithmetic_analysis/lu_decomposition.py +++ b/arithmetic_analysis/lu_decomposition.py @@ -88,19 +88,15 @@ def lower_upper_decomposition(table: np.ndarray) -> tuple[np.ndarray, np.ndarray lower = np.zeros((rows, columns)) upper = np.zeros((rows, columns)) - - # in 'total', the necessary data is extracted through slices - # and the sum of the products is obtained. - for i in range(columns): for j in range(i): - total = np.sum(lower[i, :i] * upper[:i, j]) + total = sum(lower[i][k] * upper[k][j] for k in range(j)) if upper[j][j] == 0: raise ArithmeticError("No LU decomposition exists") lower[i][j] = (table[i][j] - total) / upper[j][j] lower[i][i] = 1 for j in range(i, columns): - total = np.sum(lower[i, :i] * upper[:i, j]) + total = sum(lower[i][k] * upper[k][j] for k in range(j)) upper[i][j] = table[i][j] - total return lower, upper From 961e92a8852b22e3ad02eba91a0636c3265872ad Mon Sep 17 00:00:00 2001 From: quant12345 Date: Sat, 7 Oct 2023 01:35:05 +0500 Subject: [PATCH 03/16] Added doctests. --- maths/segmented_sieve.py | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/maths/segmented_sieve.py b/maths/segmented_sieve.py index e950a83b752a..b5f714f1f31e 100644 --- a/maths/segmented_sieve.py +++ b/maths/segmented_sieve.py @@ -4,7 +4,22 @@ def sieve(n: int) -> list[int]: - """Segmented Sieve.""" + """ + Segmented Sieve. + + Examples: + >>> sieve(2**3) + [2, 3, 5, 7] + + >>> sieve(3**3) + [2, 3, 5, 7, 11, 13, 17, 19, 23] + + >>> sieve() + Traceback (most recent call last): + ... + TypeError: sieve() missing 1 required positional argument: 'n' + + """ in_prime = [] start = 2 end = int(math.sqrt(n)) # Size of every segment @@ -42,4 +57,9 @@ def sieve(n: int) -> list[int]: return prime -print(sieve(10**6)) +if __name__ == "__main__": + import doctest + + doctest.testmod() + + print(sieve(10**6)) From 9b5940422304d2d34874762472e20fe6a17b7241 Mon Sep 17 00:00:00 2001 From: Kamil <32775019+quant12345@users.noreply.github.com> Date: Sat, 7 Oct 2023 01:55:28 +0500 Subject: [PATCH 04/16] Update segmented_sieve.py Removed unnecessary check. --- maths/segmented_sieve.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/maths/segmented_sieve.py b/maths/segmented_sieve.py index b5f714f1f31e..a3b597dbab88 100644 --- a/maths/segmented_sieve.py +++ b/maths/segmented_sieve.py @@ -14,11 +14,6 @@ def sieve(n: int) -> list[int]: >>> sieve(3**3) [2, 3, 5, 7, 11, 13, 17, 19, 23] - >>> sieve() - Traceback (most recent call last): - ... - TypeError: sieve() missing 1 required positional argument: 'n' - """ in_prime = [] start = 2 From 10a46e783f8f824956b83bd48a7a638f019b275f Mon Sep 17 00:00:00 2001 From: Kamil <32775019+quant12345@users.noreply.github.com> Date: Sat, 7 Oct 2023 02:22:10 +0500 Subject: [PATCH 05/16] Update segmented_sieve.py Added checks for 0 and negative numbers. --- maths/segmented_sieve.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/maths/segmented_sieve.py b/maths/segmented_sieve.py index a3b597dbab88..be4131338ead 100644 --- a/maths/segmented_sieve.py +++ b/maths/segmented_sieve.py @@ -8,13 +8,22 @@ def sieve(n: int) -> list[int]: Segmented Sieve. Examples: - >>> sieve(2**3) + >>> sieve(8) [2, 3, 5, 7] - >>> sieve(3**3) + >>> sieve(27) [2, 3, 5, 7, 11, 13, 17, 19, 23] """ + + if n < 0: + word = f"Number should not be negative n {n}" + raise ValueError(word) + + if n == 0: + word = f"Number should not be zero n {n}" + raise ValueError(word) + in_prime = [] start = 2 end = int(math.sqrt(n)) # Size of every segment From 587cdc213d7e4fc8ce29437370a81a66b752c1a1 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 6 Oct 2023 21:23:17 +0000 Subject: [PATCH 06/16] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- maths/segmented_sieve.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maths/segmented_sieve.py b/maths/segmented_sieve.py index be4131338ead..bab3167c32f6 100644 --- a/maths/segmented_sieve.py +++ b/maths/segmented_sieve.py @@ -23,7 +23,7 @@ def sieve(n: int) -> list[int]: if n == 0: word = f"Number should not be zero n {n}" raise ValueError(word) - + in_prime = [] start = 2 end = int(math.sqrt(n)) # Size of every segment From 3df701a16cf26e50a6b272a514e9bfdd77f943ca Mon Sep 17 00:00:00 2001 From: Kamil <32775019+quant12345@users.noreply.github.com> Date: Sat, 7 Oct 2023 03:31:32 +0500 Subject: [PATCH 07/16] Update segmented_sieve.py --- maths/segmented_sieve.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maths/segmented_sieve.py b/maths/segmented_sieve.py index bab3167c32f6..6a5ccc45276d 100644 --- a/maths/segmented_sieve.py +++ b/maths/segmented_sieve.py @@ -66,4 +66,4 @@ def sieve(n: int) -> list[int]: doctest.testmod() - print(sieve(10**6)) + print(f"{sieve(10**6) = }") From f261cba5fdce50c6b43bdc3c13ac1ce191b0aed6 Mon Sep 17 00:00:00 2001 From: Kamil <32775019+quant12345@users.noreply.github.com> Date: Sat, 7 Oct 2023 04:10:03 +0500 Subject: [PATCH 08/16] Update segmented_sieve.py Added float number check. --- maths/segmented_sieve.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/maths/segmented_sieve.py b/maths/segmented_sieve.py index 6a5ccc45276d..06c20df03b64 100644 --- a/maths/segmented_sieve.py +++ b/maths/segmented_sieve.py @@ -16,8 +16,8 @@ def sieve(n: int) -> list[int]: """ - if n < 0: - word = f"Number should not be negative n {n}" + if n < 0 or type(n) == float: + word = f"Number must be positive and integer, obtained {n}" raise ValueError(word) if n == 0: From 535fcdca1bc760aebc94416036094fc73b57a4f3 Mon Sep 17 00:00:00 2001 From: Kamil <32775019+quant12345@users.noreply.github.com> Date: Sat, 7 Oct 2023 04:14:22 +0500 Subject: [PATCH 09/16] Update segmented_sieve.py --- maths/segmented_sieve.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maths/segmented_sieve.py b/maths/segmented_sieve.py index 06c20df03b64..b05cdb1a8d73 100644 --- a/maths/segmented_sieve.py +++ b/maths/segmented_sieve.py @@ -16,7 +16,7 @@ def sieve(n: int) -> list[int]: """ - if n < 0 or type(n) == float: + if n < 0 or isinstance(n, float): word = f"Number must be positive and integer, obtained {n}" raise ValueError(word) From acbac9453b8e1f1c0360cd316ceef6807f8bcd14 Mon Sep 17 00:00:00 2001 From: Kamil <32775019+quant12345@users.noreply.github.com> Date: Sat, 7 Oct 2023 04:36:56 +0500 Subject: [PATCH 10/16] Update segmented_sieve.py simplified verification --- maths/segmented_sieve.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/maths/segmented_sieve.py b/maths/segmented_sieve.py index b05cdb1a8d73..beaa0bd2a314 100644 --- a/maths/segmented_sieve.py +++ b/maths/segmented_sieve.py @@ -16,12 +16,9 @@ def sieve(n: int) -> list[int]: """ - if n < 0 or isinstance(n, float): - word = f"Number must be positive and integer, obtained {n}" - raise ValueError(word) - - if n == 0: - word = f"Number should not be zero n {n}" + if n <= 0 or isinstance(n, float): + word = f"Number must be positive and integer + and not equal to 0, obtained {n}" raise ValueError(word) in_prime = [] From 9bacc2518f587a6d87c568eab1a8b604a6333f49 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 6 Oct 2023 23:37:20 +0000 Subject: [PATCH 11/16] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- maths/segmented_sieve.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maths/segmented_sieve.py b/maths/segmented_sieve.py index beaa0bd2a314..7fda3245d9c6 100644 --- a/maths/segmented_sieve.py +++ b/maths/segmented_sieve.py @@ -17,7 +17,7 @@ def sieve(n: int) -> list[int]: """ if n <= 0 or isinstance(n, float): - word = f"Number must be positive and integer + word = f"Number must be positive and integer and not equal to 0, obtained {n}" raise ValueError(word) From b173e6286c108c9327c01c2447631252bcb9a993 Mon Sep 17 00:00:00 2001 From: Kamil <32775019+quant12345@users.noreply.github.com> Date: Sat, 7 Oct 2023 04:40:26 +0500 Subject: [PATCH 12/16] Update segmented_sieve.py --- maths/segmented_sieve.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/maths/segmented_sieve.py b/maths/segmented_sieve.py index 7fda3245d9c6..1cfc34827620 100644 --- a/maths/segmented_sieve.py +++ b/maths/segmented_sieve.py @@ -17,8 +17,8 @@ def sieve(n: int) -> list[int]: """ if n <= 0 or isinstance(n, float): - word = f"Number must be positive and integer - and not equal to 0, obtained {n}" + word = (f"Number must be positive and integer and" + f" not equal to 0, obtained {n}") raise ValueError(word) in_prime = [] From f15758c02696fee56c0639ce271de98891adc972 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 6 Oct 2023 23:40:54 +0000 Subject: [PATCH 13/16] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- maths/segmented_sieve.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/maths/segmented_sieve.py b/maths/segmented_sieve.py index 1cfc34827620..f083f1ddab53 100644 --- a/maths/segmented_sieve.py +++ b/maths/segmented_sieve.py @@ -17,8 +17,9 @@ def sieve(n: int) -> list[int]: """ if n <= 0 or isinstance(n, float): - word = (f"Number must be positive and integer and" - f" not equal to 0, obtained {n}") + word = ( + f"Number must be positive and integer and" f" not equal to 0, obtained {n}" + ) raise ValueError(word) in_prime = [] From 8c4336cd21af8600baf9efd1eee11b86d5e84ad8 Mon Sep 17 00:00:00 2001 From: Kamil <32775019+quant12345@users.noreply.github.com> Date: Sat, 7 Oct 2023 04:45:48 +0500 Subject: [PATCH 14/16] Update segmented_sieve.py --- maths/segmented_sieve.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maths/segmented_sieve.py b/maths/segmented_sieve.py index f083f1ddab53..c9428b4f244f 100644 --- a/maths/segmented_sieve.py +++ b/maths/segmented_sieve.py @@ -18,7 +18,7 @@ def sieve(n: int) -> list[int]: if n <= 0 or isinstance(n, float): word = ( - f"Number must be positive and integer and" f" not equal to 0, obtained {n}" + f"Number must be positive, integer and not equal to 0, obtained {n}" ) raise ValueError(word) From 3de3f75c8abf48eb50bbe870a70c9c40abdb5daa Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 6 Oct 2023 23:46:21 +0000 Subject: [PATCH 15/16] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- maths/segmented_sieve.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/maths/segmented_sieve.py b/maths/segmented_sieve.py index c9428b4f244f..29b0c1200ecc 100644 --- a/maths/segmented_sieve.py +++ b/maths/segmented_sieve.py @@ -17,9 +17,7 @@ def sieve(n: int) -> list[int]: """ if n <= 0 or isinstance(n, float): - word = ( - f"Number must be positive, integer and not equal to 0, obtained {n}" - ) + word = f"Number must be positive, integer and not equal to 0, obtained {n}" raise ValueError(word) in_prime = [] From 496c9a922e7a75e98534c49b20252809c1371a6e Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Sat, 7 Oct 2023 08:32:14 +0200 Subject: [PATCH 16/16] ValueError: Number 22.2 must instead be a positive integer --- maths/segmented_sieve.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/maths/segmented_sieve.py b/maths/segmented_sieve.py index 29b0c1200ecc..125390edc588 100644 --- a/maths/segmented_sieve.py +++ b/maths/segmented_sieve.py @@ -14,11 +14,25 @@ def sieve(n: int) -> list[int]: >>> sieve(27) [2, 3, 5, 7, 11, 13, 17, 19, 23] + >>> sieve(0) + Traceback (most recent call last): + ... + ValueError: Number 0 must instead be a positive integer + + >>> sieve(-1) + Traceback (most recent call last): + ... + ValueError: Number -1 must instead be a positive integer + + >>> sieve(22.2) + Traceback (most recent call last): + ... + ValueError: Number 22.2 must instead be a positive integer """ if n <= 0 or isinstance(n, float): - word = f"Number must be positive, integer and not equal to 0, obtained {n}" - raise ValueError(word) + msg = f"Number {n} must instead be a positive integer" + raise ValueError(msg) in_prime = [] start = 2