Sets

Generic set theory interfaces.

class diofant.sets.sets.Set(*args)[source]

The base class for any kind of set.

This is not meant to be used directly as a container of items. It does not behave like the builtin set; see FiniteSet for that.

Real intervals are represented by the Interval class and unions of sets by the Union class. The empty set is represented by the EmptySet class and available as a singleton as S.EmptySet.

property boundary

The boundary or frontier of a set

A point x is on the boundary of a set S if

  1. x is in the closure of S. I.e. Every neighborhood of x contains a point in S.

  2. x is not in the interior of S. I.e. There does not exist an open set centered on x contained entirely within S.

There are the points on the outer rim of S. If S is open then these points need not actually be contained within S.

For example, the boundary of an interval is its start and end points. This is true regardless of whether or not the interval is open.

Examples

>>> Interval(0, 1).boundary
{0, 1}
>>> Interval(0, 1, True, False).boundary
{0, 1}
property closure

Return the closure of a set.

Examples

>>> Interval(0, 1, right_open=True).closure
[0, 1]
complement(universe)[source]

The complement of ‘self’ w.r.t the given the universe.

Examples

>>> Interval(0, 1).complement(S.Reals)
(-oo, 0) U (1, oo)
contains(other)[source]

Returns True if ‘other’ is contained in ‘self’ as an element.

As a shortcut it is possible to use the ‘in’ operator:

Examples

>>> Interval(0, 1).contains(0.5)
true
>>> 0.5 in Interval(0, 1)
True
property inf

The infimum of ‘self’

Examples

>>> Interval(0, 1).inf
0
>>> Union(Interval(0, 1), Interval(2, 3)).inf
0
property interior

Return the interior of a set.

The interior of a set consists all points of a set that do not belong to its boundary.

Examples

>>> Interval(0, 1).interior
(0, 1)
>>> Interval(0, 1).boundary.interior
EmptySet()
intersection(other)[source]

Returns the intersection of ‘self’ and ‘other’.

>>> Interval(1, 3).intersection(Interval(1, 2))
[1, 2]
property is_closed

Test if a set is closed.

Examples

>>> Interval(0, 1).is_closed
True
is_disjoint(other)[source]

Returns True if ‘self’ and ‘other’ are disjoint

Examples

>>> Interval(0, 2).is_disjoint(Interval(1, 2))
False
>>> Interval(0, 2).is_disjoint(Interval(3, 4))
True

References

property is_open

Test if a set is open.

A set is open if it has an empty intersection with its boundary.

Examples

>>> S.Reals.is_open
True

See also

boundary

is_proper_subset(other)[source]

Returns True if ‘self’ is a proper subset of ‘other’.

Examples

>>> Interval(0, 0.5).is_proper_subset(Interval(0, 1))
True
>>> Interval(0, 1).is_proper_subset(Interval(0, 1))
False
is_proper_superset(other)[source]

Returns True if ‘self’ is a proper superset of ‘other’.

Examples

>>> Interval(0, 1).is_proper_superset(Interval(0, 0.5))
True
>>> Interval(0, 1).is_proper_superset(Interval(0, 1))
False
is_subset(other)[source]

Returns True if ‘self’ is a subset of ‘other’.

Examples

>>> Interval(0, 0.5).is_subset(Interval(0, 1))
True
>>> Interval(0, 1).is_subset(Interval(0, 1, left_open=True))
False
is_superset(other)[source]

Returns True if ‘self’ is a superset of ‘other’.

Examples

>>> Interval(0, 0.5).is_superset(Interval(0, 1))
False
>>> Interval(0, 1).is_superset(Interval(0, 1, left_open=True))
True
isdisjoint(other)[source]

Alias for is_disjoint().

issubset(other)[source]

Alias for is_subset().

issuperset(other)[source]

Alias for is_superset().

property measure

The (Lebesgue) measure of ‘self’

Examples

>>> Interval(0, 1).measure
1
>>> Union(Interval(0, 1), Interval(2, 3)).measure
2
powerset()[source]

Find the Power set of ‘self’.

Examples

>>> A = EmptySet()
>>> A.powerset()
{EmptySet()}
>>> A = FiniteSet(1, 2)
>>> a, b, c = FiniteSet(1), FiniteSet(2), FiniteSet(1, 2)
>>> A.powerset() == FiniteSet(a, b, c, EmptySet())
True

References

property sup

The supremum of ‘self’

Examples

>>> Interval(0, 1).sup
1
>>> Union(Interval(0, 1), Interval(2, 3)).sup
3
symmetric_difference(other)[source]

Returns symmetric difference of self and other.

Examples

>>> Interval(1, 3).symmetric_difference(Reals)
(-oo, 1) U (3, oo)

References

union(other)[source]

Returns the union of ‘self’ and ‘other’.

Examples

As a shortcut it is possible to use the ‘+’ operator:

