Skip to content
This repository has been archived by the owner on Jan 30, 2023. It is now read-only.

Commit

Permalink
Trac #20044: extend __pow_number__ and test for convergence
Browse files Browse the repository at this point in the history
  • Loading branch information
dkrenn committed Feb 11, 2016
1 parent 98591d6 commit 69c090c
Showing 1 changed file with 28 additions and 8 deletions.
36 changes: 28 additions & 8 deletions src/sage/rings/asymptotic/asymptotic_ring.py
Original file line number Diff line number Diff line change
Expand Up @@ -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``).
Expand All @@ -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.
Expand Down Expand Up @@ -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.<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 <QQ^s * s^QQ> over Rational Field
"""
if not self.summands:
if exponent > 0:
Expand All @@ -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
Expand All @@ -1684,14 +1702,16 @@ def binomials(a):
f *= b / k
yield f

one = x.parent().one()

result = AsymptoticExpansion._power_series_(
coefficients=binomials(exponent),
start=one,
ratio=x,
ratio_start=one,
precision=precision)

return result._mul_term_(pmax_elem)
return result * pmax


def sqrt(self, precision=None):
Expand Down

0 comments on commit 69c090c

Please sign in to comment.