Coverage for /usr/lib/python3/dist-packages/sympy/sets/powerset.py: 39%
46 statements
« prev ^ index » next coverage.py v7.9.1, created at 2025-06-14 15:55 +0200
« prev ^ index » next coverage.py v7.9.1, created at 2025-06-14 15:55 +0200
1from sympy.core.decorators import _sympifyit
2from sympy.core.parameters import global_parameters
3from sympy.core.logic import fuzzy_bool
4from sympy.core.singleton import S
5from sympy.core.sympify import _sympify
7from .sets import Set, FiniteSet, SetKind
10class PowerSet(Set):
11 r"""A symbolic object representing a power set.
13 Parameters
14 ==========
16 arg : Set
17 The set to take power of.
19 evaluate : bool
20 The flag to control evaluation.
22 If the evaluation is disabled for finite sets, it can take
23 advantage of using subset test as a membership test.
25 Notes
26 =====
28 Power set `\mathcal{P}(S)` is defined as a set containing all the
29 subsets of `S`.
31 If the set `S` is a finite set, its power set would have
32 `2^{\left| S \right|}` elements, where `\left| S \right|` denotes
33 the cardinality of `S`.
35 Examples
36 ========
38 >>> from sympy import PowerSet, S, FiniteSet
40 A power set of a finite set:
42 >>> PowerSet(FiniteSet(1, 2, 3))
43 PowerSet({1, 2, 3})
45 A power set of an empty set:
47 >>> PowerSet(S.EmptySet)
48 PowerSet(EmptySet)
49 >>> PowerSet(PowerSet(S.EmptySet))
50 PowerSet(PowerSet(EmptySet))
52 A power set of an infinite set:
54 >>> PowerSet(S.Reals)
55 PowerSet(Reals)
57 Evaluating the power set of a finite set to its explicit form:
59 >>> PowerSet(FiniteSet(1, 2, 3)).rewrite(FiniteSet)
60 FiniteSet(EmptySet, {1}, {2}, {3}, {1, 2}, {1, 3}, {2, 3}, {1, 2, 3})
62 References
63 ==========
65 .. [1] https://en.wikipedia.org/wiki/Power_set
67 .. [2] https://en.wikipedia.org/wiki/Axiom_of_power_set
68 """
69 def __new__(cls, arg, evaluate=None):
70 if evaluate is None:
71 evaluate=global_parameters.evaluate
73 arg = _sympify(arg)
75 if not isinstance(arg, Set):
76 raise ValueError('{} must be a set.'.format(arg))
78 return super().__new__(cls, arg)
80 @property
81 def arg(self):
82 return self.args[0]
84 def _eval_rewrite_as_FiniteSet(self, *args, **kwargs):
85 arg = self.arg
86 if arg.is_FiniteSet:
87 return arg.powerset()
88 return None
90 @_sympifyit('other', NotImplemented)
91 def _contains(self, other):
92 if not isinstance(other, Set):
93 return None
95 return fuzzy_bool(self.arg.is_superset(other))
97 def _eval_is_subset(self, other):
98 if isinstance(other, PowerSet):
99 return self.arg.is_subset(other.arg)
101 def __len__(self):
102 return 2 ** len(self.arg)
104 def __iter__(self):
105 found = [S.EmptySet]
106 yield S.EmptySet
108 for x in self.arg:
109 temp = []
110 x = FiniteSet(x)
111 for y in found:
112 new = x + y
113 yield new
114 temp.append(new)
115 found.extend(temp)
117 @property
118 def kind(self):
119 return SetKind(self.arg.kind)