From 69c090c673e3ccbbcce2de75b68cbe8b40f73c81 Mon Sep 17 00:00:00 2001 From: Daniel Krenn Date: Thu, 11 Feb 2016 20:44:46 +0100 Subject: [PATCH] Trac #20044: extend __pow_number__ and test for convergence --- src/sage/rings/asymptotic/asymptotic_ring.py | 36 +++++++++++++++----- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/src/sage/rings/asymptotic/asymptotic_ring.py b/src/sage/rings/asymptotic/asymptotic_ring.py index 93c06a2549a..1397c22fd09 100644 --- a/src/sage/rings/asymptotic/asymptotic_ring.py +++ b/src/sage/rings/asymptotic/asymptotic_ring.py @@ -1570,7 +1570,7 @@ def __pow__(self, exponent, precision=None): pow = __pow__ - def __pow_number__(self, exponent, precision=None): + def __pow_number__(self, exponent, precision=None, check_convergence=False): r""" Return the power of this asymptotic expansion to some number (``exponent``). @@ -1594,6 +1594,10 @@ def __pow_number__(self, exponent, precision=None): - ``precision`` -- a non-negative integer. + - ``check_convergence`` -- (default: ``False``) a boolean. If set, + then an additional check on the input is performed to ensure, + that the calculated sum converges. + OUTPUT: An asymptotic expansion. @@ -1642,6 +1646,16 @@ def __pow_number__(self, exponent, precision=None): ... ValueError: Cannot determine main term of a + b since there are several maximal elements a, b. + + :: + + sage: S. = AsymptoticRing(growth_group='QQ^s * s^ZZ', coefficient_ring=QQ) + sage: (2 + 2/s^2).__pow_number__(s, precision=7) + 2^s + 2^s*s^(-1) + 1/2*2^s*s^(-2) - 1/3*2^s*s^(-3) + - 11/24*2^s*s^(-4) + 11/120*2^s*s^(-5) + + 271/720*2^s*s^(-6) + O(2^s*s^(-7)) + sage: _.parent() + Asymptotic Ring over Rational Field """ if not self.summands: if exponent > 0: @@ -1662,16 +1676,20 @@ def __pow_number__(self, exponent, precision=None): return self.parent()._create_element_in_extension_( element**exponent, element.parent()) - (max_elem, x) = self._main_term_relative_error_() + try: + (max_elem, x) = self._main_term_relative_error_() + except ValueError: + if check_convergence: + raise NoConvergenceError + raise - pmax_elem = max_elem**exponent - x = self.parent()._create_element_in_extension_( - pmax_elem, max_elem.parent()).parent()(x) + if check_convergence: + if not (x * exponent).is_little_o_of_one(): + raise NoConvergenceError - one = x.parent().one() + pmax = self.parent()(max_elem)**exponent import itertools - def binomials(a): P = a.parent() a = a + 1 @@ -1684,6 +1702,8 @@ def binomials(a): f *= b / k yield f + one = x.parent().one() + result = AsymptoticExpansion._power_series_( coefficients=binomials(exponent), start=one, @@ -1691,7 +1711,7 @@ def binomials(a): ratio_start=one, precision=precision) - return result._mul_term_(pmax_elem) + return result * pmax def sqrt(self, precision=None):