#14117: Jordan normal form not computed for nilpotent matrix over rational 
function
field / polynomials cannot be factored over rational function field
------------------------------------------------------------------+---------
       Reporter:  darij                                           |         
Owner:  AlexGhitza  
           Type:  defect                                          |        
Status:  needs_review
       Priority:  major                                           |     
Milestone:  sage-5.10   
      Component:  algebra                                         |    
Resolution:              
       Keywords:  polynomials, factorization, jordan normal form  |   Work 
issues:              
Report Upstream:  N/A                                             |     
Reviewers:              
        Authors:  Darij Grinberg                                  |     Merged 
in:              
   Dependencies:                                                  |      
Stopgaps:              
------------------------------------------------------------------+---------
Changes (by {'newvalue': u'Darij Grinberg', 'oldvalue': ''}):

 * cc: itolkov, sage-combinat (added)
  * status:  new => needs_review
  * author:  => Darij Grinberg


Old description:

> The manual for the jordan_form method on a matrix explicitly claims that
> the Jordan form is computed over arbitrary fields as long as the
> characteristic polynomial splits over there. This should particularly
> imply that the Jordan normal form of a nilpotent matrix is always
> computed. Unfortunately, this is not so:
>
> {{{
> sage: Qx = PolynomialRing(QQ, 'x11, x12, x13, x21, x22, x23, x31, x32,
> x33')
> sage: x11, x12, x13, x21, x22, x23, x31, x32, x33 = Qx.gens()
> sage: M = matrix(Qx, [[0, 0, x31], [0, 0, x21], [0, 0, 0]])
> sage: M**3
> [0 0 0]
> [0 0 0]
> [0 0 0]
> sage: N = M.base_extend(Qx.fraction_field())
> sage: N
> [  0   0 x31]
> [  0   0 x21]
> [  0   0   0]
> sage: N.base_ring()
> Fraction Field of Multivariate Polynomial Ring in x11, x12, x13, x21,
> x22, x23, x31, x32, x33 over Rational Field
> sage: N.jordan_form()
> ---------------------------------------------------------------------------
> NotImplementedError                       Traceback (most recent call
> last)
>
> /home/darij/sage-5.6/<ipython console> in <module>()
>
> /home/darij/sage-5.6/local/lib/python2.7/site-
> packages/sage/matrix/matrix2.so in sage.matrix.matrix2.Matrix.jordan_form
> (sage/matrix/matrix2.c:43627)()
>
> /home/darij/sage-5.6/local/lib/python2.7/site-
> packages/sage/rings/polynomial/polynomial_element.so in
> sage.rings.polynomial.polynomial_element.Polynomial.roots
> (sage/rings/polynomial/polynomial_element.c:35063)()
>
> NotImplementedError: root finding for this polynomial not implemented
> }}}
>
> This seems to boil down to polynomial factorization over function fields
> not being implemented:
>
> {{{
> sage: N.characteristic_polynomial().factor()
> ---------------------------------------------------------------------------
> NotImplementedError                       Traceback (most recent call
> last)
>
> /home/darij/sage-5.6/<ipython console> in <module>()
>
> /home/darij/sage-5.6/local/lib/python2.7/site-
> packages/sage/rings/polynomial/polynomial_element.so in
> sage.rings.polynomial.polynomial_element.Polynomial.factor
> (sage/rings/polynomial/polynomial_element.c:24161)()
>
> NotImplementedError:
> }}}
>
> Unfortunately, I have no idea how to debug, let alone fix, things in C
> code, so I have nothing positive to contribute on this issue. Maybe a
> workaround is adding a new key "nilpotent" to the jordan_form method
> which, when set to True, skips the factorization of the characteristic
> polynomial and lets sage know that the matrix is nilpotent? In my
> personal experience, nilpotent matrices are the ones with the most
> interesting Jordan forms, and skipping the useless factorization would
> probably save quite some CPU cycles for them.

New description:

 The manual for the jordan_form method on a matrix explicitly claims that
 the Jordan form is computed over arbitrary fields as long as the
 characteristic polynomial splits over there. This should particularly
 imply that the Jordan normal form of a nilpotent matrix is always
 computed. Unfortunately, this is not so:

 {{{
 sage: Qx = PolynomialRing(QQ, 'x11, x12, x13, x21, x22, x23, x31, x32,
 x33')
 sage: x11, x12, x13, x21, x22, x23, x31, x32, x33 = Qx.gens()
 sage: M = matrix(Qx, [[0, 0, x31], [0, 0, x21], [0, 0, 0]])
 sage: M**3
 [0 0 0]
 [0 0 0]
 [0 0 0]
 sage: N = M.base_extend(Qx.fraction_field())
 sage: N
 [  0   0 x31]
 [  0   0 x21]
 [  0   0   0]
 sage: N.base_ring()
 Fraction Field of Multivariate Polynomial Ring in x11, x12, x13, x21, x22,
 x23, x31, x32, x33 over Rational Field
 sage: N.jordan_form()
 ---------------------------------------------------------------------------
 NotImplementedError                       Traceback (most recent call
 last)

 /home/darij/sage-5.6/<ipython console> in <module>()

 /home/darij/sage-5.6/local/lib/python2.7/site-
 packages/sage/matrix/matrix2.so in sage.matrix.matrix2.Matrix.jordan_form
 (sage/matrix/matrix2.c:43627)()

 /home/darij/sage-5.6/local/lib/python2.7/site-
 packages/sage/rings/polynomial/polynomial_element.so in
 sage.rings.polynomial.polynomial_element.Polynomial.roots
 (sage/rings/polynomial/polynomial_element.c:35063)()

 NotImplementedError: root finding for this polynomial not implemented
 }}}

 This seems to boil down to polynomial factorization over function fields
 not being implemented:

 {{{
 sage: N.characteristic_polynomial().factor()
 ---------------------------------------------------------------------------
 NotImplementedError                       Traceback (most recent call
 last)

 /home/darij/sage-5.6/<ipython console> in <module>()

 /home/darij/sage-5.6/local/lib/python2.7/site-
 packages/sage/rings/polynomial/polynomial_element.so in
 sage.rings.polynomial.polynomial_element.Polynomial.factor
 (sage/rings/polynomial/polynomial_element.c:24161)()

 NotImplementedError:
 }}}

 Unfortunately, I have no idea how to debug, let alone fix, things in C
 code, so I have nothing positive to contribute on this issue. Maybe a
 workaround is adding a new key "nilpotent" to the jordan_form method
 which, when set to True, skips the factorization of the characteristic
 polynomial and lets sage know that the matrix is nilpotent? In my personal
 experience, nilpotent matrices are the ones with the most interesting
 Jordan forms, and skipping the useless factorization would probably save
 quite some CPU cycles for them.

 '''Update:''' Here's a noobish patch, which adds an optional parameter to
 the jordan_form method allowing pre-computed factorizations of the
 characteristic polynomial. What do you guys think about it?

 (This doesn't mean that we don't need a polynomial factorization algorithm
 for multivariate polynomial rings over QQ; but I guess that's for a
 different patch. We might want to do Jordan forms of, say, nilpotent
 matrices over fields where factorization isn't even theoretically
 possible.)

 * Apply: [attachment:trac_14117-jordan_normal_form-v1.py]

--

-- 
Ticket URL: <http://trac.sagemath.org/sage_trac/ticket/14117#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 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?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to