# Test of Cayley-Hamilton's Theory
#
# by Shin-ichiro Hara
#
# Version 1.0 (2001.04.08)
require "algebra/matrix-algebra"
require "algebra/m-polynomial"
require "algebra/polynomial"
require "algebra/polynomial-converter"
include Algebra
n = Integer(ARGV.shift || 2)
$mul = ARGV.shift
case n
when 2
unless $mul
R = MPolynomial(Integer)
a, b, c, d = R.vars("abcd")
else
R = Polynomial.over(Integer, *"abcd".scan(/./))
a, b, c, d = R.vars
end
Rx = Polynomial(R, "x")
x = Rx.var
M2 = SquareMatrix(Rx, 2)
m = M2[
[a, b],
[c, d]
]
when 3
unless $mul
R = MPolynomial(Integer)
a, b, c, d, e, f, g, h, i, j = R.vars("abcdefghij")
else
R = Polynomial.over(Integer, *"abcdefghi".scan(/./))
a, b, c, d, e, f, g, h, i = R.vars
end
Rx = Polynomial(R, "x")
x = Rx.var
M3 = SquareMatrix(Rx, 3)
m = M3[
[a, b, c],
[d, e, f],
[g, h, i]
]
else
unless $mul
if true
R = MPolynomial(Integer)
MR = SquareMatrix(R, n)
m = MR.matrix{|i, j| R.var("x#{i}#{j}") }
Rx = Polynomial(R, "x")
ch = m.char_polynomial(Rx)
p ch.evaluate(m)
exit
else
R = MPolynomial(Integer)
Rx = Polynomial(R, "x")
M = SquareMatrix(Rx, n)
m = M.matrix{|i, j| R.var("x#{i}#{j}") }
x = Rx.var
end
else
puts "not implemented."
exit
end
end
p m
p (x - m)
det = (x - m).determinant
p det
p det.evaluate(m)
syntax highlighted by Code2HTML, v. 0.9.1