def gen(self, n=0): if n != 0: raise IndexError, "Generator n not defined." try: return self.__generator except AttributeError: self.__generator = laurent_series_ring_element.LaurentSeries( self, [0, 1]) return self.__generator
def gen(self, n=0): """ EXAMPLES:: sage: R = LaurentSeriesRing(QQ, "x") sage: R.gen() x """ if n != 0: raise IndexError, "Generator n not defined." try: return self.__generator except AttributeError: self.__generator = laurent_series_ring_element.LaurentSeries(self, [0,1]) return self.__generator
def __call__(self, x, n=0): r""" Coerces the element x into this Laurent series ring. INPUT: - ``x`` - the element to coerce - ``n`` - the result of the coercion will be multiplied by `t^n` (default: 0) EXAMPLES:: sage: R.<u> = LaurentSeriesRing(Qp(5, 10)) sage: S.<t> = LaurentSeriesRing(RationalField()) sage: print R(t + t^2 + O(t^3)) (1 + O(5^10))*u + (1 + O(5^10))*u^2 + O(u^3) Note that coercing an element into its own parent just produces that element again (since Laurent series are immutable):: sage: u is R(u) True Rational functions are accepted:: sage: I = sqrt(-1) sage: K.<I> = QQ[I] sage: P.<t> = PolynomialRing(K) sage: L.<u> = LaurentSeriesRing(QQ[I]) sage: L((t*I)/(t^3+I*2*t)) 1/2 + 1/4*I*u^2 - 1/8*u^4 - 1/16*I*u^6 + 1/32*u^8 + 1/64*I*u^10 - 1/128*u^12 - 1/256*I*u^14 + 1/512*u^16 + 1/1024*I*u^18 + O(u^20) :: sage: L(t*I) / L(t^3+I*2*t) 1/2 + 1/4*I*u^2 - 1/8*u^4 - 1/16*I*u^6 + 1/32*u^8 + 1/64*I*u^10 - 1/128*u^12 - 1/256*I*u^14 + 1/512*u^16 + 1/1024*I*u^18 + O(u^20) Various conversions from PARI (see also #2508):: sage: L.<q> = LaurentSeriesRing(QQ) sage: L.set_default_prec(10) sage: L(pari('1/x')) q^-1 sage: L(pari('poltchebi(5)')) 5*q - 20*q^3 + 16*q^5 sage: L(pari('poltchebi(5) - 1/x^4')) -q^-4 + 5*q - 20*q^3 + 16*q^5 sage: L(pari('1/poltchebi(5)')) 1/5*q^-1 + 4/5*q + 64/25*q^3 + 192/25*q^5 + 2816/125*q^7 + O(q^9) sage: L(pari('poltchebi(5) + O(x^40)')) 5*q - 20*q^3 + 16*q^5 + O(q^40) sage: L(pari('poltchebi(5) - 1/x^4 + O(x^40)')) -q^-4 + 5*q - 20*q^3 + 16*q^5 + O(q^40) sage: L(pari('1/poltchebi(5) + O(x^10)')) 1/5*q^-1 + 4/5*q + 64/25*q^3 + 192/25*q^5 + 2816/125*q^7 + 8192/125*q^9 + O(q^10) sage: L(pari('1/poltchebi(5) + O(x^10)'), -10) # Multiply by q^-10 1/5*q^-11 + 4/5*q^-9 + 64/25*q^-7 + 192/25*q^-5 + 2816/125*q^-3 + 8192/125*q^-1 + O(1) sage: L(pari('O(x^-10)')) O(q^-10) """ from sage.rings.fraction_field_element import is_FractionFieldElement from sage.rings.polynomial.polynomial_element import is_Polynomial from sage.rings.polynomial.multi_polynomial_element import is_MPolynomial if isinstance(x, laurent_series_ring_element.LaurentSeries ) and n == 0 and self is x.parent(): return x # ok, since Laurent series are immutable (no need to make a copy) elif isinstance(x, pari_gen): t = x.type() if t == "t_RFRAC": # Rational function x = self(self.polynomial_ring()(x.numerator())) / \ self(self.polynomial_ring()(x.denominator())) return (x << n) elif t == "t_SER": # Laurent series n += x._valp() bigoh = n + x.length() x = self(self.polynomial_ring()(x.Vec())) return (x << n).add_bigoh(bigoh) else: # General case, pretend to be a polynomial return self(self.polynomial_ring()(x)) << n elif is_FractionFieldElement(x) and \ (x.base_ring() is self.base_ring() or x.base_ring() == self.base_ring()) and \ (is_Polynomial(x.numerator()) or is_MPolynomial(x.numerator())): x = self(x.numerator()) / self(x.denominator()) return (x << n) else: return laurent_series_ring_element.LaurentSeries(self, x, n)
def O(*x, **kwds): """ Big O constructor for various types. EXAMPLES: This is useful for writing power series elements:: sage: R.<t> = ZZ[['t']] sage: (1+t)^10 + O(t^5) 1 + 10*t + 45*t^2 + 120*t^3 + 210*t^4 + O(t^5) A power series ring is created implicitly if a polynomial element is passed:: sage: R.<x> = QQ['x'] sage: O(x^100) O(x^100) sage: 1/(1+x+O(x^5)) 1 - x + x^2 - x^3 + x^4 + O(x^5) sage: R.<u,v> = QQ[[]] sage: 1 + u + v^2 + O(u, v)^5 1 + u + v^2 + O(u, v)^5 This is also useful to create `p`-adic numbers:: sage: O(7^6) O(7^6) sage: 1/3 + O(7^6) 5 + 4*7 + 4*7^2 + 4*7^3 + 4*7^4 + 4*7^5 + O(7^6) It behaves well with respect to adding negative powers of `p`:: sage: a = O(11^-32); a O(11^-32) sage: a.parent() 11-adic Field with capped relative precision 20 There are problems if you add a rational with very negative valuation to an `O`-Term:: sage: 11^-12 + O(11^15) 11^-12 + O(11^8) The reason that this fails is that the constructor doesn't know the right precision cap to use. If you cast explicitly or use other means of element creation, you can get around this issue:: sage: K = Qp(11, 30) sage: K(11^-12) + O(11^15) 11^-12 + O(11^15) sage: 11^-12 + K(O(11^15)) 11^-12 + O(11^15) sage: K(11^-12, absprec = 15) 11^-12 + O(11^15) sage: K(11^-12, 15) 11^-12 + O(11^15) We can also work with `asymptotic expansions`_:: sage: A.<n> = AsymptoticRing(growth_group='QQ^n * n^QQ * log(n)^QQ', coefficient_ring=QQ); A doctest:...: FutureWarning: This class/method/function is marked as experimental. ... Asymptotic Ring <QQ^n * n^QQ * log(n)^QQ> over Rational Field sage: O(n) O(n) TESTS:: sage: var('x, y') (x, y) sage: O(x) Traceback (most recent call last): ... ArithmeticError: O(x) not defined sage: O(y) Traceback (most recent call last): ... ArithmeticError: O(y) not defined sage: O(x, y) Traceback (most recent call last): ... ArithmeticError: O(x, y) not defined sage: O(4, 2) Traceback (most recent call last): ... ArithmeticError: O(4, 2) not defined """ if len(x) > 1: if isinstance(x[0], multi_power_series_ring_element.MPowerSeries): return multi_power_series_ring_element.MO(x, **kwds) else: raise ArithmeticError("O(%s) not defined" % (', '.join(str(e) for e in x), )) x = x[0] if isinstance(x, power_series_ring_element.PowerSeries): return x.parent()(0, x.degree(), **kwds) elif isinstance(x, Polynomial): if x.parent().ngens() != 1: raise NotImplementedError("completion only currently defined " "for univariate polynomials") if not x.is_monomial(): raise NotImplementedError("completion only currently defined " "for the maximal ideal (x)") return x.parent().completion(x.parent().gen())(0, x.degree(), **kwds) elif isinstance(x, laurent_series_ring_element.LaurentSeries): return laurent_series_ring_element.LaurentSeries(x.parent(), 0).\ add_bigoh(x.valuation(), **kwds) elif isinstance(x, (int, long, integer.Integer, rational.Rational)): # p-adic number if x <= 0: raise ArithmeticError("x must be a prime power >= 2") F = arith.factor(x) if len(F) != 1: raise ArithmeticError("x must be prime power") p, r = F[0] if r >= 0: return padics_factory.Zp(p, prec=max(r, 20), type='capped-rel')(0, absprec=r, **kwds) else: return padics_factory.Qp(p, prec=max(r, 20), type='capped-rel')(0, absprec=r, **kwds) elif isinstance(x, padic_generic_element.pAdicGenericElement): return x.parent()(0, absprec=x.valuation(), **kwds) elif hasattr(x, 'O'): return x.O(**kwds) raise ArithmeticError("O(%s) not defined" % (x, ))
def O(*x): """ Big O constructor for various types. EXAMPLES: This is useful for writing power series elements. :: sage: R.<t> = ZZ[['t']] sage: (1+t)^10 + O(t^5) 1 + 10*t + 45*t^2 + 120*t^3 + 210*t^4 + O(t^5) A power series ring is created implicitly if a polynomial element is passed in. :: sage: R.<x> = QQ['x'] sage: O(x^100) O(x^100) sage: 1/(1+x+O(x^5)) 1 - x + x^2 - x^3 + x^4 + O(x^5) sage: R.<u,v> = QQ[[]] sage: 1 + u + v^2 + O(u, v)^5 1 + u + v^2 + O(u, v)^5 This is also useful to create p-adic numbers. :: sage: O(7^6) O(7^6) sage: 1/3 + O(7^6) 5 + 4*7 + 4*7^2 + 4*7^3 + 4*7^4 + 4*7^5 + O(7^6) It behaves well with respect to adding negative powers of p:: sage: a = O(11^-32); a O(11^-32) sage: a.parent() 11-adic Field with capped relative precision 20 There are problems if you add a rational with very negative valuation to a big_oh. :: sage: 11^-12 + O(11^15) 11^-12 + O(11^8) The reason that this fails is that the O function doesn't know the right precision cap to use. If you cast explicitly or use other means of element creation, you can get around this issue. :: sage: K = Qp(11, 30) sage: K(11^-12) + O(11^15) 11^-12 + O(11^15) sage: 11^-12 + K(O(11^15)) 11^-12 + O(11^15) sage: K(11^-12, absprec = 15) 11^-12 + O(11^15) sage: K(11^-12, 15) 11^-12 + O(11^15) """ if len(x) > 1: if isinstance(x[0], multi_power_series_ring_element.MPowerSeries): return multi_power_series_ring_element.MO(x) x = x[0] if isinstance(x, power_series_ring_element.PowerSeries): return x.parent()(0, x.degree()) elif isinstance(x, Polynomial): if x.parent().ngens() != 1: raise NotImplementedError( "completion only currently defined for univariate polynomials") if not x.is_monomial(): raise NotImplementedError( "completion only currently defined for the maximal ideal (x)") return x.parent().completion(x.parent().gen())(0, x.degree()) elif isinstance(x, laurent_series_ring_element.LaurentSeries): return laurent_series_ring_element.LaurentSeries( x.parent(), 0).add_bigoh(x.valuation()) elif isinstance( x, (int, long, integer.Integer, rational.Rational)): # p-adic number if x <= 0: raise ArithmeticError("x must be a prime power >= 2") F = arith.factor(x) if len(F) != 1: raise ArithmeticError("x must be prime power") p, r = F[0] if r >= 0: return padics_factory.Zp(p, prec=max(r, 20), type='capped-rel')(0, absprec=r) else: return padics_factory.Qp(p, prec=max(r, 20), type='capped-rel')(0, absprec=r) elif isinstance(x, padic_generic_element.pAdicGenericElement): return x.parent()(0, absprec=x.valuation()) raise ArithmeticError("O(x) not defined")