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

Commit

Permalink
ImageSubobject.cardinality: Handle infinite cardinalities explicitly
Browse files Browse the repository at this point in the history
  • Loading branch information
mkoeppe committed Aug 17, 2022
1 parent 52f6ca6 commit 9e8d023
Showing 1 changed file with 19 additions and 2 deletions.
21 changes: 19 additions & 2 deletions src/sage/sets/image_set.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
from sage.categories.sets_cat import Sets
from sage.categories.enumerated_sets import EnumeratedSets
from sage.misc.cachefunc import cached_method
from sage.rings.infinity import Infinity
from sage.rings.integer import Integer
from sage.modules.free_module import FreeModule
from sage.structure.element import Expression
Expand Down Expand Up @@ -265,11 +266,27 @@ def cardinality(self) -> Integer:
sage: Z4711 = ImageSet(lambda x: x**4 % 11, Z7, is_injective=False)
sage: Z4711.cardinality()
6
sage: Squares = ImageSet(lambda x: x^2, ZZ, is_injective=False,
....: category=Sets().Infinite())
sage: Squares.cardinality()
+Infinity
sage: Mod2 = ZZ.map(lambda x: x % 2, is_injective=False)
sage: Mod2.cardinality()
Traceback (most recent call last):
...
NotImplementedError: cannot determine cardinality of a non-injective image of an infinite set
"""
domain_cardinality = self._domain_subset.cardinality()
if self._is_injective and self._is_injective != 'check':
return self._domain_subset.cardinality()
return domain_cardinality
if self in Sets().Infinite():
return Infinity
if domain_cardinality == Infinity:
raise NotImplementedError('cannot determine cardinality of a non-injective image of an infinite set')
# Fallback like EnumeratedSets.ParentMethods.__len__
return Integer(len(list(self)))
return Integer(len(list(iter(self))))

def __iter__(self) -> Iterator:
r"""
Expand Down

0 comments on commit 9e8d023

Please sign in to comment.