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

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 

6 

7from .sets import Set, FiniteSet, SetKind 

8 

9 

10class PowerSet(Set): 

11 r"""A symbolic object representing a power set. 

12 

13 Parameters 

14 ========== 

15 

16 arg : Set 

17 The set to take power of. 

18 

19 evaluate : bool 

20 The flag to control evaluation. 

21 

22 If the evaluation is disabled for finite sets, it can take 

23 advantage of using subset test as a membership test. 

24 

25 Notes 

26 ===== 

27 

28 Power set `\mathcal{P}(S)` is defined as a set containing all the 

29 subsets of `S`. 

30 

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`. 

34 

35 Examples 

36 ======== 

37 

38 >>> from sympy import PowerSet, S, FiniteSet 

39 

40 A power set of a finite set: 

41 

42 >>> PowerSet(FiniteSet(1, 2, 3)) 

43 PowerSet({1, 2, 3}) 

44 

45 A power set of an empty set: 

46 

47 >>> PowerSet(S.EmptySet) 

48 PowerSet(EmptySet) 

49 >>> PowerSet(PowerSet(S.EmptySet)) 

50 PowerSet(PowerSet(EmptySet)) 

51 

52 A power set of an infinite set: 

53 

54 >>> PowerSet(S.Reals) 

55 PowerSet(Reals) 

56 

57 Evaluating the power set of a finite set to its explicit form: 

58 

59 >>> PowerSet(FiniteSet(1, 2, 3)).rewrite(FiniteSet) 

60 FiniteSet(EmptySet, {1}, {2}, {3}, {1, 2}, {1, 3}, {2, 3}, {1, 2, 3}) 

61 

62 References 

63 ========== 

64 

65 .. [1] https://en.wikipedia.org/wiki/Power_set 

66 

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 

72 

73 arg = _sympify(arg) 

74 

75 if not isinstance(arg, Set): 

76 raise ValueError('{} must be a set.'.format(arg)) 

77 

78 return super().__new__(cls, arg) 

79 

80 @property 

81 def arg(self): 

82 return self.args[0] 

83 

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 

89 

90 @_sympifyit('other', NotImplemented) 

91 def _contains(self, other): 

92 if not isinstance(other, Set): 

93 return None 

94 

95 return fuzzy_bool(self.arg.is_superset(other)) 

96 

97 def _eval_is_subset(self, other): 

98 if isinstance(other, PowerSet): 

99 return self.arg.is_subset(other.arg) 

100 

101 def __len__(self): 

102 return 2 ** len(self.arg) 

103 

104 def __iter__(self): 

105 found = [S.EmptySet] 

106 yield S.EmptySet 

107 

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) 

116 

117 @property 

118 def kind(self): 

119 return SetKind(self.arg.kind)