def _coerce_map_from_(self, P): """ Return a coercion map from `P` to ``self``, or True, or None. The following rings admit a coercion map to the Laurent series ring `A((t))`: - any ring that admits a coercion map to `A` (including `A` itself); - any Laurent series ring, power series ring or polynomial ring in the variable `t` over a ring admitting a coercion map to `A`. EXAMPLES:: sage: S.<t> = LaurentSeriesRing(ZZ) sage: S.has_coerce_map_from(ZZ) True sage: S.has_coerce_map_from(PolynomialRing(ZZ, 't')) True sage: S.has_coerce_map_from(LaurentPolynomialRing(ZZ, 't')) True sage: S.has_coerce_map_from(PowerSeriesRing(ZZ, 't')) True sage: S.has_coerce_map_from(S) True sage: S.has_coerce_map_from(QQ) False sage: S.has_coerce_map_from(PolynomialRing(QQ, 't')) False sage: S.has_coerce_map_from(LaurentPolynomialRing(QQ, 't')) False sage: S.has_coerce_map_from(PowerSeriesRing(QQ, 't')) False sage: S.has_coerce_map_from(LaurentSeriesRing(QQ, 't')) False sage: R.<t> = LaurentSeriesRing(QQ['x']) sage: R.has_coerce_map_from(QQ[['t']]) True sage: R.has_coerce_map_from(QQ['t']) True sage: R.has_coerce_map_from(ZZ['x']['t']) True sage: R.has_coerce_map_from(ZZ['t']['x']) False sage: R.has_coerce_map_from(ZZ['x']) True """ A = self.base_ring() from sage.rings.polynomial.polynomial_ring import is_PolynomialRing from sage.rings.power_series_ring import is_PowerSeriesRing from sage.rings.polynomial.laurent_polynomial_ring import is_LaurentPolynomialRing if ((is_LaurentSeriesRing(P) or is_LaurentPolynomialRing(P) or is_PowerSeriesRing(P) or is_PolynomialRing(P)) and P.variable_name() == self.variable_name() and A.has_coerce_map_from(P.base_ring())): return True
def _coerce_map_from_(self, P): """ Return a coercion map from `P` to ``self``, or True, or None. The following rings admit a coercion map to the Laurent series ring `A((t))`: - any ring that admits a coercion map to `A` (including `A` itself); - any Laurent series ring, power series ring or polynomial ring in the variable `t` over a ring admitting a coercion map to `A`. EXAMPLES:: sage: S.<t> = LaurentSeriesRing(ZZ) sage: S.has_coerce_map_from(ZZ) True sage: S.has_coerce_map_from(PolynomialRing(ZZ, 't')) True sage: S.has_coerce_map_from(LaurentPolynomialRing(ZZ, 't')) True sage: S.has_coerce_map_from(PowerSeriesRing(ZZ, 't')) True sage: S.has_coerce_map_from(S) True sage: S.has_coerce_map_from(QQ) False sage: S.has_coerce_map_from(PolynomialRing(QQ, 't')) False sage: S.has_coerce_map_from(LaurentPolynomialRing(QQ, 't')) False sage: S.has_coerce_map_from(PowerSeriesRing(QQ, 't')) False sage: S.has_coerce_map_from(LaurentSeriesRing(QQ, 't')) False sage: R.<t> = LaurentSeriesRing(QQ['x']) sage: R.has_coerce_map_from(QQ[['t']]) True sage: R.has_coerce_map_from(QQ['t']) True sage: R.has_coerce_map_from(ZZ['x']['t']) True sage: R.has_coerce_map_from(ZZ['t']['x']) False sage: R.has_coerce_map_from(ZZ['x']) True """ A = self.base_ring() if A is P: return True f = A.coerce_map_from(P) if f is not None: return self.coerce_map_from(A) * f from sage.rings.polynomial.polynomial_ring import is_PolynomialRing from sage.rings.power_series_ring import is_PowerSeriesRing from sage.rings.polynomial.laurent_polynomial_ring import is_LaurentPolynomialRing if ((is_LaurentSeriesRing(P) or is_LaurentPolynomialRing(P) or is_PowerSeriesRing(P) or is_PolynomialRing(P)) and P.variable_name() == self.variable_name() and A.has_coerce_map_from(P.base_ring())): return True