原です。 >けいじゅ@いしつかです. >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の方が若干速いです。