From 497260b2b1f46338cefc3160ca210358a103c9d7 Mon Sep 17 00:00:00 2001 From: dbring Date: Thu, 12 Oct 2023 15:51:42 -0700 Subject: [PATCH 1/4] Added function that calculates Pell numbers --- maths/pell_number.py | 76 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 maths/pell_number.py diff --git a/maths/pell_number.py b/maths/pell_number.py new file mode 100644 index 000000000000..295316c30bba --- /dev/null +++ b/maths/pell_number.py @@ -0,0 +1,76 @@ +def pell_number_iterative(n: int) -> int: + """ + This function returns the nth Pell number iteratively, where n is a + non-negative integer. Pell numbers are defined by the recurrence relation: + + P_0 = 0, P_1 = 1, P_n = 2 * P_(n-1) + P_(n-2) + + https://en.wikipedia.org/wiki/Pell_number + https://oeis.org/A000129 + + >>> pell_number_iterative(0) + 0 + >>> pell_number_iterative(1) + 1 + >>> pell_number_iterative(12) + 13860 + >>> pell_number_iterative("1") + Traceback (most recent call last): + ... + ValueError: The input must be an integer. + >>> pell_number_iterative(-1) + Traceback (most recent call last): + ... + ValueError: The input number must be non-negative. + """ + if not isinstance(n, int): + raise ValueError("The input must be an integer.") + + if n < 0: + raise ValueError("The input number must be non-negative.") + + if n == 0 or n == 1: + return n + + prev_prev_num = 0 + prev_num = 1 + + for _ in range(2, n + 1): + temp = 2 * prev_num + prev_prev_num + prev_prev_num = prev_num + prev_num = temp + + return prev_num + + +def pell_number_recursive(n: int) -> int: + """ + This function calculates the nth Pell number recursively. Due to its + recursive nature, this function grows exponentially with n. For large + values of n, use pell_number_iterative instead. + + >>> pell_number_recursive(0) + 0 + >>> pell_number_recursive(1) + 1 + >>> pell_number_recursive(12) + 13860 + >>> pell_number_recursive("1") + Traceback (most recent call last): + ... + ValueError: The input must be an integer. + >>> pell_number_recursive(-1) + Traceback (most recent call last): + ... + ValueError: The input number must be non-negative. + """ + if not isinstance(n, int): + raise ValueError("The input must be an integer.") + + if n < 0: + raise ValueError("The input number must be non-negative.") + + if n == 0 or n == 1: + return n + + return 2 * pell_number_recursive(n - 1) + pell_number_recursive(n - 2) From 913257ffd7e885abc21d22d6eccb7b39393311f3 Mon Sep 17 00:00:00 2001 From: dbring Date: Thu, 12 Oct 2023 16:42:15 -0700 Subject: [PATCH 2/4] Fixed ruff error --- maths/pell_number.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/maths/pell_number.py b/maths/pell_number.py index 295316c30bba..a560cca4d43d 100644 --- a/maths/pell_number.py +++ b/maths/pell_number.py @@ -29,7 +29,7 @@ def pell_number_iterative(n: int) -> int: if n < 0: raise ValueError("The input number must be non-negative.") - if n == 0 or n == 1: + if n in (0, 1): return n prev_prev_num = 0 @@ -70,7 +70,7 @@ def pell_number_recursive(n: int) -> int: if n < 0: raise ValueError("The input number must be non-negative.") - if n == 0 or n == 1: + if n in (0, 1): return n return 2 * pell_number_recursive(n - 1) + pell_number_recursive(n - 2) From 917f037429a568da2f9e0888e43b41dadf767123 Mon Sep 17 00:00:00 2001 From: dbring Date: Fri, 13 Oct 2023 09:32:48 -0700 Subject: [PATCH 3/4] Renamed input argument to be more descriptive --- maths/pell_number.py | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/maths/pell_number.py b/maths/pell_number.py index a560cca4d43d..9e2ffc1cc10a 100644 --- a/maths/pell_number.py +++ b/maths/pell_number.py @@ -1,7 +1,8 @@ -def pell_number_iterative(n: int) -> int: +def pell_number_iterative(subscript: int) -> int: """ - This function returns the nth Pell number iteratively, where n is a - non-negative integer. Pell numbers are defined by the recurrence relation: + This function returns the `subscript`-th Pell number iteratively, where + `subscript` is a non-negative integer. Pell numbers are defined by the + recurrence relation: P_0 = 0, P_1 = 1, P_n = 2 * P_(n-1) + P_(n-2) @@ -23,19 +24,19 @@ def pell_number_iterative(n: int) -> int: ... ValueError: The input number must be non-negative. """ - if not isinstance(n, int): + if not isinstance(subscript, int): raise ValueError("The input must be an integer.") - if n < 0: + if subscript < 0: raise ValueError("The input number must be non-negative.") - if n in (0, 1): - return n + if subscript in (0, 1): + return subscript prev_prev_num = 0 prev_num = 1 - for _ in range(2, n + 1): + for _ in range(2, subscript + 1): temp = 2 * prev_num + prev_prev_num prev_prev_num = prev_num prev_num = temp @@ -43,11 +44,11 @@ def pell_number_iterative(n: int) -> int: return prev_num -def pell_number_recursive(n: int) -> int: +def pell_number_recursive(subscript: int) -> int: """ - This function calculates the nth Pell number recursively. Due to its - recursive nature, this function grows exponentially with n. For large - values of n, use pell_number_iterative instead. + This function calculates the `subscript`-th Pell number recursively. Due to + its recursive nature, this function grows exponentially with `subscript`. + For large values of `subscript`, use pell_number_iterative instead. >>> pell_number_recursive(0) 0 @@ -64,13 +65,15 @@ def pell_number_recursive(n: int) -> int: ... ValueError: The input number must be non-negative. """ - if not isinstance(n, int): + if not isinstance(subscript, int): raise ValueError("The input must be an integer.") - if n < 0: + if subscript < 0: raise ValueError("The input number must be non-negative.") - if n in (0, 1): - return n + if subscript in (0, 1): + return subscript - return 2 * pell_number_recursive(n - 1) + pell_number_recursive(n - 2) + return 2 * pell_number_recursive(subscript - 1) + pell_number_recursive( + subscript - 2 + ) From 6918b2f94853c53574ba8a47422c961fce22bd56 Mon Sep 17 00:00:00 2001 From: cclauss Date: Tue, 8 Sep 2026 12:49:53 +0000 Subject: [PATCH 4/4] updating DIRECTORY.md --- DIRECTORY.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/DIRECTORY.md b/DIRECTORY.md index 6d098f1f845a..ae36016f9e6a 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -797,6 +797,7 @@ * [Square Root](maths/numerical_analysis/square_root.py) * [Weierstrass Method](maths/numerical_analysis/weierstrass_method.py) * [Odd Sieve](maths/odd_sieve.py) + * [Pell Number](maths/pell_number.py) * [Perfect Cube](maths/perfect_cube.py) * [Perfect Number](maths/perfect_number.py) * [Perfect Square](maths/perfect_square.py) @@ -876,6 +877,7 @@ * [Two Pointer](maths/two_pointer.py) * [Two Sum](maths/two_sum.py) * [Volume](maths/volume.py) + * [Weighted Average](maths/weighted_average.py) * [Zellers Congruence](maths/zellers_congruence.py) ## [Matrix](matrix)