# HG changeset patch
# User Sebastian Pancratz <sage@pancratz.org>
# Date 1263953776 28800
# Node ID f2d8f1a29da3695146111e36ce58f405e5d93c1a
# Parent  a9ba19c1ec8e3c8173fc3fdc1c5445120af6600d
Adding doctests for Jordan normal form computations, see 6942.

diff -r a9ba19c1ec8e -r f2d8f1a29da3 sage/matrix/matrix2.pyx
--- a/sage/matrix/matrix2.pyx	Tue Jan 19 04:20:49 2010 -0800
+++ b/sage/matrix/matrix2.pyx	Tue Jan 19 18:16:16 2010 -0800
@@ -5447,6 +5447,104 @@
             sage: M=Matrix(1,1,[1])
             sage: M.jordan_form(transformation=True)
             ([1], [1])
+        
+        We now go through three `10 \times 10` matrices to exhibit cases where 
+        there are multiple blocks of the same size::
+        
+            sage: A = matrix(QQ, [[15, 37/3, -16, -104/3, -29, -7/3, 0, 2/3, -29/3, -1/3], [2, 9, -1, -6, -6, 0, 0, 0, -2, 0], [24, 74/3, -41, -208/3, -58, -23/3, 0, 4/3, -58/3, -2/3], [-6, -19, 3, 21, 19, 0, 0, 0, 6, 0], [2, 6, 3, -6, -3, 1, 0, 0, -2, 0], [-96, -296/3, 176, 832/3, 232, 101/3, 0, -16/3, 232/3, 8/3], [-4, -2/3, 21, 16/3, 4, 14/3, 3, -1/3, 4/3, -25/3], [20, 26/3, -66, -199/3, -42, -41/3, 0, 13/3, -55/3, -2/3], [18, 57, -9, -54, -57, 0, 0, 0, -15, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 3]]); A
+            [    15   37/3    -16 -104/3    -29   -7/3      0    2/3  -29/3   -1/3]
+            [     2      9     -1     -6     -6      0      0      0     -2      0]
+            [    24   74/3    -41 -208/3    -58  -23/3      0    4/3  -58/3   -2/3]
+            [    -6    -19      3     21     19      0      0      0      6      0]
+            [     2      6      3     -6     -3      1      0      0     -2      0]
+            [   -96 -296/3    176  832/3    232  101/3      0  -16/3  232/3    8/3]
+            [    -4   -2/3     21   16/3      4   14/3      3   -1/3    4/3  -25/3]
+            [    20   26/3    -66 -199/3    -42  -41/3      0   13/3  -55/3   -2/3]
+            [    18     57     -9    -54    -57      0      0      0    -15      0]
+            [     0      0      0      0      0      0      0      0      0      3]
+            sage: J, T = A.jordan_form(transformation=True); J
+            [3 1 0|0 0 0|0 0 0|0]
+            [0 3 1|0 0 0|0 0 0|0]
+            [0 0 3|0 0 0|0 0 0|0]
+            [-----+-----+-----+-]
+            [0 0 0|3 1 0|0 0 0|0]
+            [0 0 0|0 3 1|0 0 0|0]
+            [0 0 0|0 0 3|0 0 0|0]
+            [-----+-----+-----+-]
+            [0 0 0|0 0 0|3 1 0|0]
+            [0 0 0|0 0 0|0 3 1|0]
+            [0 0 0|0 0 0|0 0 3|0]
+            [-----+-----+-----+-]
+            [0 0 0|0 0 0|0 0 0|3]
+            sage: T * J * T**(-1) == A
+            True
+            sage: T.rank()
+            10
+        
+        ::
+        
+            sage: A = matrix(QQ, [[15, 37/3, -16, -14/3, -29, -7/3, 0, 2/3, 1/3, 44/3], [2, 9, -1, 0, -6, 0, 0, 0, 0, 3], [24, 74/3, -41, -28/3, -58, -23/3, 0, 4/3, 2/3, 88/3], [-6, -19, 3, 3, 19, 0, 0, 0, 0, -9], [2, 6, 3, 0, -3, 1, 0, 0, 0, 3], [-96, -296/3, 176, 112/3, 232, 101/3, 0, -16/3, -8/3, -352/3], [-4, -2/3, 21, 16/3, 4, 14/3, 3, -1/3, 4/3, -25/3], [20, 26/3, -66, -28/3, -42, -41/3, 0, 13/3, 2/3, 82/3], [18, 57, -9, 0, -57, 0, 0, 0, 3, 28], [0, 0, 0, 0, 0, 0, 0, 0, 0, 3]]); A
+            [    15   37/3    -16  -14/3    -29   -7/3      0    2/3    1/3   44/3]
+            [     2      9     -1      0     -6      0      0      0      0      3]
+            [    24   74/3    -41  -28/3    -58  -23/3      0    4/3    2/3   88/3]
+            [    -6    -19      3      3     19      0      0      0      0     -9]
+            [     2      6      3      0     -3      1      0      0      0      3]
+            [   -96 -296/3    176  112/3    232  101/3      0  -16/3   -8/3 -352/3]
+            [    -4   -2/3     21   16/3      4   14/3      3   -1/3    4/3  -25/3]
+            [    20   26/3    -66  -28/3    -42  -41/3      0   13/3    2/3   82/3]
+            [    18     57     -9      0    -57      0      0      0      3     28]
+            [     0      0      0      0      0      0      0      0      0      3]
+            sage: J, T = A.jordan_form(transformation=True); J
+            [3 1 0|0 0 0|0 0|0 0]
+            [0 3 1|0 0 0|0 0|0 0]
+            [0 0 3|0 0 0|0 0|0 0]
+            [-----+-----+---+---]
+            [0 0 0|3 1 0|0 0|0 0]
+            [0 0 0|0 3 1|0 0|0 0]
+            [0 0 0|0 0 3|0 0|0 0]
+            [-----+-----+---+---]
+            [0 0 0|0 0 0|3 1|0 0]
+            [0 0 0|0 0 0|0 3|0 0]
+            [-----+-----+---+---]
+            [0 0 0|0 0 0|0 0|3 1]
+            [0 0 0|0 0 0|0 0|0 3]
+            sage: T * J * T**(-1) == A
+            True
+            sage: T.rank()
+            10
+        
+        ::
+        
+            sage: A = matrix(QQ, [[15, 37/3, -16, -104/3, -29, -7/3, 35, 2/3, -29/3, -1/3], [2, 9, -1, -6, -6, 0, 7, 0, -2, 0], [24, 74/3, -29, -208/3, -58, -14/3, 70, 4/3, -58/3, -2/3], [-6, -19, 3, 21, 19, 0, -21, 0, 6, 0], [2, 6, -1, -6, -3, 0, 7, 0, -2, 0], [-96, -296/3, 128, 832/3, 232, 65/3, -279, -16/3, 232/3, 8/3], [0, 0, 0, 0, 0, 0, 3, 0, 0, 0], [20, 26/3, -30, -199/3, -42, -14/3, 70, 13/3, -55/3, -2/3], [18, 57, -9, -54, -57, 0, 63, 0, -15, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 3]]); A
+            [    15   37/3    -16 -104/3    -29   -7/3     35    2/3  -29/3   -1/3]
+            [     2      9     -1     -6     -6      0      7      0     -2      0]
+            [    24   74/3    -29 -208/3    -58  -14/3     70    4/3  -58/3   -2/3]
+            [    -6    -19      3     21     19      0    -21      0      6      0]
+            [     2      6     -1     -6     -3      0      7      0     -2      0]
+            [   -96 -296/3    128  832/3    232   65/3   -279  -16/3  232/3    8/3]
+            [     0      0      0      0      0      0      3      0      0      0]
+            [    20   26/3    -30 -199/3    -42  -14/3     70   13/3  -55/3   -2/3]
+            [    18     57     -9    -54    -57      0     63      0    -15      0]
+            [     0      0      0      0      0      0      0      0      0      3]
+            sage: J, T = A.jordan_form(transformation=True); J
+            [3 1 0|0 0|0 0|0 0|0]
+            [0 3 1|0 0|0 0|0 0|0]
+            [0 0 3|0 0|0 0|0 0|0]
+            [-----+---+---+---+-]
+            [0 0 0|3 1|0 0|0 0|0]
+            [0 0 0|0 3|0 0|0 0|0]
+            [-----+---+---+---+-]
+            [0 0 0|0 0|3 1|0 0|0]
+            [0 0 0|0 0|0 3|0 0|0]
+            [-----+---+---+---+-]
+            [0 0 0|0 0|0 0|3 1|0]
+            [0 0 0|0 0|0 0|0 3|0]
+            [-----+---+---+---+-]
+            [0 0 0|0 0|0 0|0 0|3]
+            sage: T * J * T**(-1) == A
+            True
+            sage: T.rank()
+            10
         """
         from sage.matrix.constructor import block_diagonal_matrix, jordan_block, diagonal_matrix
         from sage.combinat.partition import Partition
@@ -5553,38 +5651,6 @@
                         chain.reverse()
                         Y.extend(chain)
                         jordan_chains[eval].append(chain)
-                    """
-                    if l == max(block_sizes):
-                        # Let v be any vector in `\ker B^l` not in the kernel 
-                        # of `\ker B^{l-1}`, and start a chain from there.
-                        v = _jordan_form_vector_in_difference(Vlarge, Vsmall)
-                        chain = [v]
-                        for i in range(l-1):
-                            chain.append(B*chain[-1])
-                        chain.reverse()
-                        Y.extend(chain)
-                        jordan_chains[eval].append(chain)
-                        
-                        for i in range(1,count):
-                            # Find v in `\ker B^l` but not in `\ker B^{l-1}` 
-                            # and also not in span(Y).
-                            v = _jordan_form_vector_in_difference(Vlarge, Vsmall+Y)
-                            chain = [v]
-                            for i in range(l-1):
-                                chain.append(B*chain[-1])
-                            chain.reverse()
-                            Y.extend(chain)
-                            jordan_chains[eval].append(chain)
-                    else:
-                        for i in range(count):
-                            v = _jordan_form_vector_in_difference(Vlarge, Vsmall+Y)
-                            chain = [v]
-                            for i in range(l-1):
-                                chain.append(B*chain[-1])
-                            chain.reverse()
-                            Y.extend(chain)
-                            jordan_chains[eval].append(chain)
-                    """
             
             # Now ``jordan_chains`` has all the columns of the transformation 
             # matrix; we just need to put them in the right order.
