Я не думаю, что это должно быть слишком сложно. На самом деле вам не нужно изменять n
, чтобы найти его главные факторы, они все полностью независимы друг от друга. Так что просто переберите подходящие простые числа и найдите максимальную мощность, которая работает!
from math import log
def prime_factors(n):
return [(prime, max(power for power in range(1, int(log(n, prime))+1)
if n % prime**power == 0))
for prime in range(2, n+1) if n % prime == 0 and isprime(prime)]
Есть несколько способов улучшить это. Вы можете использовать itertools.takewhile
на бесконечном генераторе сил (например, itertools.count
), поскольку, как только вы найдете первую мощность, такую, что prime**power
не является фактором n
, ни одна из более поздних не будет. Это позволит вам избежать звонка log
.
И есть целый ряд способов эффективной итерации по простым числам (см., Например, очень простой генератор, предложенный здесь , или версии с более высокой производительностью, которые вы можете найти в ответах на несколько различных вопросов здесь, на SO).