require 'matrix' class Affine def initialize(m,v) @matrix=m @vector=v end def ==(other) return false unless Affine === other @matrix == other.matrix and @vector == other.vector end alias eql? == def +(n) # a is affine or number case(n) when Vector return Affine::new(@matrix,@vector+n) else return 1 end end def -(n) # a is affine or number case(n) when Vector return Affine::new(@matrix,@vector-n) else return 1 end end def *(n) # a is affine or number or vector case(n) when Numeric return Affine::new(@matrix*n,@vector*n) when Vector return @matrix*n+@vector when Affine return Affine::new(@matrix*n.matrix,@matrix*n.vector+@vector) else return 1 end end def inverse i=@matrix.inverse return Affine::new(i,i*@vector*(-1)) end alias inv inverse def determinant return @matrix.determinant end alias det determinant def trace return @matrix.trace end alias tr trace def to_s self.matrix.to_s+":"+self.vector.to_s end attr_reader :matrix attr_reader :vector end #class