Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

""" 

Examples of infinite enumerated sets 

""" 

#***************************************************************************** 

# Copyright (C) 2009 Florent Hivert <Florent.Hivert@univ-rouen.fr> 

# 

# Distributed under the terms of the GNU General Public License (GPL) 

# http://www.gnu.org/licenses/ 

#***************************************************************************** 

 

from sage.structure.parent import Parent 

from sage.categories.infinite_enumerated_sets import InfiniteEnumeratedSets 

from sage.structure.unique_representation import UniqueRepresentation 

from sage.rings.integer import Integer 

 

class NonNegativeIntegers(UniqueRepresentation, Parent): 

r""" 

An example of infinite enumerated set: the non negative integers 

 

This class provides a minimal implementation of an infinite enumerated set. 

 

EXAMPLES:: 

 

sage: NN = InfiniteEnumeratedSets().example() 

sage: NN 

An example of an infinite enumerated set: the non negative integers 

sage: NN.cardinality() 

+Infinity 

sage: NN.list() 

Traceback (most recent call last): 

... 

NotImplementedError: cannot list an infinite set 

sage: NN.element_class 

<type 'sage.rings.integer.Integer'> 

sage: it = iter(NN) 

sage: [next(it), next(it), next(it), next(it), next(it)] 

[0, 1, 2, 3, 4] 

sage: x = next(it); type(x) 

<type 'sage.rings.integer.Integer'> 

sage: x.parent() 

Integer Ring 

sage: x+3 

8 

sage: NN(15) 

15 

sage: NN.first() 

0 

 

This checks that the different methods of `NN` return consistent 

results:: 

 

sage: TestSuite(NN).run(verbose = True) 

running ._test_an_element() . . . pass 

running ._test_cardinality() . . . pass 

running ._test_category() . . . pass 

running ._test_elements() . . . 

Running the test suite of self.an_element() 

running ._test_category() . . . pass 

running ._test_eq() . . . pass 

running ._test_new() . . . pass 

running ._test_nonzero_equal() . . . pass 

running ._test_not_implemented_methods() . . . pass 

running ._test_pickling() . . . pass 

pass 

running ._test_elements_eq_reflexive() . . . pass 

running ._test_elements_eq_symmetric() . . . pass 

running ._test_elements_eq_transitive() . . . pass 

running ._test_elements_neq() . . . pass 

running ._test_enumerated_set_contains() . . . pass 

running ._test_enumerated_set_iter_cardinality() . . . pass 

running ._test_enumerated_set_iter_list() . . . pass 

running ._test_eq() . . . pass 

running ._test_new() . . . pass 

running ._test_not_implemented_methods() . . . pass 

running ._test_pickling() . . . pass 

running ._test_some_elements() . . . pass 

""" 

 

def __init__(self): 

""" 

TESTS:: 

 

sage: NN = InfiniteEnumeratedSets().example() 

sage: NN 

An example of an infinite enumerated set: the non negative integers 

sage: NN.category() 

Category of infinite enumerated sets 

sage: TestSuite(NN).run() 

""" 

Parent.__init__(self, category = InfiniteEnumeratedSets()) 

 

def _repr_(self): 

""" 

TESTS:: 

 

sage: InfiniteEnumeratedSets().example() # indirect doctest 

An example of an infinite enumerated set: the non negative integers 

""" 

return "An example of an infinite enumerated set: the non negative integers" 

 

def __contains__(self, elt): 

""" 

EXAMPLES:: 

 

sage: NN = InfiniteEnumeratedSets().example() 

sage: 1 in NN 

True 

sage: -1 in NN 

False 

""" 

return Integer(elt) >= Integer(0) 

 

def __iter__(self): 

""" 

EXAMPLES:: 

 

sage: NN = InfiniteEnumeratedSets().example() 

sage: g = iter(NN) 

sage: next(g), next(g), next(g), next(g) 

(0, 1, 2, 3) 

""" 

i = Integer(0) 

while True: 

yield self._element_constructor_(i) 

i += 1 

 

def __call__(self, elt): 

""" 

EXAMPLES:: 

 

sage: NN = InfiniteEnumeratedSets().example() 

sage: NN(3) # indirect doctest 

3 

sage: NN(3).parent() 

Integer Ring 

sage: NN(-1) 

Traceback (most recent call last): 

ValueError: Value -1 is not a non negative integer. 

""" 

if elt in self: 

return self._element_constructor_(elt) 

else: 

raise ValueError("Value %s is not a non negative integer."%(elt)) 

 

def an_element(self): 

""" 

EXAMPLES:: 

 

sage: InfiniteEnumeratedSets().example().an_element() 

42 

""" 

return self._element_constructor_(Integer(42)) 

 

def next(self, o): 

""" 

EXAMPLES:: 

 

sage: NN = InfiniteEnumeratedSets().example() 

sage: NN.next(3) 

4 

""" 

return self._element_constructor_(o+1) 

 

def _element_constructor_(self, i): 

""" 

The default implementation of _element_constructor_ assumes 

that the constructor of the element class takes the parent as 

parameter. This is not the case for ``Integer``, so we need to 

provide an implementation. 

 

 

TESTS:: 

 

sage: NN = InfiniteEnumeratedSets().example() 

sage: x = NN(42); x 

42 

sage: type(x) 

<type 'sage.rings.integer.Integer'> 

sage: x.parent() 

Integer Ring 

""" 

return self.element_class(i) 

 

Element = Integer 

 

Example = NonNegativeIntegers