diff --git a/ChangeLog b/ChangeLog index da4dc17ccd..fce5156655 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +Sun Oct 25 05:44:34 2009 Marc-Andre Lafortune + + * lib/matrix.rb (**): Optimization (up to 45% faster) + Sat Oct 24 14:28:40 2009 Yukihiro Matsumoto * hash.c (rb_hash_set_default_proc): checks arity of defalt_proc diff --git a/lib/matrix.rb b/lib/matrix.rb index b577ef3118..3c75751e37 100644 --- a/lib/matrix.rb +++ b/lib/matrix.rb @@ -642,18 +642,12 @@ class Matrix return Matrix.identity(self.column_size) if other == 0 other = -other end - z = x - n = other - 1 - while n != 0 - while (div, mod = n.divmod(2) - mod == 0) - x = x * x - n = div - end - z *= x - n -= 1 + z = nil + loop do + z = z ? z * x : x if other[0] == 1 + return z if (other >>= 1).zero? + x *= x end - z elsif other.kind_of?(Float) || defined?(Rational) && other.kind_of?(Rational) Matrix.Raise ErrOperationNotDefined, "**" else