TheAlgorithms/Python · error · ValueError

Input value of [number={number}] must be a positive integer

Error message

Input value of [number={number}] must be a positive integer

What it means

Raised by juggler_sequence in maths/juggler_sequence.py when number is an int but less than 1. The sequence terminates when number reaches 1; starting at 0 or a negative value would never reach 1 (floor(sqrt(n)) for n <= 0 stays <= 0 or errors), causing an infinite loop. The ValueError guard sits after the type check and before sequence construction.

Source

Thrown at maths/juggler_sequence.py:47

    >>> juggler_sequence(10)
    [10, 3, 5, 11, 36, 6, 2, 1]
    >>> juggler_sequence(25)
    [25, 125, 1397, 52214, 228, 15, 58, 7, 18, 4, 2, 1]
    >>> juggler_sequence(6.0)
    Traceback (most recent call last):
        ...
    TypeError: Input value of [number=6.0] must be an integer
    >>> juggler_sequence(-1)
    Traceback (most recent call last):
        ...
    ValueError: Input value of [number=-1] must be a positive integer
    """
    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 a positive integer"
        raise ValueError(msg)
    sequence = [number]
    while number != 1:
        if number % 2 == 0:
            number = math.floor(math.sqrt(number))
        else:
            number = math.floor(
                math.sqrt(number) * math.sqrt(number) * math.sqrt(number)
            )
        sequence.append(number)
    return sequence


if __name__ == "__main__":
    import doctest

    doctest.testmod()

View on GitHub (pinned to f5988cc097)

Solutions

  1. Start iteration ranges at 1: for n in range(1, limit + 1).
  2. Bound user input: reject or clamp values < 1 before calling.
  3. If 0 must be handled, decide a policy (skip or raise your own error) rather than passing it through.

Example fix

// before
seq = juggler_sequence(start - 1)  # start=1 -> juggler_sequence(0)

// after
start = max(1, start)
seq = juggler_sequence(start)
Defensive patterns

Strategy: validation

Validate before calling

if number < 1:
    raise ValueError(f"juggler_sequence needs number >= 1, got {number}")
seq = juggler_sequence(number)

Type guard

def is_positive_int(v) -> bool:
    return isinstance(v, int) and not isinstance(v, bool) and v >= 1

Try / catch

try:
    seq = juggler_sequence(n)
except ValueError:
    n = max(1, n)
    seq = juggler_sequence(n)

Prevention

When it happens

Trigger: Calling juggler_sequence(0) or juggler_sequence(-1). The 'if number < 1' branch raises immediately; 1 itself is valid and returns [1].

Common situations: Looping over ranges that start at 0; offsets/subtractions producing 0 or negatives; user-supplied indices not bounded to >= 1.

Related errors


AI-assisted analysis of TheAlgorithms/Python@f5988cc097 (2026-08-14). Data as JSON: /api/errors/9a993eed59e714a1. Report an issue: GitHub.