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

In [ruby-list :17059 ] the message: "[ruby-list:17059] ", on Sep/23
23:51(JST) "Nishikawa,Yasuhiro" writes:

>にゃす といいます。初めまして。

ども.

>突然でなんなのですが、
>ruby-1.4.2付属のmatrix.rbのrankメソッドで問題を見つけましたのでご報告します。
>以下のテスト用スクリプトで、零行列以外ランクが3になってます。
>=================
>require 'matrix'
>
>def printfa m
>  print m.to_s,"\n"
>  print m.rank,"\n"
>end
>printfa Matrix[ [0,0,0],[0,0,0],[0,0,0] ]  #rank 0
>printfa Matrix[ [1,2,3],[2,4,6],[3,6,9] ]  #rank 1
>printfa Matrix[ [1,2,3],[2,4,6],[1,1,1] ]  #rank 2
>printfa Matrix[ [1,2,3],[2,3,4],[3,9,27] ] #rank 3
>
>==================
>
>matrix.rbに対するパッチは
>622c622
><       i = -1
>---
>>       i = k
>
>です。

おお. 気が付かなかった(^^;;; でも, さらにバグを見つけてしまいました
(^^;;;;

>#数値モノはやっかいですね...

ですね... 特異(境界)点回りのテストが難しい...

>なぜ見つけたかというと、これを参考に別プログラム作ってて動かなかった
>からなのでした。(ライブラリの中もなにかと使わせていただいてます)

どもどもです.

以下にパッチを流します. 松本さん更新お願いしますね.

-- ここから
diff -u -r1.9 matrix.rb
--- matrix.rb	1999/08/24 10:25:00	1.9
+++ matrix.rb	1999/10/06 11:02:08
@@ -2,8 +2,8 @@
 #
 #   matrix.rb - 
 #   	$Release Version: 1.0$
-#   	$Revision: 1.9 $
-#   	$Date: 1999/08/24 10:25:00 $
+#   	$Revision: 1.11 $
+#   	$Date: 1999/10/06 11:01:53 $
 #       Original Version from Smalltalk-80 version
 #	   on July 23, 1985 at 8:37:17 am
 #   	by Keiju ISHITSUKA
@@ -186,7 +186,7 @@
 end
 
 class Matrix
-  @RCS_ID='-$Id: matrix.rb,v 1.9 1999/08/24 10:25:00 keiju Exp $-'
+  @RCS_ID='-$Id: matrix.rb,v 1.11 1999/10/06 11:01:53 keiju Exp keiju $-'
   
 #  extend Exception2MessageMapper
   include ExceptionForMatrix
@@ -621,17 +621,36 @@
     k = 0
     begin
       if (akk = a[k][k]) == 0
-	i = -1
-	nothing = FALSE
+	i = k
+	exists = true
 	begin
 	  if (i += 1) > column_size - 1
-	    nothing = TRUE
+	    exists = false
 	    break
 	  end
 	end while a[i][k] == 0
-	next if nothing
-	a[i], a[k] = a[k], a[i]
-	akk = a[k][k]
+	if exists
+	  a[i], a[k] = a[k], a[i]
+	  akk = a[k][k]
+	else
+	  i = k
+	  exists = true
+	  begin
+	    if (i += 1) > row_size - 1
+	      exists = false
+	      break
+	    end
+	  end while a[k][i] == 0
+	  if exists
+	    k.upto(column_size - 1) do
+	      |j|
+	      a[j][k], a[j][i] = a[j][i], a[j][k]
+	    end
+	    akk = a[k][k]
+	  else
+	    next
+	  end
+	end
       end
       (k + 1).upto(row_size - 1) do
 	|i|

__
..............................石塚 圭樹@日本ラショナルソフトウェア...
----------------------------------->> e-mail: keiju / rational.com <<---