>>> Interval(0, 1).union(Interval(2, 3))
[0, 1] U [2, 3]
>>> Interval(0, 1) + Interval(2, 3)
[0, 1] U [2, 3]
>>> Interval(1, 2, True, True) + FiniteSet(2, 3)
(1, 2] U {3}

Similarly it is possible to use the ‘-’ operator for set differences:

>>> Interval(0, 2) - Interval(0, 1)
(1, 2]
>>> Interval(1, 3) - FiniteSet(2)
[1, 2) U (2, 3]
diofant.sets.sets.imageset(*args)[source]

Image of set under transformation f.

If this function can’t compute the image, it returns an unevaluated ImageSet object.

\[{ f(x) | x \in self }\]

Examples

>>> imageset(x, 2*x, Interval(0, 2))
[0, 4]
>>> imageset(lambda x: 2*x, Interval(0, 2))
[0, 4]
>>> imageset(Lambda(x, sin(x)), Interval(-1, 2))
[-sin(1), 1]

Elementary Sets

class diofant.sets.sets.Interval(start=-oo, end=oo, left_open=False, right_open=False)[source]

Represents a real interval as a Set.

Returns an interval with end points “start” and “end”.

For left_open=True (default left_open is False) the interval will be open on the left. Similarly, for right_open=True the interval will be open on the right.

Examples

>>> Interval(0, 1)
[0, 1]
>>> Interval(0, 1, False, True)
[0, 1)
>>> Interval.Ropen(0, 1)
[0, 1)
>>> Interval.Lopen(0, 1)
(0, 1]
>>> Interval.open(0, 1)
(0, 1)
>>> a = Symbol('a', real=True)
>>> Interval(0, a)
[0, a]

Notes

  • Only real end points are supported

  • Interval(a, b) with a > b will return the empty set

  • Use the evalf() method to turn an Interval into an mpmath ‘mpi’ interval instance

References

classmethod Lopen(a, b)[source]

Return an interval not including the left boundary.

classmethod Ropen(a, b)[source]

Return an interval not including the right boundary.

as_relational(x)[source]

Rewrite an interval in terms of inequalities and logic operators.

property end

The right end point of ‘self’.

This property takes the same value as the ‘sup’ property.

Examples

>>> Interval(0, 1).end
1
property inf

The left end point of ‘self’.

This property takes the same value as the ‘inf’ property.

Examples

>>> Interval(0, 1).start
0
property is_left_unbounded

Return True if the left endpoint is negative infinity.

property is_right_unbounded

Return True if the right endpoint is positive infinity.

property left

The left end point of ‘self’.

This property takes the same value as the ‘inf’ property.

Examples

>>> Interval(0, 1).start
0
property left_open

True if ‘self’ is left-open.

Examples

>>> Interval(0, 1, left_open=True).left_open
true
>>> Interval(0, 1, left_open=False).left_open
false
classmethod open(a, b)[source]

Return an interval including neither boundary.

property right

The right end point of ‘self’.

This property takes the same value as the ‘sup’ property.

Examples

>>> Interval(0, 1).end
1
property right_open

True if ‘self’ is right-open.

Examples

>>> Interval(0, 1, right_open=True).right_open
true
>>> Interval(0, 1, right_open=False).right_open
false
property start

The left end point of ‘self’.

This property takes the same value as the ‘inf’ property.

Examples

>>> Interval(0, 1).start
0
property sup

The right end point of ‘self’.

This property takes the same value as the ‘sup’ property.

Examples

>>> Interval(0, 1).end
1
class diofant.sets.sets.FiniteSet(*args, **kwargs)[source]

Represents a set that has a finite number of elements.

Examples

>>> FiniteSet(1, 2, 3, 4)
{1, 2, 3, 4}
>>> 3 in FiniteSet(1, 2, 3, 4)
True

References

as_relational(symbol)[source]

Rewrite a FiniteSet in terms of equalities and logic operators.

Compound Sets

class diofant.sets.sets.Union(*args, **kwargs)[source]

Represents a union of sets as a Set.

Examples

>>> Union(Interval(1, 2), Interval(3, 4))
[1, 2] U [3, 4]

The Union constructor will always try to merge overlapping intervals, if possible. For example:

>>> Union(Interval(1, 2), Interval(2, 3))
[1, 3]

See also

Intersection

References

as_relational(symbol)[source]

Rewrite a Union in terms of equalities and logic operators.

static reduce(args)[source]

Simplify a Union using known rules

We first start with global rules like ‘Merge all FiniteSets’

Then we iterate through all pairs and ask the constituent sets if they can simplify themselves with any other constituent

class diofant.sets.sets.Intersection(*args, **kwargs)[source]

Represents an intersection of sets as a Set.

Examples

>>> Intersection(Interval(1, 3), Interval(2, 4))
[2, 3]

We often use the .intersect method

