#10625: inverse_mod for integer ring won't take an ideal as argument
-----------------------+----------------------------------------------------
   Reporter:  rbeezer  |       Owner:  AlexGhitza
       Type:  defect   |      Status:  new       
   Priority:  major    |   Milestone:  sage-4.6.2
  Component:  algebra  |    Keywords:            
     Author:           |    Upstream:  N/A       
   Reviewer:           |      Merged:            
Work_issues:           |  
-----------------------+----------------------------------------------------

Old description:

> The generic Smith Form routine fails for integer matrices, making me
> suspicious it needs some attention.  The specialized version for integer
> matrices seems fine, so this is not a problem per se, just evidence
> something is amiss.  Here's the evidence, obtained by shipping in a
> sparse matrix - this should soon be fixed by sending sparse matrices to
> the working dense version.  So if you test this ''use something like
> 4.6.1 or earlier''.
>
> {{{
> sage: A = matrix(2,range(4), sparse=True)
> sage: A.smith_form()
> ---------------------------------------------------------------------------
> TypeError                                 Traceback (most recent call
> last)
>
> /home/sage/sage-4.6.1.alpha2/<ipython console> in <module>()
>
> /home/sage/sage-4.6.1.alpha2/local/lib/python2.6/site-
> packages/sage/matrix/matrix2.so in sage.matrix.matrix2.Matrix.smith_form
> (sage/matrix/matrix2.c:37477)()
>
> /home/sage/sage-4.6.1.alpha2/local/lib/python2.6/site-
> packages/sage/matrix/matrix2.so in sage.matrix.matrix2._smith_onestep
> (sage/matrix/matrix2.c:42366)()
>
> /home/sage/sage-4.6.1.alpha2/local/lib/python2.6/site-
> packages/sage/matrix/matrix2.so in sage.matrix.matrix2._smith_onestep
> (sage/matrix/matrix2.c:42181)()
>
> /home/sage/sage-4.6.1.alpha2/local/lib/python2.6/site-
> packages/sage/matrix/matrix2.so in
> sage.matrix.matrix2._generic_clear_column (sage/matrix/matrix2.c:41049)()
>
> /home/sage/sage-4.6.1.alpha2/local/lib/python2.6/site-
> packages/sage/rings/integer.so in sage.rings.integer.Integer.inverse_mod
> (sage/rings/integer.c:28740)()
>
> /home/sage/sage-4.6.1.alpha2/local/lib/python2.6/site-
> packages/sage/rings/integer.so in sage.rings.integer.as_Integer
> (sage/rings/integer.c:6052)()
>
> /home/sage/sage-4.6.1.alpha2/local/lib/python2.6/site-
> packages/sage/rings/integer.so in sage.rings.integer.Integer.__init__
> (sage/rings/integer.c:7312)()
>
> TypeError: unable to coerce <class 'sage.rings.ideal.Ideal_pid'> to an
> integer
> }}}
>
> On the input above, I think the failure is in
> `sage.matrix.matrix2._generic_clear_column` at the line:
>
> {{{
> c = R(a[0,0] / B).inverse_mod(R.ideal(a[k,0] / B))
> }}}
>
> which would be
>
> {{{
> ZZ(2/1).inverse_mod(ZZ.ideal(3/1))
> }}}
>
> which by itself fails in a similar fashion.
>
> Can you place an ideal inside `Integer.inverse_mod`?

