From: keiju@... (=?ISO-2022-JP?B?GyRCQFBETTc9PHkbKEI=?=) Date: 1999-08-24T21:58:49+09:00 Subject: [ruby-list:16298] new release rational.rb [Re: matrix bug] けいじゅ@日本ラショナルソフトウェアです. In [ruby-list :16294 ] the message: "[ruby-list:16294] Re: matrix bug ", on Aug/24 19:36(JST) 石塚圭樹 writes: >そうですね. そういう用途に使う場合, さらに便利なmathn.rb というライブラ >リもあります. > ># でも, mathn.rbをロードしてMatrix#detすると... 何かバグがあるみたいです. ># こっちの問題は後で調べます. 原因がわかりました. といっても, rubyに添付してあるものには問題がありませ んでした. まだ後悔していなかった, rational.rbの最新版にバグがありました. バグをとったついでに最新版へのパッチも出します. rubyへの取り込みよろしくお願いします. # matrix.rbの方もよろしく. keiio% diff -u rational.rb ~/var/src/var.lib/ruby/numeric/rational.rb --- rational.rb Tue Apr 20 17:41:56 1999 +++ /home/keiju/var/src/var.lib/ruby/numeric/rational.rb Tue Aug 24 21:49:49 1999 @@ -1,8 +1,8 @@ # # rational.rb - # $Release Version: 0.5 $ -# $Revision: 1.3 $ -# $Date: 1998/03/11 14:09:03 $ +# $Revision: 1.7 $ +# $Date: 1999/08/24 12:49:28 $ # by Keiju ISHITSUKA(SHL Japan Inc.) # # -- @@ -44,7 +44,7 @@ end class Rational < Numeric - @RCS_ID='-$Id: rational.rb,v 1.3 1998/03/11 14:09:03 keiju Exp keiju $-' + @RCS_ID='-$Id: rational.rb,v 1.7 1999/08/24 12:49:28 keiju Exp keiju $-' def Rational.reduce(num, den = 1) raise ZeroDivisionError, "denometor is 0" if den == 0 @@ -235,6 +235,10 @@ self end + def inspect + sprintf("Rational(%s, %s)", @numerator.inspect, @denominator.inspect) + end + def hash @numerator ^ @denominator end @@ -258,7 +262,27 @@ Rational(self, 1) end - def gcd(int) + def gcd(n) + m = self.abs + n = n.abs + + return n if m == 0 + return m if n == 0 + + b = 0 + while n[0] == 0 && m[0] == 0 + b += 1; n >>= 1; m >>= 1 + end + m >>= 1 while m[0] == 0 + n >>= 1 while n[0] == 0 + while m != n + m, n = n, m if n > m + m -= n; m >>= 1 while m[0] == 0 + end + m << b + end + + def gcd2(int) a = self.abs b = int.abs @@ -270,7 +294,7 @@ end return a end - + def lcm(int) a = self.abs b = int.abs __ ..............................石塚 圭樹@日本ラショナルソフトウェア... ----------------------------------->> e-mail: keiju@rational.com <<---