{"record":{"id":"1a1304624d7bf2e1","repo":"TheAlgorithms/Python","slug":"input-value-must-be-a-positive-integer-input-valu","errorCode":null,"errorMessage":"Input value must be a positive integer. Input value: {number}","messagePattern":"Input value must be a positive integer\\. Input value: (.+?)","errorType":"exception","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"maths/germain_primes.py","lineNumber":36,"sourceCode":"    True\n    >>> is_germain_prime(11)\n    True\n    >>> is_germain_prime(4)\n    False\n    >>> is_germain_prime(23)\n    True\n    >>> is_germain_prime(13)\n    False\n    >>> is_germain_prime(20)\n    False\n    >>> is_germain_prime('abc')\n    Traceback (most recent call last):\n        ...\n    TypeError: Input value must be a positive integer. Input value: abc\n    \"\"\"\n    if not isinstance(number, int) or number < 1:\n        msg = f\"Input value must be a positive integer. Input value: {number}\"\n        raise TypeError(msg)\n\n    return is_prime(number) and is_prime(2 * number + 1)\n\n\ndef is_safe_prime(number: int) -> bool:\n    \"\"\"Checks if input number and (number - 1)/2 are prime.\n    The smallest safe prime is 5, with the Germain prime is 2.\n\n    >>> is_safe_prime(5)\n    True\n    >>> is_safe_prime(11)\n    True\n    >>> is_safe_prime(1)\n    False\n    >>> is_safe_prime(2)\n    False\n    >>> is_safe_prime(3)\n    False","sourceCodeStart":18,"sourceCodeEnd":54,"githubUrl":"https://github.com/TheAlgorithms/Python/blob/f5988cc09713315817df6a7e327e258013a94440/maths/germain_primes.py#L18-L54","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Convert inputs to int and check >= 1 before calling.","Start candidate loops at 2 (primes) rather than 0 or 1.","For numpy integers, convert with int(x) first."],"exampleFix":"// before\nresult = is_germain_prime(candidate)  # candidate may be str/float/0\n\n// after\nif not isinstance(candidate, int) or candidate < 1:\n    candidate = int(candidate)\nresult = is_germain_prime(candidate)","handlingStrategy":"type-guard","validationCode":"if not isinstance(number, int):\n    number = int(number)\nif number < 1:\n    raise ValueError(f\"need positive integer, got {number}\")","typeGuard":"def is_positive_int_strict(v) -> bool:\n    return isinstance(v, int) and not isinstance(v, bool) and v >= 1","tryCatchPattern":"try:\n    is_germain_prime(n)\nexcept TypeError as e:\n    # message embeds the bad value; log and reject\n    ...","preventionTips":["Normalize to int at input boundaries","Start prime-enumeration loops at 2"],"tags":["math","primes","germain","validation","typeerror"],"backgroundTag":null,"analyzedSha":"f5988cc09713315817df6a7e327e258013a94440","analyzedAt":"2026-08-14T17:30:07.041Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}