Asymptotic Expansions — Miscellaneous¶
AUTHORS:
 Daniel Krenn (2015)
ACKNOWLEDGEMENT:
 Benjamin Hackl, Clemens Heuberger and Daniel Krenn are supported by the Austrian Science Fund (FWF): P 24644N26.
 Benjamin Hackl is supported by the Google Summer of Code 2015.
Functions, Classes and Methods¶

class
sage.rings.asymptotic.misc.
Locals
¶ Bases:
dict
A frozen dictionarylike class for storing locals of an
AsymptoticRing
.EXAMPLES:
sage: from sage.rings.asymptotic.misc import Locals sage: locals = Locals({'a': 42}) sage: locals['a'] 42
The object contains default values (see
default_locals()
) for some keys:sage: locals['log'] <function log at 0x...>

default_locals
()¶ Return the default locals used in the
AsymptoticRing
.OUTPUT:
A dictionary.
EXAMPLES:
sage: from sage.rings.asymptotic.misc import Locals sage: locals = Locals({'a': 2, 'b': 1}) sage: locals {'a': 2, 'b': 1} sage: locals.default_locals() {'log': <function log at 0x...>} sage: locals['log'] <function log at 0x...>


exception
sage.rings.asymptotic.misc.
NotImplementedOZero
(asymptotic_ring=None, var=None, exact_part=0)¶ Bases:
NotImplementedError
A special NotImplementedError which is raised when the result is O(0) which means 0 for sufficiently large values of the variable.

class
sage.rings.asymptotic.misc.
WithLocals
¶ Bases:
sage.structure.sage_object.SageObject
A class extensions for handling local values; see also
Locals
.This is used in the
AsymptoticRing
.EXAMPLES:
sage: A.<n> = AsymptoticRing('n^ZZ', QQ, locals={'a': 42}) sage: A.locals() {'a': 42}

locals
(locals=None)¶ Return the actual
Locals
object to be used.INPUT:
locals
– an objectIf
locals
is notNone
, then aLocals
object is created and returned. Iflocals
isNone
, then a storedLocals
object, if any, is returned. Otherwise, an empty (i.e. no values except the default values)Locals
object is created and returned.
OUTPUT:
A
Locals
object.


sage.rings.asymptotic.misc.
bidirectional_merge_overlapping
(A, B, key=None)¶ Merge the two overlapping tuples/lists.
INPUT:
A
– a list or tuple (type has to coincide with type ofB
).B
– a list or tuple (type has to coincide with type ofA
).key
– (default:None
) a function. IfNone
, then the identity is used. Thiskey
function applied on an element of the list/tuple is used for comparison. Thus elements with the same key are considered as equal.
OUTPUT:
A pair of lists or tuples (depending on the type of
A
andB
).Note
Suppose we can decompose the list \(A=ac\) and \(B=cb\) with lists \(a\), \(b\), \(c\), where \(c\) is nonempty. Then
bidirectional_merge_overlapping()
returns the pair \((acb, acb)\).Suppose a
key
function is specified and \(A=ac_A\) and \(B=c_Bb\), where the list of keys of the elements of \(c_A\) equals the list of keys of the elements of \(c_B\). Thenbidirectional_merge_overlapping()
returns the pair \((ac_Ab, ac_Bb)\).After unsuccessfully merging \(A=ac\) and \(B=cb\), a merge of \(A=ca\) and \(B=bc\) is tried.

sage.rings.asymptotic.misc.
bidirectional_merge_sorted
(A, B, key=None)¶ Merge the two tuples/lists, keeping the orders provided by them.
INPUT:
A
– a list or tuple (type has to coincide with type ofB
).B
– a list or tuple (type has to coincide with type ofA
).key
– (default:None
) a function. IfNone
, then the identity is used. Thiskey
function applied on an element of the list/tuple is used for comparison. Thus elements with the same key are considered as equal.
Note
The two tuples/list need to overlap, i.e. need at least one key in common.
OUTPUT:
A pair of lists containing all elements totally ordered. (The first component uses
A
as a merge base, the second componentB
.)If merging fails, then a RuntimeError is raised.

