けいじゅ@日本ラショナルソフトウェアです.

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 <<---