algorithm - 1a + 2a^2 + 3a^3 + ... + na^n 的 O(log n) 解

标签 algorithm math

任务是找到给定 na 的方程式之和。所以对于等式 1a + 2a^2 + 3a^3 + ... + na^n,我们可以使用以下公式(来自观察)找到序列中的第 n 个元素:

第 n 个元素 = a^n * (n-(n-2)/n-(n-1)) * (n-(n-3)/n-(n-2)) * ... * (n/(n-1))

我认为将上面的公式修改为求和公式,是不可能简化n个元素求和的。即使可能,我假设它会涉及使用指数n,这将引入n次循环;从而导致解决方案不是 O(log n)。我能得到的最佳解决方案是简单地找到每个元素的比率,即 a(n+1)/n 并将其应用于 n-1 元素以找到第 n 个 元素。

我想我可能遗漏了什么。有人可以为我提供解决方案吗?

最佳答案

您可以使用矩阵求幂来解决这个问题以及许多类似的问题。

让我们从这个序列开始:

A[n] = a + a^2 + a^3 ... + a^n

这个序列可以用一个简单的公式生成:

A[i] = a*(A[i-1] + 1)

现在,如果我们考虑您的顺序:

B[n] = a + 2a^2 + 3a^3 ... + na^n

我们可以使用前一个公式生成:

B[i] = (B[i-1] + A[i-1] + 1) * a

如果我们制作一个包含我们需要的所有组件的向量序列:

V[n] = (B[n], A[n], 1)

然后我们可以构造一个矩阵 M 以便:

V[i] = M*V[i-1]

所以:

V[n] = (M^(n-1))V[1]

由于矩阵的大小固定为 3x3,因此可以使用 exponentiation by squaring在矩阵本身上计算 M^(n-1)O(log n) 时间内,最后的乘法需要常数时间。

这是在 python 中使用 numpy 的实现(因此我不必包含矩阵乘法代码):

import numpy as np

def getSum(a,n):
    # A[n] = a + a^2 + a^3...a^n
    # B[n] = a + 2a^2 + 3a^3 +. .. na^n
    # V[n] = [B[n],A[n],1]

    M = np.matrix([
        [a, a, a],  # B[i] = B[i-1]*a + A[i-1]*a + a
        [0, a, a],  # A[i] = A[i-1]*a + a
        [0, 0, 1]
        ])

    # calculate MsupN = M^(n-1)
    n-=1
    MsupN=np.matrix([[1,0,0],[0,1,0],[0,0,1]]);

    while(n>0):
        if n%2 > 0:
            MsupN *= M
            n-=1
        M*=M
        n=n/2

    # calculate V[n] = MsupN*V
    Vn = MsupN*np.matrix([a,a,1]).T;
    return Vn.item(0,0);

关于algorithm - 1a + 2a^2 + 3a^3 + ... + na^n 的 O(log n) 解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57241576/

相关文章:

javascript - 如何缩短包含 A B 点的直线

c++:在数学错误而不是nan中创建实际错误

Java程序以10^-6精度确定嵌套根式常量的值

algorithm - 交换两个变量而不使用第三个变量会提高性能吗?

c# - 在 .NET 中计算列表最小值/最大值的最短代码

java - 验证给定级别的所有节点在二叉树中是否具有不同的值

c - 为什么此 C 代码中使用的 IEEE-754 指数偏差是 126.94269504 而不是 127?

algorithm - 这个问题可以使用背包问题解决方法来解决吗(不同大小的背包?)

c - 替换/删除图中的循环

math - AMN 和数学逻辑符号