Skip to content

Commit

Permalink
Add Proth number to maths (TheAlgorithms#5246)
Browse files Browse the repository at this point in the history
* Add Proth number to maths

* Add test for 0 and more informative output

* Fixing test failure issue - unused variable

* Update proth_number.py

Co-authored-by: Christian Clauss <[email protected]>
  • Loading branch information
jrinder42 and cclauss authored Oct 14, 2021
1 parent bb37ebb commit 618f9ca
Showing 1 changed file with 77 additions and 0 deletions.
77 changes: 77 additions & 0 deletions maths/proth_number.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
"""
Calculate the nth Proth number
Source:
https://handwiki.org/wiki/Proth_number
"""

import math


def proth(number: int) -> int:
"""
:param number: nth number to calculate in the sequence
:return: the nth number in Proth number
Note: indexing starts at 1 i.e. proth(1) gives the first Proth number of 3
>>> proth(6)
25
>>> proth(0)
Traceback (most recent call last):
...
ValueError: Input value of [number=0] must be > 0
>>> proth(-1)
Traceback (most recent call last):
...
ValueError: Input value of [number=-1] must be > 0
>>> proth(6.0)
Traceback (most recent call last):
...
TypeError: Input value of [number=6.0] must be an integer
"""

if not isinstance(number, int):
raise TypeError(f"Input value of [number={number}] must be an integer")

if number < 1:
raise ValueError(f"Input value of [number={number}] must be > 0")
elif number == 1:
return 3
elif number == 2:
return 5
else:
block_index = number // 3
"""
+1 for binary starting at 0 i.e. 2^0, 2^1, etc.
+1 to start the sequence at the 3rd Proth number
Hence, we have a +2 in the below statement
"""
block_index = math.log(block_index, 2) + 2
block_index = int(block_index)

proth_list = [3, 5]
proth_index = 2
increment = 3
for block in range(1, block_index):
for move in range(increment):
proth_list.append(2 ** (block + 1) + proth_list[proth_index - 1])
proth_index += 1
increment *= 2

return proth_list[number - 1]


if __name__ == "__main__":
for number in range(11):
value = 0
try:
value = proth(number)
except ValueError:
print(f"ValueError: there is no {number}th Proth number")
continue

print(f"The {number}th Proth number: {value}")

0 comments on commit 618f9ca

Please sign in to comment.