用整数项计算矩阵幂

时间:2018-10-09 18:54:49

标签: algorithm integer precision matrix-multiplication

假设我有一个常数矩阵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)?

2 个答案:

答案 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),因为我们可以找到原始根。