def _coerce_impl(self, f): """ Return the canonical coercion of ``f`` into this multivariate power series ring, if one is defined, or raise a TypeError. The rings that canonically coerce to this multivariate power series ring are: - this ring itself - a polynomial or power series ring in the same variables or a subset of these variables (possibly empty), over any base ring that canonically coerces into the base ring of this ring EXAMPLES:: sage: R.<t,u,v> = PowerSeriesRing(QQ); R Multivariate Power Series Ring in t, u, v over Rational Field sage: S1.<t,v> = PolynomialRing(ZZ); S1 Multivariate Polynomial Ring in t, v over Integer Ring sage: f1 = -t*v + 2*v^2 + v; f1 -t*v + 2*v^2 + v sage: R(f1) v - t*v + 2*v^2 sage: S2.<u,v> = PowerSeriesRing(ZZ); S2 Multivariate Power Series Ring in u, v over Integer Ring sage: f2 = -2*v^2 + 5*u*v^2 + S2.O(6); f2 -2*v^2 + 5*u*v^2 + O(u, v)^6 sage: R(f2) -2*v^2 + 5*u*v^2 + O(t, u, v)^6 sage: R2 = R.change_ring(GF(2)) sage: R2(f1) v + t*v sage: R2(f2) u*v^2 + O(t, u, v)^6 TESTS:: sage: R.<t,u,v> = PowerSeriesRing(QQ) sage: S1.<t,v> = PolynomialRing(ZZ) sage: f1 = S1.random_element() sage: g1 = R._coerce_impl(f1) sage: f1.parent() == R False sage: g1.parent() == R True """ P = f.parent() if is_MPolynomialRing(P) or is_MPowerSeriesRing(P) \ or is_PolynomialRing(P) or is_PowerSeriesRing(P): if set(P.variable_names()).issubset(set(self.variable_names())): if self.has_coerce_map_from(P.base_ring()): return self(f) else: return self._coerce_try(f, [self.base_ring()])
def _coerce_impl(self, f): """ Return the canonical coercion of ``f`` into this multivariate power series ring, if one is defined, or raise a TypeError. The rings that canonically coerce to this multivariate power series ring are: - this ring itself - a polynomial or power series ring in the same variables or a subset of these variables (possibly empty), over any base ring that canonically coerces into the base ring of this ring EXAMPLES:: sage: R.<t,u,v> = PowerSeriesRing(QQ); R Multivariate Power Series Ring in t, u, v over Rational Field sage: S1.<t,v> = PolynomialRing(ZZ); S1 Multivariate Polynomial Ring in t, v over Integer Ring sage: f1 = -t*v + 2*v^2 + v; f1 -t*v + 2*v^2 + v sage: R(f1) v - t*v + 2*v^2 sage: S2.<u,v> = PowerSeriesRing(ZZ); S2 Multivariate Power Series Ring in u, v over Integer Ring sage: f2 = -2*v^2 + 5*u*v^2 + S2.O(6); f2 -2*v^2 + 5*u*v^2 + O(u, v)^6 sage: R(f2) -2*v^2 + 5*u*v^2 + O(t, u, v)^6 sage: R2 = R.change_ring(GF(2)) sage: R2(f1) v + t*v sage: R2(f2) u*v^2 + O(t, u, v)^6 TESTS:: sage: R.<t,u,v> = PowerSeriesRing(QQ) sage: S1.<t,v> = PolynomialRing(ZZ) sage: f1 = S1.random_element() sage: g1 = R._coerce_impl(f1) sage: f1.parent() == R False sage: g1.parent() == R True """ P = f.parent() if is_MPolynomialRing(P) or is_MPowerSeriesRing(P) \ or is_PolynomialRing(P) or is_PowerSeriesRing(P): if set(P.variable_names()).issubset(set(self.variable_names())): if self.has_coerce_map_from(P.base_ring()): return self(f) else: return self._coerce_try(f,[self.base_ring()])
def _coerce_map_from_(self, P): """ The rings that canonically coerce to this multivariate power series ring are: - this ring itself - a polynomial or power series ring in the same variables or a subset of these variables (possibly empty), over any base ring that canonically coerces into this ring - any ring that coerces into the foreground polynomial ring of this ring TESTS:: sage: M = PowerSeriesRing(ZZ,3,'x,y,z'); sage: M._coerce_map_from_(M) True sage: M._coerce_map_from_(M.remove_var(x)) True sage: M._coerce_map_from_(PowerSeriesRing(ZZ,x)) True sage: M._coerce_map_from_(PolynomialRing(ZZ,'x,z')) True sage: M._coerce_map_from_(PolynomialRing(ZZ,0,'')) True sage: M._coerce_map_from_(ZZ) True sage: M._coerce_map_from_(Zmod(13)) False sage: M._coerce_map_from_(PolynomialRing(ZZ,2,'x,t')) False sage: M._coerce_map_from_(PolynomialRing(Zmod(11),2,'x,y')) False sage: P = PolynomialRing(ZZ,3,'z') sage: H = PowerSeriesRing(P,4,'f'); H Multivariate Power Series Ring in f0, f1, f2, f3 over Multivariate Polynomial Ring in z0, z1, z2 over Integer Ring sage: H._coerce_map_from_(P) True sage: H._coerce_map_from_(P.remove_var(P.gen(1))) True sage: H._coerce_map_from_(PolynomialRing(ZZ,'z2,f0')) True """ if is_MPolynomialRing(P) or is_MPowerSeriesRing(P) \ or is_PolynomialRing(P) or is_PowerSeriesRing(P): if set(P.variable_names()).issubset(set(self.variable_names())): if self.has_coerce_map_from(P.base_ring()): return True return self._poly_ring().has_coerce_map_from(P)
def __init__(self, parent, x=0, prec=infinity, is_gen=False, check=False): """ input x can be an MPowerSeries, or an element of - the background univariate power series ring - the foreground polynomial ring - a ring that coerces to one of the above two TESTS:: sage: S.<s,t> = PowerSeriesRing(ZZ) sage: f = s + 4*t + 3*s*t sage: f in S True sage: f = f.add_bigoh(4); f s + 4*t + 3*s*t + O(s, t)^4 sage: g = 1 + s + t - s*t + S.O(5); g 1 + s + t - s*t + O(s, t)^5 sage: B.<s, t> = PowerSeriesRing(QQ) sage: C.<z> = PowerSeriesRing(QQ) sage: B(z) Traceback (most recent call last): ... TypeError: Cannot coerce input to polynomial ring. sage: D.<s> = PowerSeriesRing(QQ) sage: s.parent() is D True sage: B(s) in B True sage: d = D.random_element(20) sage: b = B(d) # test coercion from univariate power series ring sage: b in B True """ PowerSeries.__init__(self, parent, prec, is_gen=is_gen) self._PowerSeries__is_gen = is_gen try: prec = min(prec, x.prec()) # use precision of input, if defined except AttributeError: pass # set the correct background value, depending on what type of input x is try: xparent = x.parent() # 'int' types have no parent except AttributeError: xparent = None # test whether x coerces to background univariate # power series ring of parent from sage.rings.multi_power_series_ring import is_MPowerSeriesRing if is_PowerSeriesRing(xparent) or is_MPowerSeriesRing(xparent): # x is either a multivariate or univariate power series # # test whether x coerces directly to designated parent if is_MPowerSeries(x): try: self._bg_value = parent._bg_ps_ring(x._bg_value) except TypeError: raise TypeError("Unable to coerce into background ring.") # test whether x coerces to background univariate # power series ring of parent elif xparent == parent._bg_ps_ring(): self._bg_value = x elif parent._bg_ps_ring().has_coerce_map_from(xparent): # previous test may fail if precision or term orderings of # base rings do not match self._bg_value = parent._bg_ps_ring(x) else: # x is a univariate power series, but not from the # background power series ring # # convert x to a polynomial and send to background # ring of parent x = x.polynomial() self._bg_value = parent._send_to_bg(x).add_bigoh(prec) # test whether x coerces to underlying polynomial ring of parent elif is_PolynomialRing(xparent): self._bg_value = parent._send_to_bg(x).add_bigoh(prec) else: try: x = parent._poly_ring(x) #self._value = x self._bg_value = parent._send_to_bg(x).add_bigoh(prec) except (TypeError, AttributeError): raise TypeError("Input does not coerce to any of the expected rings.") self._go_to_fg = parent._send_to_fg self._prec = self._bg_value.prec() # self._parent is used a lot by the class PowerSeries self._parent = self.parent()
def __init__(self, parent, x=0, prec=infinity, is_gen=False, check=False): """ input x can be an MPowerSeries, or an element of - the background univariate power series ring - the foreground polynomial ring - a ring that coerces to one of the above two TESTS:: sage: S.<s,t> = PowerSeriesRing(ZZ) sage: f = s + 4*t + 3*s*t sage: f in S True sage: f = f.add_bigoh(4); f s + 4*t + 3*s*t + O(s, t)^4 sage: g = 1 + s + t - s*t + S.O(5); g 1 + s + t - s*t + O(s, t)^5 sage: B.<s, t> = PowerSeriesRing(QQ) sage: C.<z> = PowerSeriesRing(QQ) sage: B(z) Traceback (most recent call last): ... TypeError: Cannot coerce input to polynomial ring. sage: D.<s> = PowerSeriesRing(QQ) sage: s.parent() is D True sage: B(s) in B True sage: d = D.random_element(20) sage: b = B(d) # test coercion from univariate power series ring sage: b in B True """ PowerSeries.__init__(self, parent, prec, is_gen=is_gen) self._PowerSeries__is_gen = is_gen try: prec = min(prec, x.prec()) # use precision of input, if defined except AttributeError: pass # set the correct background value, depending on what type of input x is try: xparent = x.parent() # 'int' types have no parent except AttributeError: xparent = None # test whether x coerces to background univariate # power series ring of parent from sage.rings.multi_power_series_ring import is_MPowerSeriesRing if is_PowerSeriesRing(xparent) or is_MPowerSeriesRing(xparent): # x is either a multivariate or univariate power series # # test whether x coerces directly to designated parent if is_MPowerSeries(x): try: self._bg_value = parent._bg_ps_ring(x._bg_value) except TypeError: raise TypeError("Unable to coerce into background ring.") # test whether x coerces to background univariate # power series ring of parent elif xparent == parent._bg_ps_ring(): self._bg_value = x elif parent._bg_ps_ring().has_coerce_map_from(xparent): # previous test may fail if precision or term orderings of # base rings do not match self._bg_value = parent._bg_ps_ring(x) else: # x is a univariate power series, but not from the # background power series ring # # convert x to a polynomial and send to background # ring of parent x = x.polynomial() self._bg_value = parent._send_to_bg(x).add_bigoh(prec) # test whether x coerces to underlying polynomial ring of parent elif is_PolynomialRing(xparent): self._bg_value = parent._send_to_bg(x).add_bigoh(prec) else: try: x = parent._poly_ring(x) #self._value = x self._bg_value = parent._send_to_bg(x).add_bigoh(prec) except (TypeError, AttributeError): raise TypeError( "Input does not coerce to any of the expected rings.") self._go_to_fg = parent._send_to_fg self._prec = self._bg_value.prec() # self._parent is used a lot by the class PowerSeries self._parent = self.parent()