require "rubyunit"
require "algebra/rational"
#class Rational < Numeric;def inspect; to_s; end;end
class Rational;def inspect; to_s; end;end
require "algebra/linear-algebra"
#include Algebra
class TestDiagonalize < Runit
def test_diagonalize
m = Algebra.SquareMatrix(Rational, 4)
as = [
m.symmetric(1, 0, 1, 0, 1, 0, 1, 0, 1, 0), ## 2 sec.
m.symmetric(1, 1, 1, 0, 1, 0, 1, 0, 1, 0), # 100 sec.
]
as.each_with_index do |m0, i|
tmatrix, extfield, evalues, elms = _test_diagonalize(m0)
m1 = Algebra.SquareMatrix(extfield, 4)
a, b, c, d = elms
case i
when 0
ans = m1[
[ -1, 1, -a - 1, a - 1],
[1, 1, -1, -1],
[-1, 1, a + 1, -a + 1],
[1, 1, 1, 1],
]
=begin
ans = m[
[-1, 1, 1, a - 1],
[1, 1, 1, -1],
[-1, 1, 1, -a + 1],
[1, 1, 1, 1],
]
=end
when 1
ans = m1[
[a**2 - a - 2, -a**2 + a + 1,
(-a**3 + 2*a**2 + a - 1)*b + a**3 - 2*a**2 - a,
(a**3 - 2*a**2 - a + 1)*b - a**3 + 2*a**2 + a - 1],
[a**3 - 2*a**2 - a + 2, a**3 - 2*a**2 - a + 2,
-a**3 + 2*a**2 + a - 1, -a**3 + 2*a**2 + a - 1],
[-a**3 + 2*a**2 + 2*a - 2, -a + 1, b + a**3 - 2*a**2 - a + 1,
-b + 1],
[1, 1, 1, 1]
]
=begin
ans = m[
[a**2 - a - 2, (-a**3 + 2*a**2 + a - 1)*b + a**3 - 2*a**2 - a, -a**2 + a + 1, (a**3 - 2*a**2 - a + 1)*b - a**3 + 2*a**2 + a - 1],
[a**3 - 2*a**2 - a + 2, -a**3 + 2*a**2 + a - 1, a**3 - 2*a**2 - a + 2, -a**3 + 2*a**2 + a - 1],
[-a**3 + 2*a**2 + 2*a - 2, b + a**3 - 2*a**2 - a + 1, -a + 1, -b + 1],
[1, 1, 1, 1],
]
=end
end
# sleep 1
assert_equal(ans, tmatrix)
end
end
def _test_diagonalize(a)
puts "A = "; a.display; puts
extfield, proots, tmatrix, evalues, elms, evectors, espaces,
chpoly, facts = a.diagonalize
puts "Charactristic Polynomial: #{chpoly}"
puts " => #{facts}"
puts
puts "Algebraic Numbers:"
proots.each do |po, rs|
puts "#{rs.join(', ')} : roots of #{po} == 0"
end
puts
puts "Eigen Spaces: "
evalues.uniq.each do |ev|
puts "W_{#{ev}} = <#{espaces[ev].join(', ')}>"
end
puts
puts "P = "; tmatrix.display; puts
q = tmatrix.inverse
puts "P^-1 = "; q.display; puts
puts "P^-1 * A * P = "; (q * a * tmatrix).display; puts
[tmatrix, extfield, evalues, elms]
end
end
Tests(TestDiagonalize)
syntax highlighted by Code2HTML, v. 0.9.1