>>> Interval(1, 3).intersection(Interval(2, 4))
[2, 3]

See also

Union

References

as_relational(symbol)[source]

Rewrite an Intersection in terms of equalities and logic operators.

static reduce(args)[source]

Simplify an intersection using known rules

We first start with global rules like ‘if any empty sets return empty set’ and ‘distribute any unions’

Then we iterate through all pairs and ask the constituent sets if they can simplify themselves with any other constituent

class diofant.sets.sets.ProductSet(*sets, **assumptions)[source]

Represents a Cartesian Product of Sets.

Returns a Cartesian product given several sets as either an iterable or individual arguments.

Can use ‘*’ operator on any sets for convenient shorthand.

Examples

>>> I = Interval(0, 5)
>>> S = FiniteSet(1, 2, 3)
>>> ProductSet(I, S)
[0, 5] x {1, 2, 3}
>>> (2, 2) in ProductSet(I, S)
True
>>> Interval(0, 1) * Interval(0, 1)  # The unit square
[0, 1] x [0, 1]
>>> H, T = Symbol('H'), Symbol('T')
>>> coin = FiniteSet(H, T)
>>> set(coin**2)
{(H, H), (H, T), (T, H), (T, T)}

Notes

  • Passes most operations down to the argument sets

  • Flattens Products of ProductSets

References

class diofant.sets.sets.Complement(a, b, evaluate=True)[source]

Represents relative complement of a set with another set.

\(A - B = \{x \in A| x \notin B\}\)

Examples

>>> Complement(FiniteSet(0, 1, 2), FiniteSet(1))
{0, 2}

See also

Intersection, Union

References

static reduce(A, B)[source]

Simplify a Complement.

Singleton Sets

class diofant.sets.sets.EmptySet(*args, **kwargs)[source]

Represents the empty set.

The empty set is available as a singleton as S.EmptySet.

Examples

>>> S.EmptySet
EmptySet()
>>> Interval(1, 2).intersection(S.EmptySet)
EmptySet()

References

Special Sets

Special sets.

class diofant.sets.fancysets.Naturals(*args, **kwargs)[source]

The set of natural numbers.

Represents the natural numbers (or counting numbers) which are all positive integers starting from 1. This set is also available as the Singleton, S.Naturals.

Examples

>>> 5 in S.Naturals
True
>>> iterable = iter(S.Naturals)
>>> next(iterable)
1
>>> next(iterable)
2
>>> next(iterable)
3
>>> S.Naturals.intersection(Interval(0, 10))
Range(1, 11, 1)

See also

Naturals0

non-negative integers

Integers

also includes negative integers

class diofant.sets.fancysets.Naturals0(*args, **kwargs)[source]

The set of natural numbers, starting from 0.

Represents the whole numbers which are all the non-negative integers, inclusive of zero.

See also

Naturals

positive integers

Integers

also includes the negative integers

class diofant.sets.fancysets.Integers(*args, **kwargs)[source]

The set of all integers.

Represents all integers: positive, negative and zero. This set is also available as the Singleton, S.Integers.

Examples

>>> 5 in S.Naturals
True
>>> iterable = iter(S.Integers)
>>> next(iterable)
0
>>> next(iterable)
1
>>> next(iterable)
-1
>>> next(iterable)
2
>>> S.Integers.intersection(Interval(-4, 4))
Range(-4, 5, 1)

See also

Naturals0

non-negative integers

Integers

positive and negative integers and zero

class diofant.sets.fancysets.Rationals(*args, **kwargs)[source]

The set of all rationals.

class diofant.sets.fancysets.ImageSet(lamda, base_set)[source]

Image of a set under a mathematical function.

Examples

>>> squares = ImageSet(Lambda(x, x**2), S.Naturals)
>>> 4 in squares
True
>>> 5 in squares
False
>>> FiniteSet(0, 1, 2, 3, 4, 5, 6, 7, 9, 10).intersection(squares)
{1, 4, 9}
>>> square_iterable = iter(squares)
>>> for i in range(4):
...     next(square_iterable)
1
4
9
16

If you want to get value for \(x\) = 2, 1/2 etc. (Please check whether the \(x\) value is in \(base_set\) or not before passing it as args)

>>> squares.lamda(2)
4
>>> squares.lamda(Rational(1, 2))
1/4
class diofant.sets.fancysets.Range(*args)[source]

Represents a range of integers.

Examples

>>> list(Range(5))
[0, 1, 2, 3, 4]
>>> list(Range(10, 15))
[10, 11, 12, 13, 14]
>>> list(Range(10, 20, 2))
[10, 12, 14, 16, 18]
>>> list(Range(20, 10, -2))
[12, 14, 16, 18, 20]
class diofant.sets.fancysets.ExtendedReals(*args, **kwargs)[source]

The set of all extended reals.

class diofant.sets.fancysets.Reals(*args, **kwargs)[source]

The set of all reals.