优化有助于找到最大除数

时间:2013-04-12 16:21:43

标签: python

我试图解决欧拉项目的问题12。拥有超过500个除数的第一个三角形数的值是多少? (第7个三角形数字为1 + 2 + 3 + 4 + 5 + 6 + 7 = 28)。这是我的代码,但速度不够快.. 你有任何优化技巧吗?

n=0
a=0
list=[]
maxcount=0


while True:
    n+=1
    a+=n
    count=0
    for x in range(1,int(a+1)):
        if a%x==0:
            count+=1   
            if count>maxcount:
                maxcount=count
                print a, "has", maxcount, "dividors"

谢谢!

3 个答案:

答案 0 :(得分:1)

从这个问题中抓取代码,实现非常快速的素数分解:
Fast prime factorization module

然后使用此问题的答案将您的素数因子转换为所有除数的列表(长度是您想要的):
What is the best way to get all the divisors of a number?

例如,您可以从第一个链接将以下函数(从第二个链接改编)添加到模块的底部:

def alldivisors(n):
    factors = list(factorization(n).items())
    nfactors = len(factors)
    f = [0] * nfactors
    while True:
        yield reduce(lambda x, y: x*y, [factors[x][0]**f[x] for x in range(nfactors)], 1)
        i = 0
        while True:
            if i >= nfactors:
                return
            f[i] += 1
            if f[i] <= factors[i][1]:
                break
            f[i] = 0
            i += 1

然后在您的代码中计算除数,您将使用len(list(alldivisors(a))),它将比您当前使用的强力方法更快地计算除数的数量。

答案 1 :(得分:1)

从缩小搜索空间开始,无需查看非三角数字的数字。另请尝试查看range(1, sqrt(n))中的除数,而不是range(1, n)

答案 2 :(得分:0)

除了数论之外:尝试缓存,并以相反的方式做事。例如:当你已经知道300有18个除数(以及它们是什么)时,这对于一个可以被300分割的数字意味着什么?你可以缓存这些信息吗? (当然可以。)

纯python加速黑客无法帮助你,你需要一个更好的算法。