Мне нравится решение Грега, но хотелось бы, чтобы он был больше похож на Python.
Я чувствую, что это будет быстрее и более читабельным;
так что после некоторого времени кодирования я вышел с этим.
Первые две функции необходимы для создания декартового произведения списков.
И может быть повторно использован везде, где возникает эта проблема.
Кстати, мне пришлось программировать это самостоятельно, если кто-нибудь знает стандартное решение этой проблемы, пожалуйста, не стесняйтесь связаться со мной.
"Factorgenerator" теперь возвращает словарь. А затем словарь подается в «делители», которые используют его для генерации сначала списка списков, где каждый список представляет собой список факторов вида p ^ n с p prime.
Затем мы делаем декартово произведение этих списков и, наконец, используем решение Грега для генерации делителя.
Мы сортируем их и возвращаем.
Я проверил это, и оно кажется немного быстрее, чем в предыдущей версии Я проверил это как часть более крупной программы, поэтому я не могу точно сказать, насколько это быстрее.
Пьетро Сперони (Pietrosperoni dot it)
from math import sqrt
##############################################################
### cartesian product of lists ##################################
##############################################################
def appendEs2Sequences(sequences,es):
result=[]
if not sequences:
for e in es:
result.append([e])
else:
for e in es:
result+=[seq+[e] for seq in sequences]
return result
def cartesianproduct(lists):
"""
given a list of lists,
returns all the possible combinations taking one element from each list
The list does not have to be of equal length
"""
return reduce(appendEs2Sequences,lists,[])
##############################################################
### prime factors of a natural ##################################
##############################################################
def primefactors(n):
'''lists prime factors, from greatest to smallest'''
i = 2
while i<=sqrt(n):
if n%i==0:
l = primefactors(n/i)
l.append(i)
return l
i+=1
return [n] # n is prime
##############################################################
### factorization of a natural ##################################
##############################################################
def factorGenerator(n):
p = primefactors(n)
factors={}
for p1 in p:
try:
factors[p1]+=1
except KeyError:
factors[p1]=1
return factors
def divisors(n):
factors = factorGenerator(n)
divisors=[]
listexponents=[map(lambda x:k**x,range(0,factors[k]+1)) for k in factors.keys()]
listfactors=cartesianproduct(listexponents)
for f in listfactors:
divisors.append(reduce(lambda x, y: x*y, f, 1))
divisors.sort()
return divisors
print divisors(60668796879)
P.S.
это первый раз, когда я отправляю сообщения в stackoverflow.
Я с нетерпением жду каких-либо отзывов.