需要帮助加快我的欧拉计划#650的解决方案

时间:2019-07-16 19:06:27

标签: python performance

因此,我一直在研究Euler问题#650,它为较小的值生成了正确的答案,但是他们正在寻找最大值为20,000的解决方案。以我目前的代码运行速度,大约需要十亿年。改进此代码并使其更高效/更快的任何技巧将不胜感激。这是问题的链接:https://projecteuler.net/problem=650

和代码

from scipy.special import comb
import math
import time

t0 = time.time()

def B(x):
    #takes product of binomial coefficients
    product = 1
    for i in range(x + 1):
        product *= comb(x, i, exact=True)
    return product



def D(y):
    #Sums all divisors of the product of binom. coefficients
    x = B(y)
    summation = []
    for i in range(1, int(math.sqrt(x)) + 1):
        if x % i == 0:
            summation.append(i)
            summation.append(x // i)
    summation = list(dict.fromkeys(summation))
    return sum(summation)


def S(z):
    """sums up all the sums of divisors of the product of the binomial 
    coefficients"""
    sigma = []
    for i in range(1, z + 1):
        sigma.append(D(i))
    return sum(sigma)

print(S(20000))

t1 = time.time()

total = t1 - t0


print(total)

1 个答案:

答案 0 :(得分:1)

我也是 但你可以试试这个

from math import factorial

def n_choose_k(n, k):
    if k == 0:
        return 1
    else:
        return factorial(n)//((factorial(k))*factorial(n-k))

def B(n):
    prods = []
    for k in range(0, n):
        prods.append(n_choose_k(n, k))