📌  相关文章
📜  求序列 1^31+(1^3+2^3)(1+3)+(1^3+2^3+3^3)(1+3+5)+ 的第 N 项…(1)

📅  最后修改于: 2023-12-03 15:11:02.875000             🧑  作者: Mango

求序列 1^31+(1^3+2^3)(1+3)+(1^3+2^3+3^3)(1+3+5)+ 的第 N 项

这个序列是很有趣的,每一项都是前面一项和一个以前项结尾的多项式的积。具体而言,第 n 项是:

$$ \begin{aligned} &1^31 + (1^3 + 2^3)(1 + 3) + \dots + (1^3 + \dots + n^3)(1 + 3 + \dots + (2n-1)) \ =& \sum_{i=1}^{n} \left(\sum_{j=1}^{i} j^3\right) \left(\sum_{k=1}^{2i-1} k\right) \end{aligned} $$

现在我们需要写一个函数,给定一个整数 n,返回这个序列的第 n 项。

首先,我们可以定义一个函数来计算每一项的值:

def calculate_item(n: int) -> int:
    result = 0
    for i in range(1, n+1):
        result += sum(j**3 for j in range(1, i+1)) * sum(k for k in range(1, 2*i, 2))
    return result

这个函数使用了两个嵌套的循环来计算每一项的值。我们只需要将 1 到 n 传递给这个函数即可得到前 n 个项。然而,这个计算过程非常缓慢,因为我们对每项都使用了两个循环来计算。

我们可以通过使用一些数学技巧来改善性能。注意到第 i 项可以写成如下形式:

$$ i^3 \left(\sum_{j=1}^{i} j\right) \left(\sum_{k=1}^{2i-1} k\right) $$

因此,我们可以将求和符号拆开,得到:

$$ \begin{aligned} &\sum_{i=1}^{n} \left(\sum_{j=1}^{i} j^3\right) \left(\sum_{k=1}^{2i-1} k\right) \ =& \sum_{i=1}^{n} i^3 \left(\sum_{j=1}^{i} j\right) \left(\sum_{k=1}^{2i-1} k\right) \ =& \sum_{i=1}^{n} i^3 \cdot \frac{i(i+1)}{2} \cdot (2i^2 - i) \end{aligned} $$

因此,我们可以使用如下代码来提高计算性能:

def calculate_item(n: int) -> int:
    result = 0
    for i in range(1, n+1):
        result += i**3 * i * (i+1) // 2 * (2*i**2 - i)
    return result

这个函数不再使用嵌套循环,而是只进行一次循环。这显然是更快的。