require "algebra"

M4 = SquareMatrix(Rational, 4)
m = M4[
    [-1, 1, 2, -1],
    [-5, 3, 4, -2],
    [3, -1, 0, 1],
    [5, -2, -2, 3]
]
m.jordan_form.display; #=>
#  2,   0,   0,   0
#  0,   1,   1,   0
#  0,   0,   1,   1
#  0,   0,   0,   1
puts

#-----------------------------------
m = M4[
  [3, 1, -1, 1],
  [-3, -1, 3, -1],
  [-2, -2, 0, 0],
  [0, 0, -4, 2]
]
jf, pt, qt, field, modulus  = m.jordan_form_info
p modulus #=> [a^2 + 4]
jf.display; puts #=>
#  2,   1,   0,   0
#  0,   2,   0,   0
#  0,   0,   a,   0
#  0,   0,   0,  -a

m = m.convert_to(jf.class)
p jf == pt * m * qt #=> true

#-----------------------------------
m = M4[
    [-1, 1, 2, -1],
    [-5, 3, 4, -2],
    [3, -1, 0, 1],
    [5, -2, -2, 0]
]
jf, pt, qt, field, modulus  = m.jordan_form_info
p modulus #=> [a^3 + 3a - 1, b^2 + ab + a^2 + 3]
jf.display; puts #=>
#  2,   0,   0,   0
#  0,   a,   0,   0
#  0,   0,   b,   0
#  0,   0,   0, -b - a

m = m.convert_to(jf.class)
p jf == pt * m * qt #=> true


syntax highlighted by Code2HTML, v. 0.9.1