algorithm - 具有不同初始值的 Tribonacci 系列

标签 algorithm math

如果初始值为一些任意数字,例如 1、2 3,即 T(1) = 1、T(2) =2 和 T(3) = 3,如何使用矩阵乘法法找到第 n 个 tribonacci 数。

如果 T(n) = T(n-1) + T(n-2) + T(n-3) 那么如果 n 非常非常大,如何找到 T(n),如果有人可以,我将不胜感激用矩阵乘法来解释。如何构造初始矩阵。

最佳答案

矩阵乘法涉及使用矩阵递推关系。

对于斐波那契数列,我们可以定义一个长度为2的向量来表示相邻的斐波那契数列。使用这个向量,我们可以定义一个矩阵乘法的递推关系:

enter image description here

同理,Tribonacci 级数递归关系可以这样写:

enter image description here

唯一的区别是向量和矩阵的大小不同。

现在,要计算一个大的 Tribonacci 数,我们只需应用 n 次矩阵乘法,我们得到:

enter image description here

n 次方矩阵 (Mn) 可以高效计算,因为我们可以使用求幂算法。

维基百科在 Exponentiation by Squaring 中描述了许多有效的标量求幂算法。 .我们可以将相同的想法用于矩阵求幂。

我将描述一个简单的方法来做到这一点。首先我们把n写成一个二进制数,eg:

n = 37 = 100101

然后,通过对 2 的前次方的平方计算 M 的每个 2 次方:M1, M2 = M1M 1, M4 = M2M2, M8 = M< sup>4M4, M16 = M8M8, M 32 = M16M16, ...

最后,乘以n的二进制数字对应的M次方。在这种情况下,Mn = M1M4M32

计算之后,我们可以将矩阵与前 3 个值的 Tribonacci 向量相乘,即。

enter image description here

因为矩阵的大小是固定的,所以每次矩阵乘法都需要常数时间。我们必须执行 O(log n) 矩阵乘法。因此,我们可以在 O(log n) 时间内计算出第 n Tribonacci 数。

将此与普通的动态规划方法进行比较,后者需要 O(n) 时间,通过计算每个 Tribonacci 数直到第 nth Tribonacci 数(即。 for (i = 3 to n) {T[i] = T[i-1]+T[i-2]+T[i-3];} 返回 T[n];) .


我假设您知道如何用您选择的语言编写矩阵乘法代码。

关于algorithm - 具有不同初始值的 Tribonacci 系列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12331013/

相关文章:

python - 如何打印与最小残差关联的值 - Python

c++ - 如何防止在多个 vector 中添加一个对象?

algorithm - 将数字转换为特定范围内的等效数字

java - 如何判断一个double变量是否有整型值?

java - java中的Math.random()方法真的是随机的吗?

php - PHP 中的自然语言处理

Java:将接近的数字与阈值匹配

algorithm - 如何在 n 叉树中找到只有叶子的父节点

algorithm - 昂贵的滚动窗产品的有效总和

java - 从相机坐标计算世界坐标