RedEnginePress logo
RedEnginePress
AlgorithmsLanguagesPlaygroundAbout

Next Prime Number

p
"""
Next Prime Number -- https://en.wikipedia.org/wiki/Prime_number

In the ancient city of Numeria,
legends speak of an oracle whose whispers
could bend the very fabric of mathematics.
Travelers from distant lands would bring her a number,
and in return, she would reveal its future:
the very next prime number.
Your task is to embody the oracle's wisdom.
You will be given a number.
You must find the smallest prime number
that is strictly greater than it.
"""


def is_prime(number: int) -> bool:
    """
    Check if a number is prime.

    >>> is_prime(2)
    True
    >>> is_prime(15)
    False
    >>> is_prime(19)
    True
    >>> is_prime(1)
    False
    >>> is_prime(-7)
    False
    """
    if number <= 1:
        return False
    if number <= 3:
        return True
    if number % 2 == 0 or number % 3 == 0:
        return False

    factor = 5
    while factor * factor <= number:
        if number % factor == 0 or number % (factor + 2) == 0:
            return False
        factor += 6
    return True


def next_prime(number: int) -> int:
    """
    Find the smallest prime number strictly greater than the given number.

    >>> next_prime(2)
    3
    >>> next_prime(7)
    11
    >>> next_prime(14)
    17
    >>> next_prime(0)
    2
    >>> next_prime(-10)
    2
    """
    if not isinstance(number, int):
        raise ValueError("next_prime() only accepts integral values")

    candidate = number + 1
    while not is_prime(candidate):
        candidate += 1
    return candidate


if __name__ == "__main__":
    import doctest

    doctest.testmod()

    try:
        n = int(input("Enter an integer: ").strip() or 0)
        print(f"The next prime number after {n} is {next_prime(n)}")
    except ValueError:
        print("Please enter a valid integer.")