From: Shin-ichiro HARA Date: 2005-11-26T16:29:40+09:00 Subject: [ruby-dev:27827] Re: Matrix class is broken without mathn 原です。 In [ruby-dev:27820] >けいじゅ@いしつかです. >>>ただ, 行列の要素にはいろいろなものが入る可能性があるので, det_eがち>ゃ >>>んと動作する条件を明確にした方がよいかと思います. >> >>ちゃんと動作するのは、IntegerかRationalの行列です。 > >それだけではないですよね? 多項式環などでも計算できそうです >が? その通りです。成分には/が適切に定義されていればOKです。 determinant_e2みたいに軸の選択など工夫をしているとそうはいか ないのですが。 >>オリジナルのdetと最も違うのは、成分が全てIntegerである行列に対し必ず >>Integerを返す所です。Floatが混じると無限ループに陥る可能性があります。 > >うーむ. これはまずいかなぁ... まずいですかね。det_eを使う人は意図的に使うのでいいんじゃな い? 実は無限ループになるケースを私が知っている訳ではなくて、可能 性があるなあと思っただけです。CPU依存かも。もしかするとない かも。 >というか, Floatが入っていると結果も間違っていますよね? 無限ループにならず答が返るなら正しい値を返すはずです。 ちなみに、殆ど0であることを意味するFloat#almost_zero?みたい のを用意してdet_eの各所のzero?をそれで置きかえると理論的にも 無限ループにならずに済むのだけど。 >今のをまとめると: > >* determinantは, quo を用いたものにする. > 標準では: > > aMatrix.det => Float > > require "rational" した状態だと: > > aMatrix.det => Rational > >* もう一つ, determinant_e を導入する. アルゴリズムは 原さんのdetermin>ant_625 > >* rank も, quo を用いたものにする. >* rank_e を追加導入する > >他に異議のある方がいなければ, 上記のようにしたいと思います. 私はOKです。