如果初始值是一些任意数字,如果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),如果有人可以,我将不胜感激用矩阵乘法法解释。如何构造初始矩阵。
答案 0 :(得分:10)
矩阵乘法方法涉及使用矩阵递归关系。
对于Fibonacci系列,我们可以定义一个长度为2的向量来表示相邻的Fibonacci数。使用此向量,我们可以使用矩阵乘法定义递归关系:
同样,Tribonacci系列递归关系可以用这种方式编写:
唯一的区别是矢量和矩阵大小不同。
现在,要计算一个大的Tribonacci数,我们只应用矩阵乘法n次,我们得到:
可以有效地计算n
(M n )幂的矩阵,因为我们可以使用求幂算法。
维基百科在Exponentiation by Squaring中描述了许多用于标量的有效取幂算法。我们可以使用相同的思想进行矩阵求幂。
我将描述一种简单的方法。首先,我们将n
写为二进制数,例如:
n = 37 = 100101
然后,通过平方先前的2的幂来计算M的每个幂2:M 1 ,M 2 = M 1 M 1 ,M 4 = M 2 M 2 ,M 8 = M < sup> 4 M 4 ,M 16 = M 8 M 8 ,M 32 = M 16 M 16 ,......
最后,乘以对应于n
的二进制数字的M的幂。在这种情况下,M n = M 1 M 4 M 32 。
在计算之后,我们可以将矩阵与前三个值的Tribonacci向量相乘,即。
因为矩阵具有固定的大小,所以每个矩阵乘法需要恒定的时间。我们必须进行O(log n)
矩阵乘法。因此,我们可以在O(log n)
时间内计算出n th Tribonacci数。
将此与常规动态编程方法进行比较,通过计算每个Tribonacci数直到n th Tribonacci数(即O(n)
),需要for (i = 3 to n) {T[i] = T[i-1]+T[i-2]+T[i-3];} return T[n];
时间。
我将假设您知道如何使用您选择的语言对矩阵乘法进行编码。
答案 1 :(得分:4)
考虑:
| a1 b1 c1 |
[f(n) f(n - 1) f(n - 2)] * | a2 b2 c2 | = [f(n + 1) f(n) f(n - 1)]
| a3 b3 c3 |
根据该矩阵找到矩阵中的未知数,这将是您想要的矩阵。
本案的答案是:
1 1 0
1 0 1
1 0 0
该方法是通用的,但是,即使你在k
之前的术语求和,即使它们前面有常量等,它也能正常工作。