池上です。

From: matz / ruby-lang.org (Yukihiro Matsumoto)
Subject: [ruby-math:00776] Re: Forward: matrix.rb bug
Date: Fri, 22 Nov 2002 02:56:11 +0900

> まつもと ゆきひろです
> 
> In message "[ruby-math:00775] Re: Forward: matrix.rb bug"
>     on 02/11/22, 石塚圭樹 <keiju / rational.com> writes:
> 
> |えー. これは例の, 1/2 = 0 の副作用ですね.
> 
> なるほど。でも、
> 
>   Matrix[[10.0, 5.0, 10.0], [10.0, 5.0, 0.0], [1.0, 1.0, 1.0]].det
> 
> も50.0になるんですが。彼が期待している(HP電卓の出した)結果は
> -50.0ではないかと。私にはどちらが正しいと判断する能力はあり
> ませんが。

件の determinant は 50 で、 -50 ではないです。
det(m) = (50 + 100) - (50 + 50) = 50

Mathematica 4.1 for Digital Unix
Copyright 1988-2000 Wolfram Research, Inc.

In[1]:= m = {{10, 5, 10}, {10, 5, 0}, {1, 1, 1}};

In[2]:= MatrixForm[m]

Out[2]//MatrixForm= 10   5    10

                    10   5    0

                    1    1    1

In[3]:= Det[m]

Out[3]= 50

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

(*) http://mathworld.wolfram.com/Determinant.html
    の (7) 式にある恒等式を繰り返し適用し、
    3 次または 2 次の小行列が現れた時点で、たすきがけを行う。

基本変形よりずっと効率が悪そうな気はしますが、
行列のサイズが小さければそんなに差はでないと思います。

もしも並列計算ができるのなら、逆に、この方法が早くなることがあります。
--
池上 大介
Daisuke IKEGAMI <daisu-ik / is.aist-nara.ac.jp>
奈良先端科学技術大学院大学 情報科学研究科
情報処理学専攻 情報基礎学講座 関研究室