sage.rings.asymptotic.misc.
combine_exceptions
(e, *f)¶ Helper function which combines the messages of the given exceptions.
INPUT:
e
– an exception.*f
– exceptions.
OUTPUT:
An exception.
EXAMPLES:
sage: from sage.rings.asymptotic.misc import combine_exceptions sage: raise combine_exceptions(ValueError('Outer.'), TypeError('Inner.')) Traceback (most recent call last): ... ValueError: Outer. > *previous* TypeError: Inner. sage: raise combine_exceptions(ValueError('Outer.'), ....: TypeError('Inner1.'), TypeError('Inner2.')) Traceback (most recent call last): ... ValueError: Outer. > *previous* TypeError: Inner1. > *and* TypeError: Inner2. sage: raise combine_exceptions(ValueError('Outer.'), ....: combine_exceptions(TypeError('Middle.'), ....: TypeError('Inner.'))) Traceback (most recent call last): ... ValueError: Outer. > *previous* TypeError: Middle. >> *previous* TypeError: Inner.

sage.rings.asymptotic.misc.
log_string
(element, base=None)¶ Return a representation of the log of the given element to the given base.
INPUT:
element
– an object.base
– an object orNone
.
OUTPUT:
A string.
EXAMPLES:
sage: from sage.rings.asymptotic.misc import log_string sage: log_string(3) 'log(3)' sage: log_string(3, base=42) 'log(3, base=42)'

sage.rings.asymptotic.misc.
parent_to_repr_short
(P)¶ Helper method which generates a short(er) representation string out of a parent.
INPUT:
P
– a parent.
OUTPUT:
A string.
EXAMPLES:
sage: from sage.rings.asymptotic.misc import parent_to_repr_short sage: parent_to_repr_short(ZZ) 'ZZ' sage: parent_to_repr_short(QQ) 'QQ' sage: parent_to_repr_short(SR) 'SR' sage: parent_to_repr_short(RR) 'RR' sage: parent_to_repr_short(CC) 'CC' sage: parent_to_repr_short(ZZ['x']) 'ZZ[x]' sage: parent_to_repr_short(QQ['d, k']) 'QQ[d, k]' sage: parent_to_repr_short(QQ['e']) 'QQ[e]' sage: parent_to_repr_short(SR[['a, r']]) 'SR[[a, r]]' sage: parent_to_repr_short(Zmod(3)) 'Ring of integers modulo 3' sage: parent_to_repr_short(Zmod(3)['g']) 'Univariate Polynomial Ring in g over Ring of integers modulo 3'

sage.rings.asymptotic.misc.
repr_op
(left, op, right=None, latex=False)¶ Create a string
left op right
with taking care of parentheses in its operands.INPUT:
left
– an element.op
– a string.right
– an element.latex
– (default:False
) a boolean. If set, then LaTeXoutput is returned.
OUTPUT:
A string.
EXAMPLES:
sage: from sage.rings.asymptotic.misc import repr_op sage: repr_op('a^b', '^', 'c') '(a^b)^c'

sage.rings.asymptotic.misc.
repr_short_to_parent
(s)¶ Helper method for the growth group factory, which converts a short representation string to a parent.
INPUT:
s
– a string, short representation of a parent.
OUTPUT:
A parent.
The possible short representations are shown in the examples below.
EXAMPLES:
sage: from sage.rings.asymptotic.misc import repr_short_to_parent sage: repr_short_to_parent('ZZ') Integer Ring sage: repr_short_to_parent('QQ') Rational Field sage: repr_short_to_parent('SR') Symbolic Ring sage: repr_short_to_parent('NN') Non negative integer semiring sage: repr_short_to_parent('UU') Group of Roots of Unity

sage.rings.asymptotic.misc.
split_str_by_op
(string, op, strip_parentheses=True)¶ Split the given string into a tuple of substrings arising by splitting by
op
and taking care of parentheses.INPUT:
string
– a string.op
– a string. This is used by str.split. Thus, if this isNone
, then any whitespace string is a separator and empty strings are removed from the result.strip_parentheses
– (default:True
) a boolean.
OUTPUT:
A tuple of strings.

