On Mon, 20 Jan 2003, Gavin Sinclair wrote: > - #slice would be a good alias for #minor The problem with #minor is that it's not a minor, it's a slice. A minor is a submatrix such that only one row and one column are missing. The #minor operation allows only 4 possible minors, out of 2*N, and allows lots of things that are not minors. > - Matrix#diagonalize() should return a [M:Matrix,D:Matrix] pair such that > M*D*M.inverse == self > - ** is too slow. Using matrix diagonalisation is a more efficient algorithm > and works for all exponents, not just positive integers. Here is a more > efficient ** > def ** n > m, d = diagonalize > (0...d.row_size).each { |i| d[i,i] **= n } > (m * d * m).inverse > end This is not the code I gave you. I wrote m*d*m.inverse, not (m*d*m).inverse; the parentheses make a big difference. Also: I made a mistake. Some matrices are not diagonalizable, so there should be a fallback to another algorithm. That one can be the existing one, running in O(k*n**3), or it can be a new one, running in O(log(k)*n**3), following the same pattern as the implementation of Bignum#**. (of course those O() marks are slightly wrong, as they depend on the speed of a lot of other methods that may or may not run in their assumed times) > - #r should be something more normal, like #modulus (with #r an alias) #abs is good, especially because (x-y).abs on vectors is a metric. (see http://mathworld.wolfram.com/Metric.html) However it wouldn't be good to think of a matrix determinant as an absolute value, despite mathematicians using the same notation... one reason is that a det can be negative, while abs's are expected not to. ________________________________________________________________ Mathieu Bouchard http://artengine.ca/matju