def is_prime(n): if n == 2: return True if n%2: return False k = 3 while k*k <= n: if n%k == 0: return False k += 2 return True def smallest_factor(n): """ n is an integer n >= 2 returns smallest factor of n that is >= 2. """ if n% 2 == 0: return 2 k = 3 while k*k <= n: if n%k == 0: return k k += 2 return n def prime_factors(n): """ n is an integer, n >= 2 returns a list of all of the prime factors of n prime_factors(100) -> [2, 2, 5, 5] prime_factors(1003) -> [17, 59] prime_factors(997) -> [997] prime_factors(16777216) """ out = [] k = 2 while n > 1: d = smallest_factor(n) n //= d out.append(d) return out def prime_factors(n): if n == 1: return [] d = smallest_factor(n) return [d] + prime_factors(n//d) print(prime_factors(105)) print(prime_factors(16777216)) print(prime_factors(1003)) print(prime_factors(997)) print(smallest_factor(100) ==2) print(smallest_factor(1003) ==17) print(smallest_factor(1000000007) ==1000000007) #for k in range(2,101): #print(f"{k} -> {smallest_factor(k)}")