# Algebraic Extension Field # # by Shin-ichiro Hara # # Version 1.00 (2002.02.27) require "algebra/polynomial" #require "algebra/m-polynomial" require "algebra/residue-class-ring" require "algebra/polynomial" module Algebra def AlgebraicExtensionField(field, var = "x", &b) AlgebraicExtensionField.create(field, var, &b) end module_function :AlgebraicExtensionField class AlgebraicExtensionField < ResidueClassRing def self.create(field, var_obj) poly_ring = Algebra.Polynomial(field, var_obj) modulus = yield(poly_ring.var) klass = super(poly_ring, modulus) # def klass.var; self[ground.var]; end klass.sysvar :var, klass[klass.ground.var] klass.sysvar :base, field if Algebra::AlgebraicExtensionField >= field env_ring = Algebra.Polynomial(field.env_ring, var_obj) klass.sysvar :def_polys, field.def_polys + [modulus] else env_ring = poly_ring klass.sysvar :def_polys, [modulus] end poly_ring.class_eval <<-__DEF__ def abs_lift if Algebra::AlgebraicExtensionField >= ground project(self.class.env_ring) {|c, n| c.abs_lift } else project(self.class.env_ring) {|c, n| c } end end __DEF__ poly_ring.sysvar :env_ring, env_ring klass.sysvar :env_ring, env_ring klass end def [](n) lift[n] end def abs_lift Algebra::AlgebraicExtensionField >= self.class.base ? lift.abs_lift : lift end def self.to_ary [self, var] end end ################# 2 ################### def AlgebraicExtensionField2(field, var = nil, &b) AlgebraicExtensionField2.create(field, var, &b) end module_function :AlgebraicExtensionField2 class AlgebraicExtensionField2 < ResidueClassRing def self.create(field, var_obj) poly_ring = Algebra.Polynomial(field, var_obj) modulus = yield(poly_ring.var) x = modulus.var if modulus.deg == 2 a = modulus[1] / 2 / modulus[2] modulus = modulus.evaluate(x + a) var_obj ||= "√(" + (modulus[0]/modulus[2]).to_s + ")" poly_ring = Algebra.Polynomial(field, var_obj) x = poly_ring.var modulus = x**2 + a**2 else a = 0 var_obj ||= "x" end klass = super(poly_ring, modulus) klass.sysvar :root, klass[x + a] # def klass.var; self[ground.var]; end klass.sysvar :var, klass[klass.ground.var] klass.sysvar :base, field if Algebra::AlgebraicExtensionField >= field env_ring = Algebra.Polynomial(field.env_ring, var_obj) klass.sysvar :def_polys, field.def_polys + [modulus] else env_ring = poly_ring klass.sysvar :def_polys, [modulus] end poly_ring.class_eval <<-__DEF__ def abs_lift if Algebra::AlgebraicExtensionField >= ground project(self.class.env_ring) {|c, n| c.abs_lift } else project(self.class.env_ring) {|c, n| c } end end __DEF__ poly_ring.sysvar :env_ring, env_ring klass.sysvar :env_ring, env_ring klass end def [](n) lift[n] end def abs_lift Algebra::AlgebraicExtensionField >= self.class.base ? lift.abs_lift : lift end def self.to_ary [self, var] end end end if $0 == __FILE__ end