TheAlgorithms/Python · error · TypeError

Input value must be a positive integer. Input value: {number

Error message

Input value must be a positive integer. Input value: {number}

What it means

Raised by is_germain_prime in maths/germain_primes.py when number is not an int or is less than 1. A Germain prime check (p and 2p+1 both prime) is only defined for positive integers, so the combined guard raises TypeError with the offending value interpolated into the message. Note the message says 'positive integer' but the exception type is TypeError even for the negative-int case.

Source

Thrown at maths/germain_primes.py:36

    True
    >>> is_germain_prime(11)
    True
    >>> is_germain_prime(4)
    False
    >>> is_germain_prime(23)
    True
    >>> is_germain_prime(13)
    False
    >>> is_germain_prime(20)
    False
    >>> is_germain_prime('abc')
    Traceback (most recent call last):
        ...
    TypeError: Input value must be a positive integer. Input value: abc
    """
    if not isinstance(number, int) or number < 1:
        msg = f"Input value must be a positive integer. Input value: {number}"
        raise TypeError(msg)

    return is_prime(number) and is_prime(2 * number + 1)


def is_safe_prime(number: int) -> bool:
    """Checks if input number and (number - 1)/2 are prime.
    The smallest safe prime is 5, with the Germain prime is 2.

    >>> is_safe_prime(5)
    True
    >>> is_safe_prime(11)
    True
    >>> is_safe_prime(1)
    False
    >>> is_safe_prime(2)
    False
    >>> is_safe_prime(3)
    False

View on GitHub (pinned to f5988cc097)

Solutions

  1. Convert inputs to int and check >= 1 before calling.
  2. Start candidate loops at 2 (primes) rather than 0 or 1.
  3. For numpy integers, convert with int(x) first.

Example fix

// before
result = is_germain_prime(candidate)  # candidate may be str/float/0

// after
if not isinstance(candidate, int) or candidate < 1:
    candidate = int(candidate)
result = is_germain_prime(candidate)
Defensive patterns

Strategy: type-guard

Validate before calling

if not isinstance(number, int):
    number = int(number)
if number < 1:
    raise ValueError(f"need positive integer, got {number}")

Type guard

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

Try / catch

try:
    is_germain_prime(n)
except TypeError as e:
    # message embeds the bad value; log and reject
    ...

Prevention

When it happens

Trigger: Calling is_germain_prime('abc'), is_germain_prime(0), is_germain_prime(-7), or is_germain_prime(13.0). The single 'if not isinstance(number, int) or number < 1' check covers all of these.

Common situations: Passing parsed string input from CLI/web; floats from numeric libraries (numpy int64 also fails isinstance(x, int) on some platforms); probing 0 or negatives when enumerating candidates from 0.

Related errors


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