sage.rings.asymptotic.misc.
strip_symbolic
(expression)¶ Return, if possible, the underlying (numeric) object of the symbolic expression.
If
expression
is not symbolic, thenexpression
is returned.INPUT:
expression
– an object
OUTPUT:
An object.
EXAMPLES:
sage: from sage.rings.asymptotic.misc import strip_symbolic sage: strip_symbolic(SR(2)); _.parent() 2 Integer Ring sage: strip_symbolic(SR(2/3)); _.parent() 2/3 Rational Field sage: strip_symbolic(SR('x')); _.parent() x Symbolic Ring sage: strip_symbolic(pi); _.parent() pi Symbolic Ring

sage.rings.asymptotic.misc.
substitute_raise_exception
(element, e)¶ Raise an error describing what went wrong with the substitution.
INPUT:
element
– an element.e
– an exception which is included in the raised error message.
OUTPUT:
Raise an exception of the same type as
e
.

sage.rings.asymptotic.misc.
transform_category
(category, subcategory_mapping, axiom_mapping, initial_category=None)¶ Transform
category
to a new category according to the given mappings.INPUT:
category
– a category.subcategory_mapping
– a list (or other iterable) of triples(from, to, mandatory)
, wherefrom
andto
are categories andmandatory
is a boolean.
axiom_mapping
– a list (or other iterable) of triples(from, to, mandatory)
, wherefrom
andto
are strings describing axioms andmandatory
is a boolean.
initial_category
– (default:None
) a category. When transforming the given category, thisinitial_category
is used as a starting point of the result. This means the resulting category will be a subcategory ofinitial_category
. Ifinitial_category
isNone
, then thecategory of objects
is used.
OUTPUT:
A category.
Note
Consider a subcategory mapping
(from, to, mandatory)
. Ifcategory
is a subcategory offrom
, then the returned category will be a subcategory ofto
. Otherwise and ifmandatory
is set, then an error is raised.Consider an axiom mapping
(from, to, mandatory)
. Ifcategory
is has axiomfrom
, then the returned category will have axiomto
. Otherwise and ifmandatory
is set, then an error is raised.EXAMPLES:
sage: from sage.rings.asymptotic.misc import transform_category sage: from sage.categories.additive_semigroups import AdditiveSemigroups sage: from sage.categories.additive_monoids import AdditiveMonoids sage: from sage.categories.additive_groups import AdditiveGroups sage: S = [ ....: (Sets(), Sets(), True), ....: (Posets(), Posets(), False), ....: (AdditiveMagmas(), Magmas(), False)] sage: A = [ ....: ('AdditiveAssociative', 'Associative', False), ....: ('AdditiveUnital', 'Unital', False), ....: ('AdditiveInverse', 'Inverse', False), ....: ('AdditiveCommutative', 'Commutative', False)] sage: transform_category(Objects(), S, A) Traceback (most recent call last): ... ValueError: Category of objects is not a subcategory of Category of sets. sage: transform_category(Sets(), S, A) Category of sets sage: transform_category(Posets(), S, A) Category of posets sage: transform_category(AdditiveSemigroups(), S, A) Category of semigroups sage: transform_category(AdditiveMonoids(), S, A) Category of monoids sage: transform_category(AdditiveGroups(), S, A) Category of groups sage: transform_category(AdditiveGroups().AdditiveCommutative(), S, A) Category of commutative groups
sage: transform_category(AdditiveGroups().AdditiveCommutative(), S, A, ....: initial_category=Posets()) Join of Category of commutative groups and Category of posets
sage: transform_category(ZZ.category(), S, A) Category of commutative groups sage: transform_category(QQ.category(), S, A) Category of commutative groups sage: transform_category(SR.category(), S, A) Category of commutative groups sage: transform_category(Fields(), S, A) Category of commutative groups sage: transform_category(ZZ['t'].category(), S, A) Category of commutative groups
sage: A[1] = ('Commutative', 'AdditiveCommutative', True) sage: transform_category(Groups(), S, A) Traceback (most recent call last): ... ValueError: Category of groups does not have axiom Commutative.