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

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

"""Implementation of :class:`ExpressionDomain` class. """ 

 

from __future__ import print_function, division 

 

from sympy.polys.domains.field import Field 

from sympy.polys.domains.simpledomain import SimpleDomain 

from sympy.polys.domains.characteristiczero import CharacteristicZero 

 

from sympy.core import sympify, SympifyError 

from sympy.utilities import public 

from sympy.polys.polyutils import PicklableWithSlots 

 

@public 

class ExpressionDomain(Field, CharacteristicZero, SimpleDomain): 

"""A class for arbitrary expressions. """ 

 

is_SymbolicDomain = is_EX = True 

 

class Expression(PicklableWithSlots): 

"""An arbitrary expression. """ 

 

__slots__ = ['ex'] 

 

def __init__(self, ex): 

if not isinstance(ex, self.__class__): 

self.ex = sympify(ex) 

else: 

self.ex = ex.ex 

 

def __repr__(f): 

return 'EX(%s)' % repr(f.ex) 

 

def __str__(f): 

return 'EX(%s)' % str(f.ex) 

 

def __hash__(self): 

return hash((self.__class__.__name__, self.ex)) 

 

def as_expr(f): 

return f.ex 

 

def numer(f): 

return f.__class__(f.ex.as_numer_denom()[0]) 

 

def denom(f): 

return f.__class__(f.ex.as_numer_denom()[1]) 

 

def simplify(f, ex): 

return f.__class__(ex.cancel()) 

 

def __abs__(f): 

return f.__class__(abs(f.ex)) 

 

def __neg__(f): 

return f.__class__(-f.ex) 

 

def _to_ex(f, g): 

try: 

return f.__class__(g) 

except SympifyError: 

return None 

 

def __add__(f, g): 

g = f._to_ex(g) 

 

if g is not None: 

return f.simplify(f.ex + g.ex) 

else: 

return NotImplemented 

 

def __radd__(f, g): 

return f.simplify(f.__class__(g).ex + f.ex) 

 

def __sub__(f, g): 

g = f._to_ex(g) 

 

if g is not None: 

return f.simplify(f.ex - g.ex) 

else: 

return NotImplemented 

 

def __rsub__(f, g): 

return f.simplify(f.__class__(g).ex - f.ex) 

 

def __mul__(f, g): 

g = f._to_ex(g) 

 

if g is not None: 

return f.simplify(f.ex*g.ex) 

else: 

return NotImplemented 

 

def __rmul__(f, g): 

return f.simplify(f.__class__(g).ex*f.ex) 

 

def __pow__(f, n): 

n = f._to_ex(n) 

 

if n is not None: 

return f.simplify(f.ex**n.ex) 

else: 

return NotImplemented 

 

def __truediv__(f, g): 

g = f._to_ex(g) 

 

if g is not None: 

return f.simplify(f.ex/g.ex) 

else: 

return NotImplemented 

 

def __rtruediv__(f, g): 

return f.simplify(f.__class__(g).ex/f.ex) 

 

__div__ = __truediv__ 

__rdiv__ = __rtruediv__ 

 

def __eq__(f, g): 

return f.ex == f.__class__(g).ex 

 

def __ne__(f, g): 

return not f.__eq__(g) 

 

def __nonzero__(f): 

return f.ex != 0 

 

__bool__ = __nonzero__ 

 

def gcd(f, g): 

from sympy.polys import gcd 

return f.__class__(gcd(f.ex, f.__class__(g).ex)) 

 

def lcm(f, g): 

from sympy.polys import lcm 

return f.__class__(lcm(f.ex, f.__class__(g).ex)) 

 

dtype = Expression 

 

zero = Expression(0) 

one = Expression(1) 

 

rep = 'EX' 

 

has_assoc_Ring = False 

has_assoc_Field = True 

 

def __init__(self): 

pass 

 

def to_sympy(self, a): 

"""Convert ``a`` to a SymPy object. """ 

return a.as_expr() 

 

def from_sympy(self, a): 

"""Convert SymPy's expression to ``dtype``. """ 

return self.dtype(a) 

 

def from_ZZ_python(K1, a, K0): 

"""Convert a Python ``int`` object to ``dtype``. """ 

return K1(K0.to_sympy(a)) 

 

def from_QQ_python(K1, a, K0): 

"""Convert a Python ``Fraction`` object to ``dtype``. """ 

return K1(K0.to_sympy(a)) 

 

def from_ZZ_gmpy(K1, a, K0): 

"""Convert a GMPY ``mpz`` object to ``dtype``. """ 

return K1(K0.to_sympy(a)) 

 

def from_QQ_gmpy(K1, a, K0): 

"""Convert a GMPY ``mpq`` object to ``dtype``. """ 

return K1(K0.to_sympy(a)) 

 

def from_RealField(K1, a, K0): 

"""Convert a mpmath ``mpf`` object to ``dtype``. """ 

return K1(K0.to_sympy(a)) 

 

def from_PolynomialRing(K1, a, K0): 

"""Convert a ``DMP`` object to ``dtype``. """ 

return K1(K0.to_sympy(a)) 

 

def from_FractionField(K1, a, K0): 

"""Convert a ``DMF`` object to ``dtype``. """ 

return K1(K0.to_sympy(a)) 

 

def from_ExpressionDomain(K1, a, K0): 

"""Convert a ``EX`` object to ``dtype``. """ 

return a 

 

def get_ring(self): 

"""Returns a ring associated with ``self``. """ 

return self # XXX: EX is not a ring but we don't have much choice here. 

 

def get_field(self): 

"""Returns a field associated with ``self``. """ 

return self 

 

def is_positive(self, a): 

"""Returns True if ``a`` is positive. """ 

return a.ex.as_coeff_mul()[0].is_positive 

 

def is_negative(self, a): 

"""Returns True if ``a`` is negative. """ 

return a.ex.as_coeff_mul()[0].is_negative 

 

def is_nonpositive(self, a): 

"""Returns True if ``a`` is non-positive. """ 

return a.ex.as_coeff_mul()[0].is_nonpositive 

 

def is_nonnegative(self, a): 

"""Returns True if ``a`` is non-negative. """ 

return a.ex.as_coeff_mul()[0].is_nonnegative 

 

def numer(self, a): 

"""Returns numerator of ``a``. """ 

return a.numer() 

 

def denom(self, a): 

"""Returns denominator of ``a``. """ 

return a.denom() 

 

def gcd(self, a, b): 

return a.gcd(b) 

 

def lcm(self, a, b): 

return a.lcm(b)