如何在python中找到从1到输入数字x的每个数字的除数立方体之和,其中x可能非常大

如何在python中找到从1到输入数字x的每个数字的除数立方体之和,其中x可能非常大,python,python-2.7,Python,Python 2.7,使用此代码,我可以找到小于一百万的小数字的答案。 但我想找到非常大的数字的答案。有算法吗 对于如何轻松地解决大量问题?我不认为有一种巧妙的方法可以真正有效地解决这个问题,但很容易使整个过程更快。如果将示例视为矩阵,则一次求和一行。这需要,对于每个i,找到i的所有除数并求其立方体的和。总之,这需要一系列与x**2成比例的操作 通过将矩阵按列求和,可以很容易地将其切割成与x成比例的操作数。给定一个整数j,1..x中有多少个整数可被j整除?这很简单:在这个范围内有j的x//j倍数,所以除数j贡献了j*

使用此代码,我可以找到小于一百万的小数字的答案。 但我想找到非常大的数字的答案。有算法吗
对于如何轻松地解决大量问题?

我不认为有一种巧妙的方法可以真正有效地解决这个问题,但很容易使整个过程更快。如果将示例视为矩阵,则一次求和一行。这需要,对于每个i,找到i的所有除数并求其立方体的和。总之,这需要一系列与x**2成比例的操作

通过将矩阵按列求和,可以很容易地将其切割成与x成比例的操作数。给定一个整数j,1..x中有多少个整数可被j整除?这很简单:在这个范围内有j的x//j倍数,所以除数j贡献了j**3*x//j的总和

Examples, 
1.Input=4
Output=111

Explanation,
1 = 1³(divisors of 1)
2 = 1³ + 2³(divisors of 2)
3 = 1³ + 3³(divisors of 3)
4 = 1³ + 2³ + 4³(divisors of 4)
------------------------
sum = 111(output)

1.Input=5
Output=237

Explanation,
1 = 1³(divisors of 1)
2 = 1³ + 2³(divisors of 2)
3 = 1³ + 3³(divisors of 3)
4 = 1³ + 2³ + 4³(divisors of 4)
5 = 1³ + 5³(divisors of 5)
-----------------------------
sum = 237 (output)

x=int(raw_input().strip())
tot=0
for i in range(1,x+1):
    for j in range(1,i+1):
        if(i%j==0):
            tot+=j**3
print tot
这运行得更快,但仍然需要与x成比例的时间

