def _singular_(self, singular=singular): r""" Returns a singular ring for this polynomial ring. Currently `\QQ`, `{\rm GF}(p), {\rm GF}(p^n)`, `\CC`, `\RR`, `\ZZ` and `\ZZ/n\ZZ` are supported. INPUT: - ``singular`` - Singular instance OUTPUT: Singular ring matching this ring EXAMPLES:: sage: R.<x,y> = PolynomialRing(CC,'x',2) sage: singular(R) // characteristic : 0 (complex:15 digits, additional 0 digits) // 1 parameter : I // minpoly : (I^2+1) // number of vars : 2 // block 1 : ordering dp // : names x y // block 2 : ordering C sage: R.<x,y> = PolynomialRing(RealField(100),'x',2) sage: singular(R) // characteristic : 0 (real:29 digits, additional 0 digits) // number of vars : 2 // block 1 : ordering dp // : names x y // block 2 : ordering C sage: w = var('w') sage: R.<x> = PolynomialRing(NumberField(w^2+1,'s')) sage: singular(R) // characteristic : 0 // 1 parameter : s // minpoly : (s^2+1) // number of vars : 1 // block 1 : ordering lp // : names x // block 2 : ordering C sage: R = PolynomialRing(GF(127),1,'x') sage: singular(R) // characteristic : 127 // number of vars : 1 // block 1 : ordering lp // : names x // block 2 : ordering C sage: R = PolynomialRing(QQ,1,'x') sage: singular(R) // characteristic : 0 // number of vars : 1 // block 1 : ordering lp // : names x // block 2 : ordering C sage: R = PolynomialRing(QQ,'x') sage: singular(R) // characteristic : 0 // number of vars : 1 // block 1 : ordering lp // : names x // block 2 : ordering C sage: R = PolynomialRing(GF(127),'x') sage: singular(R) // characteristic : 127 // number of vars : 1 // block 1 : ordering lp // : names x // block 2 : ordering C sage: R = Frac(ZZ['a,b'])['x,y'] sage: singular(R) // characteristic : 0 // 2 parameter : a b // minpoly : 0 // number of vars : 2 // block 1 : ordering dp // : names x y // block 2 : ordering C sage: R = IntegerModRing(1024)['x,y'] sage: singular(R) // coeff. ring is : Z/2^10 // number of vars : 2 // block 1 : ordering dp // : names x y // block 2 : ordering C sage: R = IntegerModRing(15)['x,y'] sage: singular(R) // coeff. ring is : Z/15 // number of vars : 2 // block 1 : ordering dp // : names x y // block 2 : ordering C sage: R = ZZ['x,y'] sage: singular(R) // coeff. ring is : Integers // number of vars : 2 // block 1 : ordering dp // : names x y // block 2 : ordering C sage: k.<a> = FiniteField(25) sage: R = k['x'] sage: K = R.fraction_field() sage: S = K['y'] sage: singular(S) // characteristic : 5 // 1 parameter : x // minpoly : 0 // number of vars : 2 // block 1 : ordering lp // : names a y // block 2 : ordering C // quotient ring from ideal _[1]=a2-a+2 .. warning:: - If the base ring is a finite extension field or a number field the ring will not only be returned but also be set as the current ring in Singular. - Singular represents precision of floating point numbers base 10 while Sage represents floating point precision base 2. """ try: R = self.__singular if not (R.parent() is singular): raise ValueError R._check_valid() if self.base_ring() is ZZ or self.base_ring().is_prime_field(): return R if sage.rings.finite_rings.finite_field_constructor.is_FiniteField(self.base_ring()) or\ (number_field.number_field_base.is_NumberField(self.base_ring()) and self.base_ring().is_absolute()): R.set_ring() #sorry for that, but needed for minpoly if singular.eval('minpoly') != "(" + self.__minpoly + ")": singular.eval("minpoly=%s"%(self.__minpoly)) self.__minpoly = singular.eval('minpoly')[1:-1] return R except (AttributeError, ValueError): return self._singular_init_(singular)
def _singular_(self, singular=singular): r""" Returns a singular ring for this polynomial ring. Currently `\QQ`, `{\rm GF}(p), {\rm GF}(p^n)`, `\CC`, `\RR`, `\ZZ` and `\ZZ/n\ZZ` are supported. INPUT: - ``singular`` - Singular instance OUTPUT: Singular ring matching this ring EXAMPLES:: sage: R.<x,y> = PolynomialRing(CC,'x',2) sage: singular(R) // characteristic : 0 (complex:15 digits, additional 0 digits) // 1 parameter : I // minpoly : (I^2+1) // number of vars : 2 // block 1 : ordering dp // : names x y // block 2 : ordering C sage: R.<x,y> = PolynomialRing(RealField(100),'x',2) sage: singular(R) // characteristic : 0 (real:29 digits, additional 0 digits) // number of vars : 2 // block 1 : ordering dp // : names x y // block 2 : ordering C sage: w = var('w') sage: R.<x> = PolynomialRing(NumberField(w^2+1,'s')) sage: singular(R) // characteristic : 0 // 1 parameter : s // minpoly : (s^2+1) // number of vars : 1 // block 1 : ordering lp // : names x // block 2 : ordering C sage: R = PolynomialRing(GF(127),1,'x') sage: singular(R) // characteristic : 127 // number of vars : 1 // block 1 : ordering lp // : names x // block 2 : ordering C sage: R = PolynomialRing(QQ,1,'x') sage: singular(R) // characteristic : 0 // number of vars : 1 // block 1 : ordering lp // : names x // block 2 : ordering C sage: R = PolynomialRing(QQ,'x') sage: singular(R) // characteristic : 0 // number of vars : 1 // block 1 : ordering lp // : names x // block 2 : ordering C sage: R = PolynomialRing(GF(127),'x') sage: singular(R) // characteristic : 127 // number of vars : 1 // block 1 : ordering lp // : names x // block 2 : ordering C sage: R = Frac(ZZ['a,b'])['x,y'] sage: singular(R) // characteristic : 0 // 2 parameter : a b // minpoly : 0 // number of vars : 2 // block 1 : ordering dp // : names x y // block 2 : ordering C sage: R = IntegerModRing(1024)['x,y'] sage: singular(R) // coeff. ring is : Z/2^10 // number of vars : 2 // block 1 : ordering dp // : names x y // block 2 : ordering C sage: R = IntegerModRing(15)['x,y'] sage: singular(R) // coeff. ring is : Z/15 // number of vars : 2 // block 1 : ordering dp // : names x y // block 2 : ordering C sage: R = ZZ['x,y'] sage: singular(R) // coeff. ring is : Integers // number of vars : 2 // block 1 : ordering dp // : names x y // block 2 : ordering C sage: k.<a> = FiniteField(25) sage: R = k['x'] sage: K = R.fraction_field() sage: S = K['y'] sage: singular(S) // characteristic : 5 // 1 parameter : x // minpoly : 0 // number of vars : 2 // block 1 : ordering lp // : names a y // block 2 : ordering C // quotient ring from ideal _[1]=a2-a+2 .. warning:: - If the base ring is a finite extension field or a number field the ring will not only be returned but also be set as the current ring in Singular. - Singular represents precision of floating point numbers base 10 while Sage represents floating point precision base 2. """ try: R = self.__singular if not (R.parent() is singular): raise ValueError R._check_valid() if self.base_ring() is ZZ or self.base_ring().is_prime_field(): return R if sage.rings.finite_rings.constructor.is_FiniteField(self.base_ring()) or\ (number_field.number_field_base.is_NumberField(self.base_ring()) and self.base_ring().is_absolute()): R.set_ring() #sorry for that, but needed for minpoly if singular.eval('minpoly') != "(" + self.__minpoly + ")": singular.eval("minpoly=%s"%(self.__minpoly)) self.__minpoly = singular.eval('minpoly')[1:-1] return R except (AttributeError, ValueError): return self._singular_init_(singular)
def _singular_init_(self, singular=singular): """ Return a newly created Singular ring matching this ring. EXAMPLES:: sage: PolynomialRing(QQ,'u_ba')._singular_init_() // characteristic : 0 // number of vars : 1 // block 1 : ordering lp // : names u_ba // block 2 : ordering C """ if not can_convert_to_singular(self): raise TypeError("no conversion of this ring to a Singular ring defined") if self.ngens()==1: _vars = '(%s)'%self.gen() if "*" in _vars: # 1.000...000*x _vars = _vars.split("*")[1] order = 'lp' else: _vars = str(self.gens()) order = self.term_order().singular_str() base_ring = self.base_ring() if is_RealField(base_ring): # singular converts to bits from base_10 in mpr_complex.cc by: # size_t bits = 1 + (size_t) ((float)digits * 3.5); precision = base_ring.precision() digits = sage.arith.all.integer_ceil((2*precision - 2)/7.0) self.__singular = singular.ring("(real,%d,0)"%digits, _vars, order=order, check=False) elif is_ComplexField(base_ring): # singular converts to bits from base_10 in mpr_complex.cc by: # size_t bits = 1 + (size_t) ((float)digits * 3.5); precision = base_ring.precision() digits = sage.arith.all.integer_ceil((2*precision - 2)/7.0) self.__singular = singular.ring("(complex,%d,0,I)"%digits, _vars, order=order, check=False) elif is_RealDoubleField(base_ring): # singular converts to bits from base_10 in mpr_complex.cc by: # size_t bits = 1 + (size_t) ((float)digits * 3.5); self.__singular = singular.ring("(real,15,0)", _vars, order=order, check=False) elif is_ComplexDoubleField(base_ring): # singular converts to bits from base_10 in mpr_complex.cc by: # size_t bits = 1 + (size_t) ((float)digits * 3.5); self.__singular = singular.ring("(complex,15,0,I)", _vars, order=order, check=False) elif base_ring.is_prime_field(): self.__singular = singular.ring(self.characteristic(), _vars, order=order, check=False) elif sage.rings.finite_rings.finite_field_constructor.is_FiniteField(base_ring): # not the prime field! gen = str(base_ring.gen()) r = singular.ring( "(%s,%s)"%(self.characteristic(),gen), _vars, order=order, check=False) self.__minpoly = (str(base_ring.modulus()).replace("x",gen)).replace(" ","") if singular.eval('minpoly') != "(" + self.__minpoly + ")": singular.eval("minpoly=%s"%(self.__minpoly) ) self.__minpoly = singular.eval('minpoly')[1:-1] self.__singular = r elif number_field.number_field_base.is_NumberField(base_ring) and base_ring.is_absolute(): # not the rationals! gen = str(base_ring.gen()) poly=base_ring.polynomial() poly_gen=str(poly.parent().gen()) poly_str=str(poly).replace(poly_gen,gen) r = singular.ring( "(%s,%s)"%(self.characteristic(),gen), _vars, order=order, check=False) self.__minpoly = (poly_str).replace(" ","") if singular.eval('minpoly') != "(" + self.__minpoly + ")": singular.eval("minpoly=%s"%(self.__minpoly) ) self.__minpoly = singular.eval('minpoly')[1:-1] self.__singular = r elif sage.rings.fraction_field.is_FractionField(base_ring) and (base_ring.base_ring() is ZZ or base_ring.base_ring().is_prime_field() or is_FiniteField(base_ring.base_ring())): if base_ring.ngens()==1: gens = str(base_ring.gen()) else: gens = str(base_ring.gens()) if not (not base_ring.base_ring().is_prime_field() and is_FiniteField(base_ring.base_ring())) : self.__singular = singular.ring( "(%s,%s)"%(base_ring.characteristic(),gens), _vars, order=order, check=False) else: ext_gen = str(base_ring.base_ring().gen()) _vars = '(' + ext_gen + ', ' + _vars[1:]; R = self.__singular = singular.ring( "(%s,%s)"%(base_ring.characteristic(),gens), _vars, order=order, check=False) self.base_ring().__minpoly = (str(base_ring.base_ring().modulus()).replace("x",ext_gen)).replace(" ","") singular.eval('setring '+R._name); self.__singular = singular("std(ideal(%s))"%(self.base_ring().__minpoly),type='qring') elif sage.rings.function_field.function_field.is_RationalFunctionField(base_ring) and base_ring.constant_field().is_prime_field(): gen = str(base_ring.gen()) self.__singular = singular.ring( "(%s,%s)"%(base_ring.characteristic(),gen), _vars, order=order, check=False) elif is_IntegerModRing(base_ring): ch = base_ring.characteristic() if ch.is_power_of(2): exp = ch.nbits() -1 self.__singular = singular.ring("(integer,2,%d)"%(exp,), _vars, order=order, check=False) else: self.__singular = singular.ring("(integer,%d)"%(ch,), _vars, order=order, check=False) elif base_ring is ZZ: self.__singular = singular.ring("(integer)", _vars, order=order, check=False) else: raise TypeError("no conversion to a Singular ring defined") return self.__singular
def _singular_init_(self, singular=singular): """ Return a newly created Singular ring matching this ring. EXAMPLES:: sage: PolynomialRing(QQ,'u_ba')._singular_init_() // characteristic : 0 // number of vars : 1 // block 1 : ordering lp // : names u_ba // block 2 : ordering C """ if not can_convert_to_singular(self): raise TypeError("no conversion of this ring to a Singular ring defined") if self.ngens()==1: _vars = '(%s)'%self.gen() if "*" in _vars: # 1.000...000*x _vars = _vars.split("*")[1] order = 'lp' else: _vars = str(self.gens()) order = self.term_order().singular_str() base_ring = self.base_ring() if is_RealField(base_ring): # singular converts to bits from base_10 in mpr_complex.cc by: # size_t bits = 1 + (size_t) ((float)digits * 3.5); precision = base_ring.precision() digits = sage.rings.arith.integer_ceil((2*precision - 2)/7.0) self.__singular = singular.ring("(real,%d,0)"%digits, _vars, order=order, check=False) elif is_ComplexField(base_ring): # singular converts to bits from base_10 in mpr_complex.cc by: # size_t bits = 1 + (size_t) ((float)digits * 3.5); precision = base_ring.precision() digits = sage.rings.arith.integer_ceil((2*precision - 2)/7.0) self.__singular = singular.ring("(complex,%d,0,I)"%digits, _vars, order=order, check=False) elif is_RealDoubleField(base_ring): # singular converts to bits from base_10 in mpr_complex.cc by: # size_t bits = 1 + (size_t) ((float)digits * 3.5); self.__singular = singular.ring("(real,15,0)", _vars, order=order, check=False) elif is_ComplexDoubleField(base_ring): # singular converts to bits from base_10 in mpr_complex.cc by: # size_t bits = 1 + (size_t) ((float)digits * 3.5); self.__singular = singular.ring("(complex,15,0,I)", _vars, order=order, check=False) elif base_ring.is_prime_field(): self.__singular = singular.ring(self.characteristic(), _vars, order=order, check=False) elif sage.rings.finite_rings.constructor.is_FiniteField(base_ring): # not the prime field! gen = str(base_ring.gen()) r = singular.ring( "(%s,%s)"%(self.characteristic(),gen), _vars, order=order, check=False) self.__minpoly = (str(base_ring.modulus()).replace("x",gen)).replace(" ","") if singular.eval('minpoly') != "(" + self.__minpoly + ")": singular.eval("minpoly=%s"%(self.__minpoly) ) self.__minpoly = singular.eval('minpoly')[1:-1] self.__singular = r elif number_field.number_field_base.is_NumberField(base_ring) and base_ring.is_absolute(): # not the rationals! gen = str(base_ring.gen()) poly=base_ring.polynomial() poly_gen=str(poly.parent().gen()) poly_str=str(poly).replace(poly_gen,gen) r = singular.ring( "(%s,%s)"%(self.characteristic(),gen), _vars, order=order, check=False) self.__minpoly = (poly_str).replace(" ","") if singular.eval('minpoly') != "(" + self.__minpoly + ")": singular.eval("minpoly=%s"%(self.__minpoly) ) self.__minpoly = singular.eval('minpoly')[1:-1] self.__singular = r elif sage.rings.fraction_field.is_FractionField(base_ring) and (base_ring.base_ring() is ZZ or base_ring.base_ring().is_prime_field() or is_FiniteField(base_ring.base_ring())): if base_ring.ngens()==1: gens = str(base_ring.gen()) else: gens = str(base_ring.gens()) if not (not base_ring.base_ring().is_prime_field() and is_FiniteField(base_ring.base_ring())) : self.__singular = singular.ring( "(%s,%s)"%(base_ring.characteristic(),gens), _vars, order=order, check=False) else: ext_gen = str(base_ring.base_ring().gen()) _vars = '(' + ext_gen + ', ' + _vars[1:]; R = self.__singular = singular.ring( "(%s,%s)"%(base_ring.characteristic(),gens), _vars, order=order, check=False) self.base_ring().__minpoly = (str(base_ring.base_ring().modulus()).replace("x",ext_gen)).replace(" ","") singular.eval('setring '+R._name); self.__singular = singular("std(ideal(%s))"%(self.base_ring().__minpoly),type='qring') elif sage.rings.function_field.function_field.is_RationalFunctionField(base_ring) and base_ring.constant_field().is_prime_field(): gen = str(base_ring.gen()) self.__singular = singular.ring( "(%s,%s)"%(base_ring.characteristic(),gen), _vars, order=order, check=False) elif is_IntegerModRing(base_ring): ch = base_ring.characteristic() if ch.is_power_of(2): exp = ch.nbits() -1 self.__singular = singular.ring("(integer,2,%d)"%(exp,), _vars, order=order, check=False) else: self.__singular = singular.ring("(integer,%d)"%(ch,), _vars, order=order, check=False) elif base_ring is ZZ: self.__singular = singular.ring("(integer)", _vars, order=order, check=False) else: raise TypeError("no conversion to a Singular ring defined") return self.__singular