calculate the nth proth number source https handwiki orgwikiprothnumber param number nth number to calculate in the sequence return the nth number in proth number note indexing starts at 1 i e proth1 gives the first proth number of 3 proth6 25 proth0 traceback most recent call last valueerror input value of number0 must be 0 proth1 traceback most recent call last valueerror input value of number1 must be 0 proth6 0 traceback most recent call last typeerror input value of number6 0 must be an integer 1 for binary starting at 0 i e 20 21 etc 1 to start the sequence at the 3rd proth number hence we have a 2 in the below statement 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 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
import math


def proth(number: int) -> int:
    

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

    if number < 1:
        msg = f"Input value of [number={number}] must be > 0"
        raise ValueError(msg)
    elif number == 1:
        return 3
    elif number == 2:
        return 5
    else:
        
        block_index = int(math.log(number // 3, 2)) + 2

        proth_list = [3, 5]
        proth_index = 2
        increment = 3
        for block in range(1, block_index):
            for _ 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__":
    import doctest

    doctest.testmod()

    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}")