Base class for old-style parent objects

Base class for old-style parent objects

CLASS HIERARCHY:

SageObject
Parent
ParentWithBase
ParentWithGens

TESTS:

This came up in some subtle bug once.

sage: gp(2) + gap(3)
5
class sage.structure.parent_old.Parent

Bases: sage.structure.parent.Parent

Parents are the SAGE/mathematical analogues of container objects in computer science.

TESTS:

sage: V = VectorSpace(GF(2,'a'),2)
sage: V.list()
[(0, 0), (1, 0), (0, 1), (1, 1)]
sage: MatrixSpace(GF(3), 1, 1).list()
[[0], [1], [2]]
sage: DirichletGroup(3).list()
[Dirichlet character modulo 3 of conductor 1 mapping 2 |--> 1,
Dirichlet character modulo 3 of conductor 3 mapping 2 |--> -1]
sage: K = GF(7^6,'a')
sage: K.list()[:10] # long time
[0, 1, 2, 3, 4, 5, 6, a, a + 1, a + 2]
sage: K.<a> = GF(4)
sage: K.list()
[0, a, a + 1, 1]
coerce_map_from_c(S)

EXAMPLES:

Check to make sure that we handle coerce maps from Python native types correctly:

sage: QQ['q,t'].coerce_map_from(int)
Composite map:
  From: Set of Python objects of type 'int'
  To:   Multivariate Polynomial Ring in q, t over Rational Field
  Defn:   Native morphism:
          From: Set of Python objects of type 'int'
          To:   Rational Field
        then
          Polynomial base injection morphism:
          From: Rational Field
          To:   Multivariate Polynomial Ring in q, t over Rational Field
coerce_map_from_impl(S)
get_action_c(S, op, self_on_left)
get_action_impl(S, op, self_on_left)
has_coerce_map_from_c(S)

Return True if there is a natural map from S to self. Otherwise, return False.

has_coerce_map_from_impl(S)
list()

Return a list of the elements of self.

OUTPUT:

A list of all the elements produced by the iterator defined for the object. The result is cached. An infinite set may define an iterator, allowing one to search through the elements, but a request by this method for the entire list should fail.

NOTE:

Some objects X do not know if they are finite or not. If X.is_finite() fails with a NotImplementedError, then X.list() will simply try. In that case, it may run without stopping.

However, if X knows that it is infinite, then running X.list() will raise an appropriate error, while running list(X) will run indefinitely. For many Sage objects X, using X.list() is preferable to using list(X).

Nevertheless, since the whole list of elements is created and cached by X.list(), it may be better to do for x in X:, not for x in X.list():.

EXAMPLES:

sage: R = Integers(11)
sage: R.list()    # indirect doctest
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

sage: ZZ.list()
Traceback (most recent call last):
...
ValueError: since it is infinite, cannot list Integer Ring

This is the motivation for trac ticket #10470

sage: (QQ^2).list()
Traceback (most recent call last):
...
ValueError: since it is infinite, cannot list Vector space of dimension 2 over Rational Field

TESTS:

The following tests the caching by adjusting the cached version:

sage: R = Integers(3)
sage: R.list()
[0, 1, 2]
sage: R._list[0] = 'junk'
sage: R.list()
['junk', 1, 2]

Here we test that for an object that does not know whether it is finite or not. Calling X.list() simply tries to create the list (but here it fails, since the object is not iterable). This was fixed trac ticket #11350

sage: R.<t,p> = QQ[]
sage: Q = R.quotient(t^2-t+1)
sage: Q.is_finite()
Traceback (most recent call last):
...
NotImplementedError
sage: Q.list()
Traceback (most recent call last):
...
NotImplementedError: object does not support iteration

Here is another example. We artificially create a version of the ring of integers that does not know whether it is finite or not:

sage: from sage.rings.integer_ring import IntegerRing_class
sage: class MyIntegers_class(IntegerRing_class):
....:      def is_finite(self):
....:          raise NotImplementedError
sage: MyIntegers = MyIntegers_class()
sage: MyIntegers.is_finite()
Traceback (most recent call last):
...
NotImplementedError

Asking for list(MyIntegers) below will never finish without pressing Ctrl-C. We let it run for 1 second and then interrupt:

sage: alarm(1.0); list(MyIntegers)
Traceback (most recent call last):
...
AlarmInterrupt

Previous topic

Base class for objects of a category

Next topic

Base class for old-style parent objects with a base ring

This Page