有一些较低级别的技巧,你可以通过不断的因素来加速,但总体来说,它们仍然需要很长的时间。例如,请注意,对于所有j,x//j==1,这样x//2
def better4(x):
    result = 0
    for i in range(1, x+1):
        d = x // i
        if d >= i:
            # d is the largest divisor that appears `i` times, and
            # all divisors less than `d` also appear at least that
            # often.  Account for one occurence of each.
            result += sum3(d)
        else:
            i -= 1
            lastd = x // i
            # We already accounted for i occurrences of all divisors
            # < lastd, and all occurrences of divisors >= lastd.
            # Account for the rest.
            result += sum(j**3 * (x // j - i)
                          for j in range(1, lastd))
            break
    return result

对于一些满足0的整数r,我看不到一种巧妙的方法来使其真正有效,但很容易使其速度大大加快。如果将示例视为矩阵,则一次求和一行。这需要,对于每个i,找到i的所有除数并求其立方体的和。总之,这需要一系列与x**2成比例的操作

通过将矩阵按列求和,可以很容易地将其切割成与x成比例的操作数。给定一个整数j,1..x中有多少个整数可被j整除?这很简单:在这个范围内有j的x//j倍数,所以除数j贡献了j**3*x//j的总和

Examples, 
1.Input=4
Output=111

Explanation,
1 = 1³(divisors of 1)
2 = 1³ + 2³(divisors of 2)
3 = 1³ + 3³(divisors of 3)
4 = 1³ + 2³ + 4³(divisors of 4)
------------------------
sum = 111(output)

1.Input=5
Output=237

Explanation,
1 = 1³(divisors of 1)
2 = 1³ + 2³(divisors of 2)
3 = 1³ + 3³(divisors of 3)
4 = 1³ + 2³ + 4³(divisors of 4)
5 = 1³ + 5³(divisors of 5)
-----------------------------
sum = 237 (output)

x=int(raw_input().strip())
tot=0
for i in range(1,x+1):
    for j in range(1,i+1):
        if(i%j==0):
            tot+=j**3
print tot
这运行得更快,但仍然需要与x成比例的时间

有一些较低级别的技巧,你可以通过不断的因素来加速,但总体来说,它们仍然需要很长的时间。例如,请注意,对于所有j,x//j==1,这样x//2
def better4(x):
    result = 0
    for i in range(1, x+1):
        d = x // i
        if d >= i:
            # d is the largest divisor that appears `i` times, and
            # all divisors less than `d` also appear at least that
            # often.  Account for one occurence of each.
            result += sum3(d)
        else:
            i -= 1
            lastd = x // i
            # We already accounted for i occurrences of all divisors
            # < lastd, and all occurrences of divisors >= lastd.
            # Account for the rest.
            result += sum(j**3 * (x // j - i)
                          for j in range(1, lastd))
            break
    return result
对于某些满足0def sum_除数n的整数r: 总和=0 i=0 对于范围1中的i,n: 如果n%i==0且n!=0 : sum=sum+i

def isqrt(n):
    "Return floor(sqrt(n)) for int n > 0."
    g = 1 << ((n.bit_length() + 1) >> 1)
    d = n // g
    while d < g:
        g = (d + g) >> 1
        d = n // g
    return g

def better5(x):
    assert x > 0
    u = isqrt(x)
    v = x // u
    return (sum(map(sum3, (x // d for d in range(1, u+1)))) +
            sum(x // i * i**3 for i in range(1, v)) -
            u * sum3(v-1))
定义和除数n: 总和=0 i=0 对于范围1中的i,n: 如果n%i==0且n!=0 : sum=sum+i

def isqrt(n):
    "Return floor(sqrt(n)) for int n > 0."
    g = 1 << ((n.bit_length() + 1) >> 1)
    d = n // g
    while d < g:
        g = (d + g) >> 1
        d = n // g
    return g

def better5(x):
    assert x > 0
    u = isqrt(x)
    v = x // u
    return (sum(map(sum3, (x // d for d in range(1, u+1)))) +
            sum(x // i * i**3 for i in range(1, v)) -
            u * sum3(v-1))

@maq不,这对于代码审查来说是非常离题的。请参考他们的@maq No,这与代码审查的主题完全无关。请参考他们的。工作做得很好。正如您所说,better31013只需不到一分钟,better31015只需近3分钟。谢谢,工作做得很好。正如您所说,better31013只需不到一分钟,better31015只需近3分钟。非常感谢。
d == x/i
i == x/d
def isqrt(n):
    "Return floor(sqrt(n)) for int n > 0."
    g = 1 << ((n.bit_length() + 1) >> 1)
    d = n // g
    while d < g:
        g = (d + g) >> 1
        d = n // g
    return g

def better5(x):
    assert x > 0
    u = isqrt(x)
    v = x // u
    return (sum(map(sum3, (x // d for d in range(1, u+1)))) +
            sum(x // i * i**3 for i in range(1, v)) -
            u * sum3(v-1))
   # Return the sum of all divisors of n, not including n
     return sum

    print(sum_divisors(0))
      # 0
    print(sum_divisors(3)) # Should sum of 1
      # 1
    print(sum_divisors(36)) # Should sum of 1+2+3+4+6+9+12+18
     # 55
    print(sum_divisors(102)) # Should be sum of 2+3+6+17+34+51
      # 114