Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 80 additions & 0 deletions maths/next_prime_number.py
Original file line number Diff line number Diff line change
@@ -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.")