在Julia中将矩阵提升为幂

时间:2018-04-18 00:48:31

标签: matrix julia linear-algebra matrix-multiplication

我正在Julia编写代码,涉及将大整数矩阵提升到高功率,我想让这段代码更有效率。我一直在寻找JuliaLang,但我不确定当我在Julia中将矩阵提升为幂时,Julia会自动使用最快的方法(二进制求幂或类似的东西)或是否会顺序乘以矩阵,例如A ^ p = A * A * ... * A.我可以通过手动实现二进制求幂来加速我的代码,还是Julia已经为我做了这个?

2 个答案:

答案 0 :(得分:1)

Julia提供了解决这个问题所需的所有内省方法。由于基础库是开源的,几乎完全用Julia编写,因此很容易看到。请看一下:

julia> A = rand(1:10, 4, 4); p = 3;

julia> @less A^p
function (^)(A::AbstractMatrix{T}, p::Integer) where T<:Integer
    # make sure that e.g. [1 1;1 0]^big(3)
    # gets promotes in a similar way as 2^big(3)
    TT = promote_op(^, T, typeof(p))
    return power_by_squaring(convert(AbstractMatrix{TT}, A), p)
end

所以它使用内部power_by_squaring函数来完成它的工作:

julia> @less Base.power_by_squaring(A, p)
          "(e.g., [2.0 1.0;1.0 0.0]^$p instead ",
          "of [2 1;1 0]^$p), or write float(x)^$p or Rational.(x)^$p")))
function power_by_squaring(x_, p::Integer)
    x = to_power_type(x_)
    # … skipping the obvious branches to find …
    t = trailing_zeros(p) + 1
    p >>= t
    while (t -= 1) > 0
        x *= x
    end
    y = x
    while p > 0
        t = trailing_zeros(p) + 1
        p >>= t
        while (t -= 1) >= 0
            x *= x
        end
        y *= x
    end
    return y
end

二进制求幂!现在这不会重复使用任何临时工具,因此您可以通过明智地使用就地mul!来做得更好。

答案 1 :(得分:1)

有一点值得指出的是,如果你的矩阵是方形的,那么功率非常大(> 50),你可以通过转换为Jordan Normal Form,提升和转​​换来节省时间。此链接提供了数学方https://math.stackexchange.com/questions/354277/square-matrix-multiplication-when-raised-to-a-power

的基础知识