#15835: Smith Normal Form Integers Mod 2 TypeError: submatrix() takes exactly 4
positional arguments(2 given)
------------------------------+----------------------------
Reporter: andrewsilver | Owner:
Type: defect | Status: new
Priority: minor | Milestone: sage-6.2
Component: linear algebra | Keywords:
Merged in: | Authors:
Reviewers: | Report Upstream: N/A
Work issues: | Branch:
Commit: | Dependencies:
Stopgaps: |
------------------------------+----------------------------
Try (Mac OS X Current Version, Current Sage Version):
A = Matrix(IntegerModRing(2),[[1,0,2],[1,0,1]])
A.smith_form()
You get the error:
> TypeError Traceback (most recent call
> last) <ipython-input-6-23e95c6be019> in <module>() ----> 1
> A.smith_form()
> /Users/.../builds/sage-6.1.1/local/lib/python2.7/site-
packages/sage/matrix/matrix2.so
> in sage.matrix.matrix2.Matrix.smith_form
> (sage/matrix/matrix2.c:60007)()
> /Users/.../builds/sage-6.1.1/local/lib/python2.7/site-
packages/sage/matrix/matrix_mod2_dense.so
> in sage.matrix.matrix_mod2_dense.Matrix_mod2_dense.submatrix
> (sage/matrix/matrix_mod2_dense.c:10429)()
> TypeError: submatrix() takes exactly 4 positional arguments (2
> given)
This error does not appear for calculations over the integers mod 3
With the advice from https://groups.google.com/forum/#!topic/sage-
devel/7F5xUQFcfXE, I went ahead and created what looks like a patch (to
me, anyway):
Inside the smith_form() function in matrix2.pyx:
We have: mm = t.submatrix(1,1) on line 12413.
The sub matrix function takes five parameters (self, starting row,
starting col, # sub matrix rows, # sub matrix columns). From observation,
the 1,1 is the starting row/col respectively. Somehow the function is
unable to determine ncols and nrows when using the integers mod 2, but
after some trial and error I discovered a potential patch:
submatrix_rows = t.rows -1
submatrix_cols = t.cols - 1
mm = t.submatrix(1,1, submatrix_rows, submatrix,cols)
The above modification gives the same answers as all the examples in the
source code. I tested a couple of other things:
Mod 3 Example:
A = Matrix(Integers(3),[[1,0,2],[1,0,1],[1,1,1]])
[1 0 0] [1 0 0] [1 0 1]
[0 1 0] [2 0 1] [0 1 1]
[0 0 1], [1 2 0], [0 0 1]
(same for mod 3 in current master and modified version)
Example mod 2 (not computable in current version of Sage - checked with
hand computation - good luck checking it!) -
sage: C =
Matrix(IntegerModRing(2),[[1,0,1,0],[1,1,0,0],[0,1,1,0],[1,0,0,1],[0,0,1,1],[0,1,0,1]])
sage: C.smith_form()
(
[1 0 0 0] [1 0 0 0 0 0]
[0 1 0 0] [1 1 0 0 0 0]
[0 0 1 0] [1 0 0 1 0 0] [1 0 1 1]
[0 0 0 0] [1 1 1 0 0 0] [0 1 1 1]
[0 0 0 0] [1 0 0 1 1 0] [0 0 1 1]
[0 0 0 0], [0 1 0 1 0 1], [0 0 0 1]
)
sage: t,u,v=C.smith_form()
sage: u.inverse()
[1 0 0 0 0 0]
[1 1 0 0 0 0]
[0 1 0 1 0 0]
[1 0 1 0 0 0]
[0 0 1 0 1 0]
[0 1 1 0 0 1]
--
Ticket URL: <http://trac.sagemath.org/ticket/15835>
Sage <http://www.sagemath.org>
Sage: Creating a Viable Open Source Alternative to Magma, Maple, Mathematica,
and MATLAB
--
You received this message because you are subscribed to the Google Groups
"sage-trac" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sage-trac.
For more options, visit https://groups.google.com/groups/opt_out.