From a5d3cd4c5cd43a36e2f2232aa1c5e49136696ec1 Mon Sep 17 00:00:00 2001 From: marcandre Date: Sat, 24 Oct 2009 20:55:40 +0000 Subject: * lib/matrix.rb (**): Optimization (up to 45% faster) git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@25457 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 4 ++++ lib/matrix.rb | 16 +++++----------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/ChangeLog b/ChangeLog index da4dc17cc..fce515665 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 b577ef311..3c75751e3 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 -- cgit