ヨーキョクデイ

いろいろ雑食

2 次正方行列の累乗の次数減らしを Ruby で使ってみる

2 次正方行列の累乗の次数減らしRuby で実装し、その方法で実際に行列の累乗を求めてみるよ。

require 'matrix'
require 'mathn'

class Matrix
  def my_power(n)  # for 2 * 2 matrix
    def t(n)
      def combination(n, m)
        if m == 0 or m == n
          return 1
        else
          return combination(n - 1, m - 1) + combination(n - 1, m)
        end
      end
      sum = 0
      (1..(n + 1) / 2).each{|k|
        sum += combination(n - k, k - 1) * (self.tr ** (n - 2 * k + 1)) * ((-self.det) ** (k - 1))
      }
      return sum
    end
    return t(n) * self - t(n - 1) * self.det * Matrix.I(2)
  end
end

a = Matrix[[-4.6, -2.2], [2.1, 4.3]]
b = Matrix[[0, -3], [-1, 3]]

p a ** 4          # Matrix[[273.1558, 20.0705999999999], [-19.1583, 191.9611]]
p a.my_power(4)   # Matrix[[273.1558, 20.0706], [-19.1583, 191.9611]]

p b ** 17         # Matrix[[1192888215, -4522582593], [-1507527531, 5715470808]]
p b.my_power(17)  # Matrix[[1192888215, -4522582593], [-1507527531, 5715470808]]

従来の方法と比べても計算は合ってるようだけど、全然使い道がないね。