Bug #17521


[Matrix stdlib] Zero matrix to the power of zero

Added by Kache (Kevin Cheng) over 3 years ago. Updated about 3 years ago.

Target version:
ruby -v:
ruby 2.7.2p137 (2020-10-01 revision 5445e04352) [x86_64-msys]


Just like 0**0 == 1,**0 == Matrix.identity(n) should be true for all n:


$ ruby -e "require 'matrix';**0"
Traceback (most recent call last):
        5: from -e:1:in `<main>'
        4: from /usr/lib/ruby/2.7.0/matrix.rb:1227:in `**'
        3: from /usr/lib/ruby/2.7.0/matrix.rb:1165:in `inverse'
        2: from /usr/lib/ruby/2.7.0/matrix.rb:1173:in `inverse_from'
        1: from /usr/lib/ruby/2.7.0/matrix.rb:1173:in `upto'
/usr/lib/ruby/2.7.0/matrix.rb:1183:in `block in inverse_from': Not Regular Matrix (ExceptionForMatrix::ErrNotRegular)**0.0 happens to work properly, but it should work for integers as well.
Wasn't able to test in Ruby 3.0, but its source code suggests it also behaves this way.

For comparison, Python's numpy:

Python 3.8.2 (default, Feb 26 2020, 02:56:10)
>> import numpy as np
>> np.linalg.matrix_power(np.array([[0,0],[0,0]]), 0)
array([[1, 0],
       [0, 1]])

Updated by Kache (Kevin Cheng) over 3 years ago

I find thatspecs declare this as intended behavior:

      it "raises a ErrDimensionMismatch for irregular matrices" do
        m = Matrix[ [1, 1], [1, 1] ]
        -> { m ** -2 }.should raise_error(Matrix::ErrNotRegular)
        -> { m ** 0 }.should raise_error(Matrix::ErrNotRegular)

And Python's numpy, again:

>> np.linalg.matrix_power(np.array([[1,1],[1,1]]), 0)
array([[1, 0],
       [0, 1]])

In my (basic) understanding, 0^0 is technically indeterminate, but it's generally more useful to define 0^0 = 1 for most contexts. As such, 0**0 == 1 in Ruby as well.

Is that not the case for M(n)^(0) = I(n)?

Updated by marcandre (Marc-Andre Lafortune) over 3 years ago

  • Status changed from Open to Assigned
  • Assignee set to marcandre (Marc-Andre Lafortune)

Congratulations on finding the oldest bug in Ruby ever! 🎉

This bug will be 23 years old in a week; it dates from the commit "Initial revision" 3db12e8b23

I should have realized this when I refactored it later on and added the spec though.

Actions #3

Updated by Anonymous over 3 years ago

  • Status changed from Assigned to Closed

Applied in changeset git|d8c8b79d24bf0f3177535501ad9b801e552fb2ad.

[ruby/matrix] Fix 0-th power [Bug #17521] (#4047)

Updated by nagachika (Tomoyuki Chikanaga) about 3 years ago

  • Backport changed from 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN to 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: WONTFIX

Even though nobody filled the Backport field yet, I will set "WONTFIX".
Such a long long standing bug could be thought as an spec, and some application could be depended by current behavior.
usa-san, do you have any opinion?

And the related test in rubyspec is failing on ruby_3_0 branch because the test seems expected this change is going to be backported into 3.0.x.
I will send a pull request to ruby/spec repo soon.

Updated by marcandre (Marc-Andre Lafortune) about 3 years ago

Since matrix is a gem that can be updated independently from Ruby, I think backports are not required. In addition, this bug is very minor.


Also available in: Atom PDF