summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rw-r--r--lib/matrix.rb16
2 files changed, 9 insertions, 11 deletions
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 <ruby-core@marc-andre.ca>
+
+ * lib/matrix.rb (**): Optimization (up to 45% faster)
+
Sat Oct 24 14:28:40 2009 Yukihiro Matsumoto <matz@ruby-lang.org>
* 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