池上です。

> determinant を計算するときに、
> (現在の実装である)行列の基本変形の代わりに
> 小行列式(minors)を使った再帰的な公式(*注)で、
> 割り算を一回も経由することなく求まると思うけど、

思いつくままに書いてみました。

class Matrix
  def determinant2

	raise unless square? # 例外を返すべきと思います
	
	num = row_size

	result = 0
	case num
	when 1
	  return self[0, 0]
	when 2
	  return (self[0, 0] * self[1, 1]) - (self[1, 0] * self[0, 1])
	when 3
	  left = self[0, 0] * self[1, 1] * self[2, 2] + 
		self[0, 1] * self[1, 2] * self[2, 0] +
		self[0, 2] * self[1, 0] * self[2, 1]
	  right = self[0, 2] * self[1, 1] * self[2, 0] +
		self[0, 1] * self[1, 0] * self[2, 2] + 
		self[0, 0] * self[1, 2] * self[2, 1]
	  return left - right
	else
	  num.times do |i|
		m = self.to_a
		num.times { |j| m[j].delete_at(i) }
		m.delete_at(0)
		m = Matrix[*m]
		result = result + ((-1)**i) * self[0, i] * m.determinant2
	  end
	end

	return result
  end

end
--
池上 大介
Daisuke IKEGAMI <daisu-ik / is.aist-nara.ac.jp>
奈良先端科学技術大学院大学 情報科学研究科
情報処理学専攻 情報基礎学講座 関研究室