假设我有一个常数矩阵A,我想计算pow(A,n)。如in this question所述,我可以计算其特征值分解(或更笼统地说,其不变子空间和广义模态矩阵)以加快处理速度。
如果A是大小为k的方阵,则该算法通过平方求幂,具有复杂度O(k log n),并且准备成本(用于计算模态矩阵)为O(k ^ 3)。
我正在考虑的问题是精度下降。计算特征值等可以将我们从整数的范围带入浮点数。即使最后我们知道pow(A,n)必须具有所有整数项,但上面概述的算法仅能计算浮点数。
另一种方法是通过平方仅利用幂运算,但这只给了我们O(k ^ 3 log n)算法。
有没有一种方法可以准确地-不转换为浮点数-快速计算pow(A,n)?
答案 0 :(得分:1)
对于有限域上的矩阵,特征值分解也是可能的,但前提是该域恰好是正确的。因此,不仅需要进行预处理来进行特征值分解,而且还要找到(某些)有限域,甚至可以在其上进行。
查找多个解决方案有助于避免使用巨大的有限域,然后在一些小域中计算pow(A,n)并使用CRT来计算the中的解。但这需要以某种方式拥有足够数量的足够大的字段来使用,并且您不会真正提前知道会是什么(总是有n个数字,它会停止工作),所以也许这一切都行不通在实践中。
举个小例子,
A = [[1, 1],
[1, 0]]
特征x²-x-1,让我们猜想模1009将起作用(它确实起作用),那么根383和627,所以:
A = QDP mod 1009
Q = [[ 1, 1],
[382, 626]]
D = [[383, 0],
[ 0, 627]]
P = [[ 77, 153],
[933, 856]]
例如
pow(A, 15) = Q [[928, 0], P = [[987, 610],
[ 0, 436]] [610, 377]]
斐波纳契数符合预期,因此一切顺利。但是只有1009的模数,指数超过15会使结果与ℤ不匹配,那么我们将需要更多/更大的字段。
答案 1 :(得分:0)
使用Cayley-Hamilton theorem可以更快。定理指出,维度k
的每个矩阵幂可以写成k
的前A
幂的和。
如果我们知道,我们可以通过平方来使用幂运算,但是我们不用A
上的多项式,而是使用on中的系数来处理矩阵。然后,我们可以在每一步之后将特征多项式减去特征多项式。
作为一个小例子:
A = [[1, 1],
[1, 0]]
A^2 = A + 1 = writing poly. coefficients = {1, 1}
pow(A, 15) = {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
= {1, 0} * ({1, 0} * ({1, 0} * {1, 0}^2)^2)^2
= {1, 0} * ({1, 0} * ({1, 0} * {1, 0, 0})^2)^2
= {1, 0} * ({1, 0} * ({1, 0} * {1, 1})^2)^2
= {1, 0} * ({1, 0} * ({1, 1, 0})^2)^2
= {1, 0} * ({1, 0} * {2, 1}^2)^2
= {1, 0} * ({1, 0} * {4, 4, 1})^2
= {1, 0} * ({1, 0} * {8, 5})^2
= {1, 0} * ({8, 5, 0})^2
= {1, 0} * {13, 8}^2
= {1, 0} * {169, 208, 64}
= {1, 0} * {377, 233}
= {377, 233, 0}
= {610, 377}
= [[987, 610],
[610, 377]]
那么,运行时成本是多少?琐碎地O(k^2 * log n)
是因为在每个平方步骤中,我们需要计算两个多项式的平方并减少char。多项式。在其他答案中使用与@harold类似的技巧,通过使用离散傅立叶多项式乘法,我们得到了O(k log k log n)
,因为我们可以找到原始根。