原です。

>けいじゅ@いしつかです.

>detの定義の中でrational.rbをrequireし, かつquoで計算するようにしよう
>というのが, 私の主張でした.
>
>quoで計算することになりますので, 成分をRational化をする必要はなく, quo
>が出てきた時点でRational化されます.

あー、そういう話でしたか。理解しました。

>ただ, Rational+quo式 は, detを計算すると勝手にrational.rbをrequireして
>しまうので, det前と後でquoを用いているメソッド(inv等)の振る舞いが変わっ
>てしまうことに気が付きましたので, やはりまずいかなぁ. と思っていたとこ
>ろでした(^^;;

そうですね。それはありますね。

(Rational+quo式ではなく)quo式でも、rationalをrequireしているかどうか
でdetの戻り値が変わってしまうという仕様なので、それはそれで気持ちが悪い
ですね。しかし、意識して成分をRational化あるいはFloat化しておけばその現
象は避けられるし、何より何も意識していなかった場合でも、ひどい値を返す
ことはない、というのが有り難いと思います。

>>これは、整数行列をRatinal()してから、現行detを計算するより
>>かなり速いです。次は15次行列の整数成分の行列式を5回計算させ
>>たのにかかった時間です。
>>
>>determinant         : 4.278sec.
>>determinant_e       : 0.329sec.
>
>おー. すばらしい.

他のマシンで試したら5倍程度の差でした。CPUによるみたいです。

ここで、ちょっとどうでもいい訂正。[ruby-dev:27730] のテストの部分で、

    tr.stime{Matrix[*mr].det}
    te.stime(tr.value){Matrix[*m].determinant_e}
    以下続く

とあるのは


    tr.stime{mr.det}
    te.stime(tr.value){m.determinant_e}
    以下続く

で十分でした。[ruby-dev:27731] でも同様です。

>ちなみに, determinant_e の eは何の省略形です?

electric、、、違う。アルゴリズムがElementary divisor(単因子)を求め
るところに出てくるものの一部なので。Exactという気もしたし、、、
名前はいいのがあれば代えてしまってください。

>オリジナルdetと形がすごく似ているので, det_625 の方がよいかなぁ...
>って感じです.

そうですね。だいたい一カ所変えただけですからね。それがなぜか一番速
いみたい。

>結論としては, 原(新)案に賛成です. 
>
>ただ, 行列の要素にはいろいろなものが入る可能性があるので, det_eがちゃ
>んと動作する条件を明確にした方がよいかと思います.

ちゃんと動作するのは、IntegerかRationalの行列です。オリジナルの
detと最も違うのは、成分が全てIntegerである行列に対し必ずInteger
を返す所です。Floatが混じると無限ループに陥る可能性があります。
処理速度は、Integerのみの行列のときにはオリジナルのdetに比べ(特
にサイズが大きい場合)速く計算します。Rationalが混じる場合はオリ
ジナルのdetの方が若干速いです。