New description:

 The top level {{{inverse_mod}}} method for ring elements (in
 {{{sage.structure.element.RingElement}}}) mandates that {{{inverse_mod}}}
 should always take an ideal of the ring as its argument. The integer ring
 doesn't implement this correctly:

 {{{
 sage: ZZ(2).inverse_mod(ZZ.ideal(3))
 ---------------------------------------------------------------------------
 TypeError                                 Traceback (most recent call
 last)

 /storage/masiao/sage-4.6.2.alpha0/devel/sage-reviewing/sage/rings/<ipython
 console> in <module>()

 /usr/local/sage/sage-4.6.1/local/lib/python2.6/site-
 packages/sage/rings/integer.so in sage.rings.integer.Integer.inverse_mod
 (sage/rings/integer.c:28740)()
    5161         cdef Integer ans = <Integer>PY_NEW(Integer)
    5162         if mpz_cmp_ui(m.value, 1) == 0:
 -> 5163             return zero
    5164         sig_on()
    5165         r = mpz_invert(ans.value, self.value, m.value)

 /usr/local/sage/sage-4.6.1/local/lib/python2.6/site-
 packages/sage/rings/integer.so in sage.rings.integer.as_Integer
 (sage/rings/integer.c:6052)()
     365         return <Integer>x
     366     else:
 --> 367         return Integer(x)
     368
     369 cdef class IntegerWrapper(Integer):

 /usr/local/sage/sage-4.6.1/local/lib/python2.6/site-
 packages/sage/rings/integer.so in sage.rings.integer.Integer.__init__
 (sage/rings/integer.c:7312)()
     678                         pass
     679
 --> 680                 raise TypeError, "unable to coerce %s to an
 integer" % type(x)
     681
     682     def __reduce__(self):

 TypeError: unable to coerce <class 'sage.rings.ideal.Ideal_pid'> to an
 integer
 }}}

 This causes issues with the generic Smith form implementation applied to
 integer matrices. Here's the evidence, obtained by shipping in a sparse
 matrix - this should soon be fixed by sending sparse matrices to the
 working dense version.  So if you test this ''use something like 4.6.1 or
 earlier''.

 {{{
 sage: A = matrix(2,range(4), sparse=True)
 sage: A.smith_form()
 ---------------------------------------------------------------------------
 TypeError                                 Traceback (most recent call
 last)

 /home/sage/sage-4.6.1.alpha2/<ipython console> in <module>()

 /home/sage/sage-4.6.1.alpha2/local/lib/python2.6/site-
 packages/sage/matrix/matrix2.so in sage.matrix.matrix2.Matrix.smith_form
 (sage/matrix/matrix2.c:37477)()

 /home/sage/sage-4.6.1.alpha2/local/lib/python2.6/site-
 packages/sage/matrix/matrix2.so in sage.matrix.matrix2._smith_onestep
 (sage/matrix/matrix2.c:42366)()

 /home/sage/sage-4.6.1.alpha2/local/lib/python2.6/site-
 packages/sage/matrix/matrix2.so in sage.matrix.matrix2._smith_onestep
 (sage/matrix/matrix2.c:42181)()

 /home/sage/sage-4.6.1.alpha2/local/lib/python2.6/site-
 packages/sage/matrix/matrix2.so in
 sage.matrix.matrix2._generic_clear_column (sage/matrix/matrix2.c:41049)()

 /home/sage/sage-4.6.1.alpha2/local/lib/python2.6/site-
 packages/sage/rings/integer.so in sage.rings.integer.Integer.inverse_mod
 (sage/rings/integer.c:28740)()

 /home/sage/sage-4.6.1.alpha2/local/lib/python2.6/site-
 packages/sage/rings/integer.so in sage.rings.integer.as_Integer
 (sage/rings/integer.c:6052)()

 /home/sage/sage-4.6.1.alpha2/local/lib/python2.6/site-
 packages/sage/rings/integer.so in sage.rings.integer.Integer.__init__
 (sage/rings/integer.c:7312)()

 TypeError: unable to coerce <class 'sage.rings.ideal.Ideal_pid'> to an
 integer
 }}}

--

Comment(by davidloeffler):

 I don't mean to seem hostile, but: I wrote the generic Smith and Hermite
 form code, and I used no assumptions on the methods of the ring elements
 other than those mandated by the docstrings of the top-level
 {{{sage.structure.element.RingElement}}} class. The problem is that the
 Integer class doesn't play by the rules (because it's so routine to
 confuse an ideal of ZZ with its non-negative generator).

 So the solution is not to change the Smith form code, but to add a couple
 of lines to {{{Integer.inverse_mod}}} to make it consistent with the
 general ring element template.

-- 
Ticket URL: <http://trac.sagemath.org/sage_trac/ticket/10625#comment:1>
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 post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/sage-trac?hl=en.

Reply via email to