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 --- lib/matrix.rb | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) (limited to 'lib') 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