Skip to content
Open
Show file tree
Hide file tree
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
35 changes: 35 additions & 0 deletions src/prime_checker.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
def is_prime(number: int) -> bool:
"""
Check if a given number is prime.

Args:
number (int): The number to check for primality.

Returns:
bool: True if the number is prime, False otherwise.

Raises:
ValueError: If the input is not an integer.
"""
# Check for invalid input
if not isinstance(number, int):
raise ValueError("Input must be an integer")

# Handle edge cases
if number < 2:
return False

# Optimization for small numbers
if number == 2:
return True

# Even numbers greater than 2 are not prime
if number % 2 == 0:
return False

# Check odd divisors up to the square root of the number
for divisor in range(3, int(number**0.5) + 1, 2):
if number % divisor == 0:
return False

return True
50 changes: 50 additions & 0 deletions tests/test_prime_checker.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import pytest
from src.prime_checker import is_prime

def test_is_prime_small_primes():
"""Test small known prime numbers."""
assert is_prime(2) == True
assert is_prime(3) == True
assert is_prime(5) == True
assert is_prime(7) == True
assert is_prime(11) == True
assert is_prime(13) == True

def test_is_prime_small_composites():
"""Test small known composite numbers."""
assert is_prime(1) == False
assert is_prime(4) == False
assert is_prime(6) == False
assert is_prime(8) == False
assert is_prime(9) == False
assert is_prime(10) == False
assert is_prime(12) == False

def test_is_prime_larger_numbers():
"""Test larger prime and composite numbers."""
assert is_prime(17) == True
assert is_prime(19) == True
assert is_prime(23) == True
assert is_prime(29) == True

assert is_prime(15) == False
assert is_prime(21) == False
assert is_prime(25) == False
assert is_prime(27) == False

def test_is_prime_edge_cases():
"""Test edge cases."""
assert is_prime(0) == False
assert is_prime(1) == False
assert is_prime(-1) == False
assert is_prime(-2) == False
assert is_prime(-17) == False

def test_is_prime_invalid_input():
"""Test handling of invalid input types."""
with pytest.raises(ValueError):
is_prime(3.14)
with pytest.raises(ValueError):
is_prime("17")
with pytest.raises(ValueError):
is_prime(None)