# work0202.rb
# @m = a.dup は、多次元配列の dup が不完全であるという Ruby の悪癖!?
# ... Ruby version 1.7 からは生じないようです。

class Matrix
  def initialize(a=[[1,0,0],[0,1,0],[0,0,1]])
    @m = []
    @size = 3
    for i in 0...@size do
      @m << a[i].dup
    end
  end

  attr_accessor :m

  def add(x)
    ans = Matrix.new
    for i in 0...@size
        for j in 0...@size
	    ans.m[i][j] = @m[i][j] + x.m[i][j]     # ミス
	end
    end
    return ans
  end

  def mult(x)
    ans = Matrix.new
    for i in 0...@size
	for j in 0...@size
	    sum = 0
	    for k in 0...@size
		sum += @m[i][k] * x.m[k][j]
	    end
	    ans.m[i][j] = sum                       # ミス
	end
    end
    return ans
  end

  def invers
    ae = [[0,0,0,1,0,0],[0,0,0,0,1,0],[0,0,0,0,0,1]]
    for i in 0...@size
        for j in 0...@size
	    ae[i][j] = @m[i][j]
	end
    end

    for i in 0...@size
	j = i
	while ae[j][i] == 0
	    j += 1
	    if j >= @size
	        return nil
	    end
	end
	if j != i
	    for k in 0...@size*2
		tmp = ae[i][k]
		ae[i][k] = ae[j][k]
		ae[j][k] = tmp
	    end
	end

	p = Float(ae[i][i])                # ミス
	
	for k in i...@size*2
	    ae[i][k] /= p
	end
	for j in 0...@size
	    if i != j
		r = ae[j][i]
		for k in i...@size*2
		    ae[j][k] -= ae[i][k]*r
		end
	    end
	end
    end

    ans = Matrix.new
    for i in 0...@size
	for j in 0...@size
	    ans.m[i][j] = ae[i][j+@size]
	end
    end

    return ans
  end

  def show
    for i in 0...@size
	for j in 0...@size
	    printf(" %5.2f",@m[i][j])  #  ミス
	end
	print "\n"
    end
  end
end

#

a = [[1,1,1],[2,2,2],[3,3,3]]
x = Matrix.new(a)
x.show
a[1][1] = 0
x.show