Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions DIRECTORY.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down
79 changes: 79 additions & 0 deletions maths/pell_number.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
def pell_number_iterative(subscript: int) -> int:
"""
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)

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(subscript, int):
raise ValueError("The input must be an integer.")

if subscript < 0:
raise ValueError("The input number must be non-negative.")

if subscript in (0, 1):
return subscript

prev_prev_num = 0
prev_num = 1

for _ in range(2, subscript + 1):
temp = 2 * prev_num + prev_prev_num
prev_prev_num = prev_num
prev_num = temp

return prev_num


def pell_number_recursive(subscript: int) -> int:
"""
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
>>> 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(subscript, int):
raise ValueError("The input must be an integer.")

if subscript < 0:
raise ValueError("The input number must be non-negative.")

if subscript in (0, 1):
return subscript

return 2 * pell_number_recursive(subscript - 1) + pell_number_recursive(
subscript - 2
)
Loading