diff --git a/maths/next_prime_number.py b/maths/next_prime_number.py new file mode 100644 index 000000000000..00d15839eca8 --- /dev/null +++ b/maths/next_prime_number.py @@ -0,0 +1,80 @@ +""" +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.")