私はグレッグのソリューションが好きですが、それがもっと Python に似ていたらいいのにと思います。より速く、より読みやすくなると思います。そのため、しばらくコーディングした後、これを思いつきました。
最初の 2 つの関数は、リストのデカルト積を作成するために必要です。この問題が発生した場合はいつでも再利用できます。ところで、私はこれを自分でプログラムしなければなりませんでした。誰かがこの問題の標準的な解決策を知っているなら、私に連絡してください。
"Factorgenerator" は辞書を返すようになりました。そして、ディクショナリは "divisors" に入力され、最初にそれを使用してリストのリストが生成されます。ここで、各リストは p^n の形式の因子のリストであり、素数が p です。次に、これらのリストのデカルト積を作成し、最後に Greg の解を使用して除数を生成します。仕分けしてお返しします。
テストしたところ、以前のバージョンよりも少し速いようです。私はより大きなプログラムの一部としてテストしたので、どれだけ速いかはわかりません.
Pietro Speroni(ピエトロスペローニ ドットイット)
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)
PSスタックオーバーフローに投稿するのは初めてです。フィードバックをお待ちしております。