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
47 changes: 47 additions & 0 deletions src/prime_factorization.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
from typing import List

def prime_factorization(n: int) -> List[int]:
"""
Compute the prime factorization of a given positive integer.

Args:
n (int): The positive integer to factorize.

Returns:
List[int]: A list of prime factors in ascending order.

Raises:
ValueError: If the input is less than 1.
"""
# Validate input
if not isinstance(n, int):
raise TypeError("Input must be an integer")

if n < 1:
raise ValueError("Input must be a positive integer")

# Handle special cases
if n == 1:
return []

# Prime factorization algorithm
factors = []

# First, handle 2 as a special case to optimize odd number checking
while n % 2 == 0:
factors.append(2)
n //= 2

# Check for odd prime factors
factor = 3
while factor * factor <= n:
while n % factor == 0:
factors.append(factor)
n //= factor
factor += 2

# If n is a prime number greater than 2
if n > 2:
factors.append(n)

return factors
40 changes: 40 additions & 0 deletions tests/test_prime_factorization.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import pytest
from src.prime_factorization import prime_factorization

def test_prime_factorization_basic():
assert prime_factorization(12) == [2, 2, 3]
assert prime_factorization(15) == [3, 5]
assert prime_factorization(100) == [2, 2, 5, 5]

def test_prime_factorization_prime_numbers():
assert prime_factorization(7) == [7]
assert prime_factorization(11) == [11]
assert prime_factorization(17) == [17]

def test_prime_factorization_edge_cases():
assert prime_factorization(1) == []
assert prime_factorization(2) == [2]

def test_prime_factorization_large_number():
result = prime_factorization(84)
assert result == [2, 2, 3, 7]
assert all(is_prime(factor) for factor in result)

def test_prime_factorization_invalid_inputs():
with pytest.raises(ValueError):
prime_factorization(0)
with pytest.raises(ValueError):
prime_factorization(-5)
with pytest.raises(TypeError):
prime_factorization(3.14)
with pytest.raises(TypeError):
prime_factorization("not a number")

def is_prime(n: int) -> bool:
"""Helper function to check if a number is prime."""
if n < 2:
return False
for i in range(2, int(n**0.5) + 1):
if n % i == 0:
return False
return True