test_fancysets.py 51 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313
  1. from sympy.core.expr import unchanged
  2. from sympy.sets.contains import Contains
  3. from sympy.sets.fancysets import (ImageSet, Range, normalize_theta_set,
  4. ComplexRegion)
  5. from sympy.sets.sets import (FiniteSet, Interval, Union, imageset,
  6. Intersection, ProductSet, SetKind)
  7. from sympy.sets.conditionset import ConditionSet
  8. from sympy.simplify.simplify import simplify
  9. from sympy.core.basic import Basic
  10. from sympy.core.containers import Tuple, TupleKind
  11. from sympy.core.function import Lambda
  12. from sympy.core.kind import NumberKind
  13. from sympy.core.numbers import (I, Rational, oo, pi)
  14. from sympy.core.relational import Eq
  15. from sympy.core.singleton import S
  16. from sympy.core.symbol import (Dummy, Symbol, symbols)
  17. from sympy.functions.elementary.complexes import Abs
  18. from sympy.functions.elementary.exponential import (exp, log)
  19. from sympy.functions.elementary.integers import floor
  20. from sympy.functions.elementary.miscellaneous import sqrt
  21. from sympy.functions.elementary.trigonometric import (cos, sin, tan)
  22. from sympy.logic.boolalg import And
  23. from sympy.matrices.dense import eye
  24. from sympy.testing.pytest import XFAIL, raises
  25. from sympy.abc import x, y, t, z
  26. from sympy.core.mod import Mod
  27. import itertools
  28. def test_naturals():
  29. N = S.Naturals
  30. assert 5 in N
  31. assert -5 not in N
  32. assert 5.5 not in N
  33. ni = iter(N)
  34. a, b, c, d = next(ni), next(ni), next(ni), next(ni)
  35. assert (a, b, c, d) == (1, 2, 3, 4)
  36. assert isinstance(a, Basic)
  37. assert N.intersect(Interval(-5, 5)) == Range(1, 6)
  38. assert N.intersect(Interval(-5, 5, True, True)) == Range(1, 5)
  39. assert N.boundary == N
  40. assert N.is_open == False
  41. assert N.is_closed == True
  42. assert N.inf == 1
  43. assert N.sup is oo
  44. assert not N.contains(oo)
  45. for s in (S.Naturals0, S.Naturals):
  46. assert s.intersection(S.Reals) is s
  47. assert s.is_subset(S.Reals)
  48. assert N.as_relational(x) == And(Eq(floor(x), x), x >= 1, x < oo)
  49. def test_naturals0():
  50. N = S.Naturals0
  51. assert 0 in N
  52. assert -1 not in N
  53. assert next(iter(N)) == 0
  54. assert not N.contains(oo)
  55. assert N.contains(sin(x)) == Contains(sin(x), N)
  56. def test_integers():
  57. Z = S.Integers
  58. assert 5 in Z
  59. assert -5 in Z
  60. assert 5.5 not in Z
  61. assert not Z.contains(oo)
  62. assert not Z.contains(-oo)
  63. zi = iter(Z)
  64. a, b, c, d = next(zi), next(zi), next(zi), next(zi)
  65. assert (a, b, c, d) == (0, 1, -1, 2)
  66. assert isinstance(a, Basic)
  67. assert Z.intersect(Interval(-5, 5)) == Range(-5, 6)
  68. assert Z.intersect(Interval(-5, 5, True, True)) == Range(-4, 5)
  69. assert Z.intersect(Interval(5, S.Infinity)) == Range(5, S.Infinity)
  70. assert Z.intersect(Interval.Lopen(5, S.Infinity)) == Range(6, S.Infinity)
  71. assert Z.inf is -oo
  72. assert Z.sup is oo
  73. assert Z.boundary == Z
  74. assert Z.is_open == False
  75. assert Z.is_closed == True
  76. assert Z.as_relational(x) == And(Eq(floor(x), x), -oo < x, x < oo)
  77. def test_ImageSet():
  78. raises(ValueError, lambda: ImageSet(x, S.Integers))
  79. assert ImageSet(Lambda(x, 1), S.Integers) == FiniteSet(1)
  80. assert ImageSet(Lambda(x, y), S.Integers) == {y}
  81. assert ImageSet(Lambda(x, 1), S.EmptySet) == S.EmptySet
  82. empty = Intersection(FiniteSet(log(2)/pi), S.Integers)
  83. assert unchanged(ImageSet, Lambda(x, 1), empty) # issue #17471
  84. squares = ImageSet(Lambda(x, x**2), S.Naturals)
  85. assert 4 in squares
  86. assert 5 not in squares
  87. assert FiniteSet(*range(10)).intersect(squares) == FiniteSet(1, 4, 9)
  88. assert 16 not in squares.intersect(Interval(0, 10))
  89. si = iter(squares)
  90. a, b, c, d = next(si), next(si), next(si), next(si)
  91. assert (a, b, c, d) == (1, 4, 9, 16)
  92. harmonics = ImageSet(Lambda(x, 1/x), S.Naturals)
  93. assert Rational(1, 5) in harmonics
  94. assert Rational(.25) in harmonics
  95. assert harmonics.contains(.25) == Contains(
  96. 0.25, ImageSet(Lambda(x, 1/x), S.Naturals), evaluate=False)
  97. assert Rational(.3) not in harmonics
  98. assert (1, 2) not in harmonics
  99. assert harmonics.is_iterable
  100. assert imageset(x, -x, Interval(0, 1)) == Interval(-1, 0)
  101. assert ImageSet(Lambda(x, x**2), Interval(0, 2)).doit() == Interval(0, 4)
  102. assert ImageSet(Lambda((x, y), 2*x), {4}, {3}).doit() == FiniteSet(8)
  103. assert (ImageSet(Lambda((x, y), x+y), {1, 2, 3}, {10, 20, 30}).doit() ==
  104. FiniteSet(11, 12, 13, 21, 22, 23, 31, 32, 33))
  105. c = Interval(1, 3) * Interval(1, 3)
  106. assert Tuple(2, 6) in ImageSet(Lambda(((x, y),), (x, 2*y)), c)
  107. assert Tuple(2, S.Half) in ImageSet(Lambda(((x, y),), (x, 1/y)), c)
  108. assert Tuple(2, -2) not in ImageSet(Lambda(((x, y),), (x, y**2)), c)
  109. assert Tuple(2, -2) in ImageSet(Lambda(((x, y),), (x, -2)), c)
  110. c3 = ProductSet(Interval(3, 7), Interval(8, 11), Interval(5, 9))
  111. assert Tuple(8, 3, 9) in ImageSet(Lambda(((t, y, x),), (y, t, x)), c3)
  112. assert Tuple(Rational(1, 8), 3, 9) in ImageSet(Lambda(((t, y, x),), (1/y, t, x)), c3)
  113. assert 2/pi not in ImageSet(Lambda(((x, y),), 2/x), c)
  114. assert 2/S(100) not in ImageSet(Lambda(((x, y),), 2/x), c)
  115. assert Rational(2, 3) in ImageSet(Lambda(((x, y),), 2/x), c)
  116. S1 = imageset(lambda x, y: x + y, S.Integers, S.Naturals)
  117. assert S1.base_pset == ProductSet(S.Integers, S.Naturals)
  118. assert S1.base_sets == (S.Integers, S.Naturals)
  119. # Passing a set instead of a FiniteSet shouldn't raise
  120. assert unchanged(ImageSet, Lambda(x, x**2), {1, 2, 3})
  121. S2 = ImageSet(Lambda(((x, y),), x+y), {(1, 2), (3, 4)})
  122. assert 3 in S2.doit()
  123. # FIXME: This doesn't yet work:
  124. #assert 3 in S2
  125. assert S2._contains(3) is None
  126. raises(TypeError, lambda: ImageSet(Lambda(x, x**2), 1))
  127. def test_image_is_ImageSet():
  128. assert isinstance(imageset(x, sqrt(sin(x)), Range(5)), ImageSet)
  129. def test_halfcircle():
  130. r, th = symbols('r, theta', real=True)
  131. L = Lambda(((r, th),), (r*cos(th), r*sin(th)))
  132. halfcircle = ImageSet(L, Interval(0, 1)*Interval(0, pi))
  133. assert (1, 0) in halfcircle
  134. assert (0, -1) not in halfcircle
  135. assert (0, 0) in halfcircle
  136. assert halfcircle._contains((r, 0)) is None
  137. assert not halfcircle.is_iterable
  138. @XFAIL
  139. def test_halfcircle_fail():
  140. r, th = symbols('r, theta', real=True)
  141. L = Lambda(((r, th),), (r*cos(th), r*sin(th)))
  142. halfcircle = ImageSet(L, Interval(0, 1)*Interval(0, pi))
  143. assert (r, 2*pi) not in halfcircle
  144. def test_ImageSet_iterator_not_injective():
  145. L = Lambda(x, x - x % 2) # produces 0, 2, 2, 4, 4, 6, 6, ...
  146. evens = ImageSet(L, S.Naturals)
  147. i = iter(evens)
  148. # No repeats here
  149. assert (next(i), next(i), next(i), next(i)) == (0, 2, 4, 6)
  150. def test_inf_Range_len():
  151. raises(ValueError, lambda: len(Range(0, oo, 2)))
  152. assert Range(0, oo, 2).size is S.Infinity
  153. assert Range(0, -oo, -2).size is S.Infinity
  154. assert Range(oo, 0, -2).size is S.Infinity
  155. assert Range(-oo, 0, 2).size is S.Infinity
  156. def test_Range_set():
  157. empty = Range(0)
  158. assert Range(5) == Range(0, 5) == Range(0, 5, 1)
  159. r = Range(10, 20, 2)
  160. assert 12 in r
  161. assert 8 not in r
  162. assert 11 not in r
  163. assert 30 not in r
  164. assert list(Range(0, 5)) == list(range(5))
  165. assert list(Range(5, 0, -1)) == list(range(5, 0, -1))
  166. assert Range(5, 15).sup == 14
  167. assert Range(5, 15).inf == 5
  168. assert Range(15, 5, -1).sup == 15
  169. assert Range(15, 5, -1).inf == 6
  170. assert Range(10, 67, 10).sup == 60
  171. assert Range(60, 7, -10).inf == 10
  172. assert len(Range(10, 38, 10)) == 3
  173. assert Range(0, 0, 5) == empty
  174. assert Range(oo, oo, 1) == empty
  175. assert Range(oo, 1, 1) == empty
  176. assert Range(-oo, 1, -1) == empty
  177. assert Range(1, oo, -1) == empty
  178. assert Range(1, -oo, 1) == empty
  179. assert Range(1, -4, oo) == empty
  180. ip = symbols('ip', positive=True)
  181. assert Range(0, ip, -1) == empty
  182. assert Range(0, -ip, 1) == empty
  183. assert Range(1, -4, -oo) == Range(1, 2)
  184. assert Range(1, 4, oo) == Range(1, 2)
  185. assert Range(-oo, oo).size == oo
  186. assert Range(oo, -oo, -1).size == oo
  187. raises(ValueError, lambda: Range(-oo, oo, 2))
  188. raises(ValueError, lambda: Range(x, pi, y))
  189. raises(ValueError, lambda: Range(x, y, 0))
  190. assert 5 in Range(0, oo, 5)
  191. assert -5 in Range(-oo, 0, 5)
  192. assert oo not in Range(0, oo)
  193. ni = symbols('ni', integer=False)
  194. assert ni not in Range(oo)
  195. u = symbols('u', integer=None)
  196. assert Range(oo).contains(u) is not False
  197. inf = symbols('inf', infinite=True)
  198. assert inf not in Range(-oo, oo)
  199. raises(ValueError, lambda: Range(0, oo, 2)[-1])
  200. raises(ValueError, lambda: Range(0, -oo, -2)[-1])
  201. assert Range(-oo, 1, 1)[-1] is S.Zero
  202. assert Range(oo, 1, -1)[-1] == 2
  203. assert inf not in Range(oo)
  204. assert Range(1, 10, 1)[-1] == 9
  205. assert all(i.is_Integer for i in Range(0, -1, 1))
  206. it = iter(Range(-oo, 0, 2))
  207. raises(TypeError, lambda: next(it))
  208. assert empty.intersect(S.Integers) == empty
  209. assert Range(-1, 10, 1).intersect(S.Complexes) == Range(-1, 10, 1)
  210. assert Range(-1, 10, 1).intersect(S.Reals) == Range(-1, 10, 1)
  211. assert Range(-1, 10, 1).intersect(S.Rationals) == Range(-1, 10, 1)
  212. assert Range(-1, 10, 1).intersect(S.Integers) == Range(-1, 10, 1)
  213. assert Range(-1, 10, 1).intersect(S.Naturals) == Range(1, 10, 1)
  214. assert Range(-1, 10, 1).intersect(S.Naturals0) == Range(0, 10, 1)
  215. # test slicing
  216. assert Range(1, 10, 1)[5] == 6
  217. assert Range(1, 12, 2)[5] == 11
  218. assert Range(1, 10, 1)[-1] == 9
  219. assert Range(1, 10, 3)[-1] == 7
  220. raises(ValueError, lambda: Range(oo,0,-1)[1:3:0])
  221. raises(ValueError, lambda: Range(oo,0,-1)[:1])
  222. raises(ValueError, lambda: Range(1, oo)[-2])
  223. raises(ValueError, lambda: Range(-oo, 1)[2])
  224. raises(IndexError, lambda: Range(10)[-20])
  225. raises(IndexError, lambda: Range(10)[20])
  226. raises(ValueError, lambda: Range(2, -oo, -2)[2:2:0])
  227. assert Range(2, -oo, -2)[2:2:2] == empty
  228. assert Range(2, -oo, -2)[:2:2] == Range(2, -2, -4)
  229. raises(ValueError, lambda: Range(-oo, 4, 2)[:2:2])
  230. assert Range(-oo, 4, 2)[::-2] == Range(2, -oo, -4)
  231. raises(ValueError, lambda: Range(-oo, 4, 2)[::2])
  232. assert Range(oo, 2, -2)[::] == Range(oo, 2, -2)
  233. assert Range(-oo, 4, 2)[:-2:-2] == Range(2, 0, -4)
  234. assert Range(-oo, 4, 2)[:-2:2] == Range(-oo, 0, 4)
  235. raises(ValueError, lambda: Range(-oo, 4, 2)[:0:-2])
  236. raises(ValueError, lambda: Range(-oo, 4, 2)[:2:-2])
  237. assert Range(-oo, 4, 2)[-2::-2] == Range(0, -oo, -4)
  238. raises(ValueError, lambda: Range(-oo, 4, 2)[-2:0:-2])
  239. raises(ValueError, lambda: Range(-oo, 4, 2)[0::2])
  240. assert Range(oo, 2, -2)[0::] == Range(oo, 2, -2)
  241. raises(ValueError, lambda: Range(-oo, 4, 2)[0:-2:2])
  242. assert Range(oo, 2, -2)[0:-2:] == Range(oo, 6, -2)
  243. raises(ValueError, lambda: Range(oo, 2, -2)[0:2:])
  244. raises(ValueError, lambda: Range(-oo, 4, 2)[2::-1])
  245. assert Range(-oo, 4, 2)[-2::2] == Range(0, 4, 4)
  246. assert Range(oo, 0, -2)[-10:0:2] == empty
  247. raises(ValueError, lambda: Range(oo, 0, -2)[0])
  248. raises(ValueError, lambda: Range(oo, 0, -2)[-10:10:2])
  249. raises(ValueError, lambda: Range(oo, 0, -2)[0::-2])
  250. assert Range(oo, 0, -2)[0:-4:-2] == empty
  251. assert Range(oo, 0, -2)[:0:2] == empty
  252. raises(ValueError, lambda: Range(oo, 0, -2)[:1:-1])
  253. # test empty Range
  254. assert Range(x, x, y) == empty
  255. assert empty.reversed == empty
  256. assert 0 not in empty
  257. assert list(empty) == []
  258. assert len(empty) == 0
  259. assert empty.size is S.Zero
  260. assert empty.intersect(FiniteSet(0)) is S.EmptySet
  261. assert bool(empty) is False
  262. raises(IndexError, lambda: empty[0])
  263. assert empty[:0] == empty
  264. raises(NotImplementedError, lambda: empty.inf)
  265. raises(NotImplementedError, lambda: empty.sup)
  266. assert empty.as_relational(x) is S.false
  267. AB = [None] + list(range(12))
  268. for R in [
  269. Range(1, 10),
  270. Range(1, 10, 2),
  271. ]:
  272. r = list(R)
  273. for a, b, c in itertools.product(AB, AB, [-3, -1, None, 1, 3]):
  274. for reverse in range(2):
  275. r = list(reversed(r))
  276. R = R.reversed
  277. result = list(R[a:b:c])
  278. ans = r[a:b:c]
  279. txt = ('\n%s[%s:%s:%s] = %s -> %s' % (
  280. R, a, b, c, result, ans))
  281. check = ans == result
  282. assert check, txt
  283. assert Range(1, 10, 1).boundary == Range(1, 10, 1)
  284. for r in (Range(1, 10, 2), Range(1, oo, 2)):
  285. rev = r.reversed
  286. assert r.inf == rev.inf and r.sup == rev.sup
  287. assert r.step == -rev.step
  288. builtin_range = range
  289. raises(TypeError, lambda: Range(builtin_range(1)))
  290. assert S(builtin_range(10)) == Range(10)
  291. assert S(builtin_range(1000000000000)) == Range(1000000000000)
  292. # test Range.as_relational
  293. assert Range(1, 4).as_relational(x) == (x >= 1) & (x <= 3) & Eq(Mod(x, 1), 0)
  294. assert Range(oo, 1, -2).as_relational(x) == (x >= 3) & (x < oo) & Eq(Mod(x + 1, -2), 0)
  295. def test_Range_symbolic():
  296. # symbolic Range
  297. xr = Range(x, x + 4, 5)
  298. sr = Range(x, y, t)
  299. i = Symbol('i', integer=True)
  300. ip = Symbol('i', integer=True, positive=True)
  301. ipr = Range(ip)
  302. inr = Range(0, -ip, -1)
  303. ir = Range(i, i + 19, 2)
  304. ir2 = Range(i, i*8, 3*i)
  305. i = Symbol('i', integer=True)
  306. inf = symbols('inf', infinite=True)
  307. raises(ValueError, lambda: Range(inf))
  308. raises(ValueError, lambda: Range(inf, 0, -1))
  309. raises(ValueError, lambda: Range(inf, inf, 1))
  310. raises(ValueError, lambda: Range(1, 1, inf))
  311. # args
  312. assert xr.args == (x, x + 5, 5)
  313. assert sr.args == (x, y, t)
  314. assert ir.args == (i, i + 20, 2)
  315. assert ir2.args == (i, 10*i, 3*i)
  316. # reversed
  317. raises(ValueError, lambda: xr.reversed)
  318. raises(ValueError, lambda: sr.reversed)
  319. assert ipr.reversed.args == (ip - 1, -1, -1)
  320. assert inr.reversed.args == (-ip + 1, 1, 1)
  321. assert ir.reversed.args == (i + 18, i - 2, -2)
  322. assert ir2.reversed.args == (7*i, -2*i, -3*i)
  323. # contains
  324. assert inf not in sr
  325. assert inf not in ir
  326. assert 0 in ipr
  327. assert 0 in inr
  328. raises(TypeError, lambda: 1 in ipr)
  329. raises(TypeError, lambda: -1 in inr)
  330. assert .1 not in sr
  331. assert .1 not in ir
  332. assert i + 1 not in ir
  333. assert i + 2 in ir
  334. raises(TypeError, lambda: x in xr) # XXX is this what contains is supposed to do?
  335. raises(TypeError, lambda: 1 in sr) # XXX is this what contains is supposed to do?
  336. # iter
  337. raises(ValueError, lambda: next(iter(xr)))
  338. raises(ValueError, lambda: next(iter(sr)))
  339. assert next(iter(ir)) == i
  340. assert next(iter(ir2)) == i
  341. assert sr.intersect(S.Integers) == sr
  342. assert sr.intersect(FiniteSet(x)) == Intersection({x}, sr)
  343. raises(ValueError, lambda: sr[:2])
  344. raises(ValueError, lambda: xr[0])
  345. raises(ValueError, lambda: sr[0])
  346. # len
  347. assert len(ir) == ir.size == 10
  348. assert len(ir2) == ir2.size == 3
  349. raises(ValueError, lambda: len(xr))
  350. raises(ValueError, lambda: xr.size)
  351. raises(ValueError, lambda: len(sr))
  352. raises(ValueError, lambda: sr.size)
  353. # bool
  354. assert bool(Range(0)) == False
  355. assert bool(xr)
  356. assert bool(ir)
  357. assert bool(ipr)
  358. assert bool(inr)
  359. raises(ValueError, lambda: bool(sr))
  360. raises(ValueError, lambda: bool(ir2))
  361. # inf
  362. raises(ValueError, lambda: xr.inf)
  363. raises(ValueError, lambda: sr.inf)
  364. assert ipr.inf == 0
  365. assert inr.inf == -ip + 1
  366. assert ir.inf == i
  367. raises(ValueError, lambda: ir2.inf)
  368. # sup
  369. raises(ValueError, lambda: xr.sup)
  370. raises(ValueError, lambda: sr.sup)
  371. assert ipr.sup == ip - 1
  372. assert inr.sup == 0
  373. assert ir.inf == i
  374. raises(ValueError, lambda: ir2.sup)
  375. # getitem
  376. raises(ValueError, lambda: xr[0])
  377. raises(ValueError, lambda: sr[0])
  378. raises(ValueError, lambda: sr[-1])
  379. raises(ValueError, lambda: sr[:2])
  380. assert ir[:2] == Range(i, i + 4, 2)
  381. assert ir[0] == i
  382. assert ir[-2] == i + 16
  383. assert ir[-1] == i + 18
  384. assert ir2[:2] == Range(i, 7*i, 3*i)
  385. assert ir2[0] == i
  386. assert ir2[-2] == 4*i
  387. assert ir2[-1] == 7*i
  388. raises(ValueError, lambda: Range(i)[-1])
  389. assert ipr[0] == ipr.inf == 0
  390. assert ipr[-1] == ipr.sup == ip - 1
  391. assert inr[0] == inr.sup == 0
  392. assert inr[-1] == inr.inf == -ip + 1
  393. raises(ValueError, lambda: ipr[-2])
  394. assert ir.inf == i
  395. assert ir.sup == i + 18
  396. raises(ValueError, lambda: Range(i).inf)
  397. # as_relational
  398. assert ir.as_relational(x) == ((x >= i) & (x <= i + 18) &
  399. Eq(Mod(-i + x, 2), 0))
  400. assert ir2.as_relational(x) == Eq(
  401. Mod(-i + x, 3*i), 0) & (((x >= i) & (x <= 7*i) & (3*i >= 1)) |
  402. ((x <= i) & (x >= 7*i) & (3*i <= -1)))
  403. assert Range(i, i + 1).as_relational(x) == Eq(x, i)
  404. assert sr.as_relational(z) == Eq(
  405. Mod(t, 1), 0) & Eq(Mod(x, 1), 0) & Eq(Mod(-x + z, t), 0
  406. ) & (((z >= x) & (z <= -t + y) & (t >= 1)) |
  407. ((z <= x) & (z >= -t + y) & (t <= -1)))
  408. assert xr.as_relational(z) == Eq(z, x) & Eq(Mod(x, 1), 0)
  409. # symbols can clash if user wants (but it must be integer)
  410. assert xr.as_relational(x) == Eq(Mod(x, 1), 0)
  411. # contains() for symbolic values (issue #18146)
  412. e = Symbol('e', integer=True, even=True)
  413. o = Symbol('o', integer=True, odd=True)
  414. assert Range(5).contains(i) == And(i >= 0, i <= 4)
  415. assert Range(1).contains(i) == Eq(i, 0)
  416. assert Range(-oo, 5, 1).contains(i) == (i <= 4)
  417. assert Range(-oo, oo).contains(i) == True
  418. assert Range(0, 8, 2).contains(i) == Contains(i, Range(0, 8, 2))
  419. assert Range(0, 8, 2).contains(e) == And(e >= 0, e <= 6)
  420. assert Range(0, 8, 2).contains(2*i) == And(2*i >= 0, 2*i <= 6)
  421. assert Range(0, 8, 2).contains(o) == False
  422. assert Range(1, 9, 2).contains(e) == False
  423. assert Range(1, 9, 2).contains(o) == And(o >= 1, o <= 7)
  424. assert Range(8, 0, -2).contains(o) == False
  425. assert Range(9, 1, -2).contains(o) == And(o >= 3, o <= 9)
  426. assert Range(-oo, 8, 2).contains(i) == Contains(i, Range(-oo, 8, 2))
  427. def test_range_range_intersection():
  428. for a, b, r in [
  429. (Range(0), Range(1), S.EmptySet),
  430. (Range(3), Range(4, oo), S.EmptySet),
  431. (Range(3), Range(-3, -1), S.EmptySet),
  432. (Range(1, 3), Range(0, 3), Range(1, 3)),
  433. (Range(1, 3), Range(1, 4), Range(1, 3)),
  434. (Range(1, oo, 2), Range(2, oo, 2), S.EmptySet),
  435. (Range(0, oo, 2), Range(oo), Range(0, oo, 2)),
  436. (Range(0, oo, 2), Range(100), Range(0, 100, 2)),
  437. (Range(2, oo, 2), Range(oo), Range(2, oo, 2)),
  438. (Range(0, oo, 2), Range(5, 6), S.EmptySet),
  439. (Range(2, 80, 1), Range(55, 71, 4), Range(55, 71, 4)),
  440. (Range(0, 6, 3), Range(-oo, 5, 3), S.EmptySet),
  441. (Range(0, oo, 2), Range(5, oo, 3), Range(8, oo, 6)),
  442. (Range(4, 6, 2), Range(2, 16, 7), S.EmptySet),]:
  443. assert a.intersect(b) == r
  444. assert a.intersect(b.reversed) == r
  445. assert a.reversed.intersect(b) == r
  446. assert a.reversed.intersect(b.reversed) == r
  447. a, b = b, a
  448. assert a.intersect(b) == r
  449. assert a.intersect(b.reversed) == r
  450. assert a.reversed.intersect(b) == r
  451. assert a.reversed.intersect(b.reversed) == r
  452. def test_range_interval_intersection():
  453. p = symbols('p', positive=True)
  454. assert isinstance(Range(3).intersect(Interval(p, p + 2)), Intersection)
  455. assert Range(4).intersect(Interval(0, 3)) == Range(4)
  456. assert Range(4).intersect(Interval(-oo, oo)) == Range(4)
  457. assert Range(4).intersect(Interval(1, oo)) == Range(1, 4)
  458. assert Range(4).intersect(Interval(1.1, oo)) == Range(2, 4)
  459. assert Range(4).intersect(Interval(0.1, 3)) == Range(1, 4)
  460. assert Range(4).intersect(Interval(0.1, 3.1)) == Range(1, 4)
  461. assert Range(4).intersect(Interval.open(0, 3)) == Range(1, 3)
  462. assert Range(4).intersect(Interval.open(0.1, 0.5)) is S.EmptySet
  463. assert Interval(-1, 5).intersect(S.Complexes) == Interval(-1, 5)
  464. assert Interval(-1, 5).intersect(S.Reals) == Interval(-1, 5)
  465. assert Interval(-1, 5).intersect(S.Integers) == Range(-1, 6)
  466. assert Interval(-1, 5).intersect(S.Naturals) == Range(1, 6)
  467. assert Interval(-1, 5).intersect(S.Naturals0) == Range(0, 6)
  468. # Null Range intersections
  469. assert Range(0).intersect(Interval(0.2, 0.8)) is S.EmptySet
  470. assert Range(0).intersect(Interval(-oo, oo)) is S.EmptySet
  471. def test_range_is_finite_set():
  472. assert Range(-100, 100).is_finite_set is True
  473. assert Range(2, oo).is_finite_set is False
  474. assert Range(-oo, 50).is_finite_set is False
  475. assert Range(-oo, oo).is_finite_set is False
  476. assert Range(oo, -oo).is_finite_set is True
  477. assert Range(0, 0).is_finite_set is True
  478. assert Range(oo, oo).is_finite_set is True
  479. assert Range(-oo, -oo).is_finite_set is True
  480. n = Symbol('n', integer=True)
  481. m = Symbol('m', integer=True)
  482. assert Range(n, n + 49).is_finite_set is True
  483. assert Range(n, 0).is_finite_set is True
  484. assert Range(-3, n + 7).is_finite_set is True
  485. assert Range(n, m).is_finite_set is True
  486. assert Range(n + m, m - n).is_finite_set is True
  487. assert Range(n, n + m + n).is_finite_set is True
  488. assert Range(n, oo).is_finite_set is False
  489. assert Range(-oo, n).is_finite_set is False
  490. assert Range(n, -oo).is_finite_set is True
  491. assert Range(oo, n).is_finite_set is True
  492. def test_Range_is_iterable():
  493. assert Range(-100, 100).is_iterable is True
  494. assert Range(2, oo).is_iterable is False
  495. assert Range(-oo, 50).is_iterable is False
  496. assert Range(-oo, oo).is_iterable is False
  497. assert Range(oo, -oo).is_iterable is True
  498. assert Range(0, 0).is_iterable is True
  499. assert Range(oo, oo).is_iterable is True
  500. assert Range(-oo, -oo).is_iterable is True
  501. n = Symbol('n', integer=True)
  502. m = Symbol('m', integer=True)
  503. p = Symbol('p', integer=True, positive=True)
  504. assert Range(n, n + 49).is_iterable is True
  505. assert Range(n, 0).is_iterable is False
  506. assert Range(-3, n + 7).is_iterable is False
  507. assert Range(-3, p + 7).is_iterable is False # Should work with better __iter__
  508. assert Range(n, m).is_iterable is False
  509. assert Range(n + m, m - n).is_iterable is False
  510. assert Range(n, n + m + n).is_iterable is False
  511. assert Range(n, oo).is_iterable is False
  512. assert Range(-oo, n).is_iterable is False
  513. x = Symbol('x')
  514. assert Range(x, x + 49).is_iterable is False
  515. assert Range(x, 0).is_iterable is False
  516. assert Range(-3, x + 7).is_iterable is False
  517. assert Range(x, m).is_iterable is False
  518. assert Range(x + m, m - x).is_iterable is False
  519. assert Range(x, x + m + x).is_iterable is False
  520. assert Range(x, oo).is_iterable is False
  521. assert Range(-oo, x).is_iterable is False
  522. def test_Integers_eval_imageset():
  523. ans = ImageSet(Lambda(x, 2*x + Rational(3, 7)), S.Integers)
  524. im = imageset(Lambda(x, -2*x + Rational(3, 7)), S.Integers)
  525. assert im == ans
  526. im = imageset(Lambda(x, -2*x - Rational(11, 7)), S.Integers)
  527. assert im == ans
  528. y = Symbol('y')
  529. L = imageset(x, 2*x + y, S.Integers)
  530. assert y + 4 in L
  531. a, b, c = 0.092, 0.433, 0.341
  532. assert a in imageset(x, a + c*x, S.Integers)
  533. assert b in imageset(x, b + c*x, S.Integers)
  534. _x = symbols('x', negative=True)
  535. eq = _x**2 - _x + 1
  536. assert imageset(_x, eq, S.Integers).lamda.expr == _x**2 + _x + 1
  537. eq = 3*_x - 1
  538. assert imageset(_x, eq, S.Integers).lamda.expr == 3*_x + 2
  539. assert imageset(x, (x, 1/x), S.Integers) == \
  540. ImageSet(Lambda(x, (x, 1/x)), S.Integers)
  541. def test_Range_eval_imageset():
  542. a, b, c = symbols('a b c')
  543. assert imageset(x, a*(x + b) + c, Range(3)) == \
  544. imageset(x, a*x + a*b + c, Range(3))
  545. eq = (x + 1)**2
  546. assert imageset(x, eq, Range(3)).lamda.expr == eq
  547. eq = a*(x + b) + c
  548. r = Range(3, -3, -2)
  549. imset = imageset(x, eq, r)
  550. assert imset.lamda.expr != eq
  551. assert list(imset) == [eq.subs(x, i).expand() for i in list(r)]
  552. def test_fun():
  553. assert (FiniteSet(*ImageSet(Lambda(x, sin(pi*x/4)),
  554. Range(-10, 11))) == FiniteSet(-1, -sqrt(2)/2, 0, sqrt(2)/2, 1))
  555. def test_Range_is_empty():
  556. i = Symbol('i', integer=True)
  557. n = Symbol('n', negative=True, integer=True)
  558. p = Symbol('p', positive=True, integer=True)
  559. assert Range(0).is_empty
  560. assert not Range(1).is_empty
  561. assert Range(1, 0).is_empty
  562. assert not Range(-1, 0).is_empty
  563. assert Range(i).is_empty is None
  564. assert Range(n).is_empty
  565. assert Range(p).is_empty is False
  566. assert Range(n, 0).is_empty is False
  567. assert Range(n, p).is_empty is False
  568. assert Range(p, n).is_empty
  569. assert Range(n, -1).is_empty is None
  570. assert Range(p, n, -1).is_empty is False
  571. def test_Reals():
  572. assert 5 in S.Reals
  573. assert S.Pi in S.Reals
  574. assert -sqrt(2) in S.Reals
  575. assert (2, 5) not in S.Reals
  576. assert sqrt(-1) not in S.Reals
  577. assert S.Reals == Interval(-oo, oo)
  578. assert S.Reals != Interval(0, oo)
  579. assert S.Reals.is_subset(Interval(-oo, oo))
  580. assert S.Reals.intersect(Range(-oo, oo)) == Range(-oo, oo)
  581. assert S.ComplexInfinity not in S.Reals
  582. assert S.NaN not in S.Reals
  583. assert x + S.ComplexInfinity not in S.Reals
  584. def test_Complex():
  585. assert 5 in S.Complexes
  586. assert 5 + 4*I in S.Complexes
  587. assert S.Pi in S.Complexes
  588. assert -sqrt(2) in S.Complexes
  589. assert -I in S.Complexes
  590. assert sqrt(-1) in S.Complexes
  591. assert S.Complexes.intersect(S.Reals) == S.Reals
  592. assert S.Complexes.union(S.Reals) == S.Complexes
  593. assert S.Complexes == ComplexRegion(S.Reals*S.Reals)
  594. assert (S.Complexes == ComplexRegion(Interval(1, 2)*Interval(3, 4))) == False
  595. assert str(S.Complexes) == "Complexes"
  596. assert repr(S.Complexes) == "Complexes"
  597. def take(n, iterable):
  598. "Return first n items of the iterable as a list"
  599. return list(itertools.islice(iterable, n))
  600. def test_intersections():
  601. assert S.Integers.intersect(S.Reals) == S.Integers
  602. assert 5 in S.Integers.intersect(S.Reals)
  603. assert 5 in S.Integers.intersect(S.Reals)
  604. assert -5 not in S.Naturals.intersect(S.Reals)
  605. assert 5.5 not in S.Integers.intersect(S.Reals)
  606. assert 5 in S.Integers.intersect(Interval(3, oo))
  607. assert -5 in S.Integers.intersect(Interval(-oo, 3))
  608. assert all(x.is_Integer
  609. for x in take(10, S.Integers.intersect(Interval(3, oo)) ))
  610. def test_infinitely_indexed_set_1():
  611. from sympy.abc import n, m
  612. assert imageset(Lambda(n, n), S.Integers) == imageset(Lambda(m, m), S.Integers)
  613. assert imageset(Lambda(n, 2*n), S.Integers).intersect(
  614. imageset(Lambda(m, 2*m + 1), S.Integers)) is S.EmptySet
  615. assert imageset(Lambda(n, 2*n), S.Integers).intersect(
  616. imageset(Lambda(n, 2*n + 1), S.Integers)) is S.EmptySet
  617. assert imageset(Lambda(m, 2*m), S.Integers).intersect(
  618. imageset(Lambda(n, 3*n), S.Integers)).dummy_eq(
  619. ImageSet(Lambda(t, 6*t), S.Integers))
  620. assert imageset(x, x/2 + Rational(1, 3), S.Integers).intersect(S.Integers) is S.EmptySet
  621. assert imageset(x, x/2 + S.Half, S.Integers).intersect(S.Integers) is S.Integers
  622. # https://github.com/sympy/sympy/issues/17355
  623. S53 = ImageSet(Lambda(n, 5*n + 3), S.Integers)
  624. assert S53.intersect(S.Integers) == S53
  625. def test_infinitely_indexed_set_2():
  626. from sympy.abc import n
  627. a = Symbol('a', integer=True)
  628. assert imageset(Lambda(n, n), S.Integers) == \
  629. imageset(Lambda(n, n + a), S.Integers)
  630. assert imageset(Lambda(n, n + pi), S.Integers) == \
  631. imageset(Lambda(n, n + a + pi), S.Integers)
  632. assert imageset(Lambda(n, n), S.Integers) == \
  633. imageset(Lambda(n, -n + a), S.Integers)
  634. assert imageset(Lambda(n, -6*n), S.Integers) == \
  635. ImageSet(Lambda(n, 6*n), S.Integers)
  636. assert imageset(Lambda(n, 2*n + pi), S.Integers) == \
  637. ImageSet(Lambda(n, 2*n + pi - 2), S.Integers)
  638. def test_imageset_intersect_real():
  639. from sympy.abc import n
  640. assert imageset(Lambda(n, n + (n - 1)*(n + 1)*I), S.Integers).intersect(S.Reals) == FiniteSet(-1, 1)
  641. im = (n - 1)*(n + S.Half)
  642. assert imageset(Lambda(n, n + im*I), S.Integers
  643. ).intersect(S.Reals) == FiniteSet(1)
  644. assert imageset(Lambda(n, n + im*(n + 1)*I), S.Naturals0
  645. ).intersect(S.Reals) == FiniteSet(1)
  646. assert imageset(Lambda(n, n/2 + im.expand()*I), S.Integers
  647. ).intersect(S.Reals) == ImageSet(Lambda(x, x/2), ConditionSet(
  648. n, Eq(n**2 - n/2 - S(1)/2, 0), S.Integers))
  649. assert imageset(Lambda(n, n/(1/n - 1) + im*(n + 1)*I), S.Integers
  650. ).intersect(S.Reals) == FiniteSet(S.Half)
  651. assert imageset(Lambda(n, n/(n - 6) +
  652. (n - 3)*(n + 1)*I/(2*n + 2)), S.Integers).intersect(
  653. S.Reals) == FiniteSet(-1)
  654. assert imageset(Lambda(n, n/(n**2 - 9) +
  655. (n - 3)*(n + 1)*I/(2*n + 2)), S.Integers).intersect(
  656. S.Reals) is S.EmptySet
  657. s = ImageSet(
  658. Lambda(n, -I*(I*(2*pi*n - pi/4) + log(Abs(sqrt(-I))))),
  659. S.Integers)
  660. # s is unevaluated, but after intersection the result
  661. # should be canonical
  662. assert s.intersect(S.Reals) == imageset(
  663. Lambda(n, 2*n*pi - pi/4), S.Integers) == ImageSet(
  664. Lambda(n, 2*pi*n + pi*Rational(7, 4)), S.Integers)
  665. def test_imageset_intersect_interval():
  666. from sympy.abc import n
  667. f1 = ImageSet(Lambda(n, n*pi), S.Integers)
  668. f2 = ImageSet(Lambda(n, 2*n), Interval(0, pi))
  669. f3 = ImageSet(Lambda(n, 2*n*pi + pi/2), S.Integers)
  670. # complex expressions
  671. f4 = ImageSet(Lambda(n, n*I*pi), S.Integers)
  672. f5 = ImageSet(Lambda(n, 2*I*n*pi + pi/2), S.Integers)
  673. # non-linear expressions
  674. f6 = ImageSet(Lambda(n, log(n)), S.Integers)
  675. f7 = ImageSet(Lambda(n, n**2), S.Integers)
  676. f8 = ImageSet(Lambda(n, Abs(n)), S.Integers)
  677. f9 = ImageSet(Lambda(n, exp(n)), S.Naturals0)
  678. assert f1.intersect(Interval(-1, 1)) == FiniteSet(0)
  679. assert f1.intersect(Interval(0, 2*pi, False, True)) == FiniteSet(0, pi)
  680. assert f2.intersect(Interval(1, 2)) == Interval(1, 2)
  681. assert f3.intersect(Interval(-1, 1)) == S.EmptySet
  682. assert f3.intersect(Interval(-5, 5)) == FiniteSet(pi*Rational(-3, 2), pi/2)
  683. assert f4.intersect(Interval(-1, 1)) == FiniteSet(0)
  684. assert f4.intersect(Interval(1, 2)) == S.EmptySet
  685. assert f5.intersect(Interval(0, 1)) == S.EmptySet
  686. assert f6.intersect(Interval(0, 1)) == FiniteSet(S.Zero, log(2))
  687. assert f7.intersect(Interval(0, 10)) == Intersection(f7, Interval(0, 10))
  688. assert f8.intersect(Interval(0, 2)) == Intersection(f8, Interval(0, 2))
  689. assert f9.intersect(Interval(1, 2)) == Intersection(f9, Interval(1, 2))
  690. def test_imageset_intersect_diophantine():
  691. from sympy.abc import m, n
  692. # Check that same lambda variable for both ImageSets is handled correctly
  693. img1 = ImageSet(Lambda(n, 2*n + 1), S.Integers)
  694. img2 = ImageSet(Lambda(n, 4*n + 1), S.Integers)
  695. assert img1.intersect(img2) == img2
  696. # Empty solution set returned by diophantine:
  697. assert ImageSet(Lambda(n, 2*n), S.Integers).intersect(
  698. ImageSet(Lambda(n, 2*n + 1), S.Integers)) == S.EmptySet
  699. # Check intersection with S.Integers:
  700. assert ImageSet(Lambda(n, 9/n + 20*n/3), S.Integers).intersect(
  701. S.Integers) == FiniteSet(-61, -23, 23, 61)
  702. # Single solution (2, 3) for diophantine solution:
  703. assert ImageSet(Lambda(n, (n - 2)**2), S.Integers).intersect(
  704. ImageSet(Lambda(n, -(n - 3)**2), S.Integers)) == FiniteSet(0)
  705. # Single parametric solution for diophantine solution:
  706. assert ImageSet(Lambda(n, n**2 + 5), S.Integers).intersect(
  707. ImageSet(Lambda(m, 2*m), S.Integers)).dummy_eq(ImageSet(
  708. Lambda(n, 4*n**2 + 4*n + 6), S.Integers))
  709. # 4 non-parametric solution couples for dioph. equation:
  710. assert ImageSet(Lambda(n, n**2 - 9), S.Integers).intersect(
  711. ImageSet(Lambda(m, -m**2), S.Integers)) == FiniteSet(-9, 0)
  712. # Double parametric solution for diophantine solution:
  713. assert ImageSet(Lambda(m, m**2 + 40), S.Integers).intersect(
  714. ImageSet(Lambda(n, 41*n), S.Integers)).dummy_eq(Intersection(
  715. ImageSet(Lambda(m, m**2 + 40), S.Integers),
  716. ImageSet(Lambda(n, 41*n), S.Integers)))
  717. # Check that diophantine returns *all* (8) solutions (permute=True)
  718. assert ImageSet(Lambda(n, n**4 - 2**4), S.Integers).intersect(
  719. ImageSet(Lambda(m, -m**4 + 3**4), S.Integers)) == FiniteSet(0, 65)
  720. assert ImageSet(Lambda(n, pi/12 + n*5*pi/12), S.Integers).intersect(
  721. ImageSet(Lambda(n, 7*pi/12 + n*11*pi/12), S.Integers)).dummy_eq(ImageSet(
  722. Lambda(n, 55*pi*n/12 + 17*pi/4), S.Integers))
  723. # TypeError raised by diophantine (#18081)
  724. assert ImageSet(Lambda(n, n*log(2)), S.Integers).intersection(
  725. S.Integers).dummy_eq(Intersection(ImageSet(
  726. Lambda(n, n*log(2)), S.Integers), S.Integers))
  727. # NotImplementedError raised by diophantine (no solver for cubic_thue)
  728. assert ImageSet(Lambda(n, n**3 + 1), S.Integers).intersect(
  729. ImageSet(Lambda(n, n**3), S.Integers)).dummy_eq(Intersection(
  730. ImageSet(Lambda(n, n**3 + 1), S.Integers),
  731. ImageSet(Lambda(n, n**3), S.Integers)))
  732. def test_infinitely_indexed_set_3():
  733. from sympy.abc import n, m
  734. assert imageset(Lambda(m, 2*pi*m), S.Integers).intersect(
  735. imageset(Lambda(n, 3*pi*n), S.Integers)).dummy_eq(
  736. ImageSet(Lambda(t, 6*pi*t), S.Integers))
  737. assert imageset(Lambda(n, 2*n + 1), S.Integers) == \
  738. imageset(Lambda(n, 2*n - 1), S.Integers)
  739. assert imageset(Lambda(n, 3*n + 2), S.Integers) == \
  740. imageset(Lambda(n, 3*n - 1), S.Integers)
  741. def test_ImageSet_simplification():
  742. from sympy.abc import n, m
  743. assert imageset(Lambda(n, n), S.Integers) == S.Integers
  744. assert imageset(Lambda(n, sin(n)),
  745. imageset(Lambda(m, tan(m)), S.Integers)) == \
  746. imageset(Lambda(m, sin(tan(m))), S.Integers)
  747. assert imageset(n, 1 + 2*n, S.Naturals) == Range(3, oo, 2)
  748. assert imageset(n, 1 + 2*n, S.Naturals0) == Range(1, oo, 2)
  749. assert imageset(n, 1 - 2*n, S.Naturals) == Range(-1, -oo, -2)
  750. def test_ImageSet_contains():
  751. assert (2, S.Half) in imageset(x, (x, 1/x), S.Integers)
  752. assert imageset(x, x + I*3, S.Integers).intersection(S.Reals) is S.EmptySet
  753. i = Dummy(integer=True)
  754. q = imageset(x, x + I*y, S.Integers).intersection(S.Reals)
  755. assert q.subs(y, I*i).intersection(S.Integers) is S.Integers
  756. q = imageset(x, x + I*y/x, S.Integers).intersection(S.Reals)
  757. assert q.subs(y, 0) is S.Integers
  758. assert q.subs(y, I*i*x).intersection(S.Integers) is S.Integers
  759. z = cos(1)**2 + sin(1)**2 - 1
  760. q = imageset(x, x + I*z, S.Integers).intersection(S.Reals)
  761. assert q is not S.EmptySet
  762. def test_ComplexRegion_contains():
  763. r = Symbol('r', real=True)
  764. # contains in ComplexRegion
  765. a = Interval(2, 3)
  766. b = Interval(4, 6)
  767. c = Interval(7, 9)
  768. c1 = ComplexRegion(a*b)
  769. c2 = ComplexRegion(Union(a*b, c*a))
  770. assert 2.5 + 4.5*I in c1
  771. assert 2 + 4*I in c1
  772. assert 3 + 4*I in c1
  773. assert 8 + 2.5*I in c2
  774. assert 2.5 + 6.1*I not in c1
  775. assert 4.5 + 3.2*I not in c1
  776. assert c1.contains(x) == Contains(x, c1, evaluate=False)
  777. assert c1.contains(r) == False
  778. assert c2.contains(x) == Contains(x, c2, evaluate=False)
  779. assert c2.contains(r) == False
  780. r1 = Interval(0, 1)
  781. theta1 = Interval(0, 2*S.Pi)
  782. c3 = ComplexRegion(r1*theta1, polar=True)
  783. assert (0.5 + I*6/10) in c3
  784. assert (S.Half + I*6/10) in c3
  785. assert (S.Half + .6*I) in c3
  786. assert (0.5 + .6*I) in c3
  787. assert I in c3
  788. assert 1 in c3
  789. assert 0 in c3
  790. assert 1 + I not in c3
  791. assert 1 - I not in c3
  792. assert c3.contains(x) == Contains(x, c3, evaluate=False)
  793. assert c3.contains(r + 2*I) == Contains(
  794. r + 2*I, c3, evaluate=False) # is in fact False
  795. assert c3.contains(1/(1 + r**2)) == Contains(
  796. 1/(1 + r**2), c3, evaluate=False) # is in fact True
  797. r2 = Interval(0, 3)
  798. theta2 = Interval(pi, 2*pi, left_open=True)
  799. c4 = ComplexRegion(r2*theta2, polar=True)
  800. assert c4.contains(0) == True
  801. assert c4.contains(2 + I) == False
  802. assert c4.contains(-2 + I) == False
  803. assert c4.contains(-2 - I) == True
  804. assert c4.contains(2 - I) == True
  805. assert c4.contains(-2) == False
  806. assert c4.contains(2) == True
  807. assert c4.contains(x) == Contains(x, c4, evaluate=False)
  808. assert c4.contains(3/(1 + r**2)) == Contains(
  809. 3/(1 + r**2), c4, evaluate=False) # is in fact True
  810. raises(ValueError, lambda: ComplexRegion(r1*theta1, polar=2))
  811. def test_symbolic_Range():
  812. n = Symbol('n')
  813. raises(ValueError, lambda: Range(n)[0])
  814. raises(IndexError, lambda: Range(n, n)[0])
  815. raises(ValueError, lambda: Range(n, n+1)[0])
  816. raises(ValueError, lambda: Range(n).size)
  817. n = Symbol('n', integer=True)
  818. raises(ValueError, lambda: Range(n)[0])
  819. raises(IndexError, lambda: Range(n, n)[0])
  820. assert Range(n, n+1)[0] == n
  821. raises(ValueError, lambda: Range(n).size)
  822. assert Range(n, n+1).size == 1
  823. n = Symbol('n', integer=True, nonnegative=True)
  824. raises(ValueError, lambda: Range(n)[0])
  825. raises(IndexError, lambda: Range(n, n)[0])
  826. assert Range(n+1)[0] == 0
  827. assert Range(n, n+1)[0] == n
  828. assert Range(n).size == n
  829. assert Range(n+1).size == n+1
  830. assert Range(n, n+1).size == 1
  831. n = Symbol('n', integer=True, positive=True)
  832. assert Range(n)[0] == 0
  833. assert Range(n, n+1)[0] == n
  834. assert Range(n).size == n
  835. assert Range(n, n+1).size == 1
  836. m = Symbol('m', integer=True, positive=True)
  837. assert Range(n, n+m)[0] == n
  838. assert Range(n, n+m).size == m
  839. assert Range(n, n+1).size == 1
  840. assert Range(n, n+m, 2).size == floor(m/2)
  841. m = Symbol('m', integer=True, positive=True, even=True)
  842. assert Range(n, n+m, 2).size == m/2
  843. def test_issue_18400():
  844. n = Symbol('n', integer=True)
  845. raises(ValueError, lambda: imageset(lambda x: x*2, Range(n)))
  846. n = Symbol('n', integer=True, positive=True)
  847. # No exception
  848. assert imageset(lambda x: x*2, Range(n)) == imageset(lambda x: x*2, Range(n))
  849. def test_ComplexRegion_intersect():
  850. # Polar form
  851. X_axis = ComplexRegion(Interval(0, oo)*FiniteSet(0, S.Pi), polar=True)
  852. unit_disk = ComplexRegion(Interval(0, 1)*Interval(0, 2*S.Pi), polar=True)
  853. upper_half_unit_disk = ComplexRegion(Interval(0, 1)*Interval(0, S.Pi), polar=True)
  854. upper_half_disk = ComplexRegion(Interval(0, oo)*Interval(0, S.Pi), polar=True)
  855. lower_half_disk = ComplexRegion(Interval(0, oo)*Interval(S.Pi, 2*S.Pi), polar=True)
  856. right_half_disk = ComplexRegion(Interval(0, oo)*Interval(-S.Pi/2, S.Pi/2), polar=True)
  857. first_quad_disk = ComplexRegion(Interval(0, oo)*Interval(0, S.Pi/2), polar=True)
  858. assert upper_half_disk.intersect(unit_disk) == upper_half_unit_disk
  859. assert right_half_disk.intersect(first_quad_disk) == first_quad_disk
  860. assert upper_half_disk.intersect(right_half_disk) == first_quad_disk
  861. assert upper_half_disk.intersect(lower_half_disk) == X_axis
  862. c1 = ComplexRegion(Interval(0, 4)*Interval(0, 2*S.Pi), polar=True)
  863. assert c1.intersect(Interval(1, 5)) == Interval(1, 4)
  864. assert c1.intersect(Interval(4, 9)) == FiniteSet(4)
  865. assert c1.intersect(Interval(5, 12)) is S.EmptySet
  866. # Rectangular form
  867. X_axis = ComplexRegion(Interval(-oo, oo)*FiniteSet(0))
  868. unit_square = ComplexRegion(Interval(-1, 1)*Interval(-1, 1))
  869. upper_half_unit_square = ComplexRegion(Interval(-1, 1)*Interval(0, 1))
  870. upper_half_plane = ComplexRegion(Interval(-oo, oo)*Interval(0, oo))
  871. lower_half_plane = ComplexRegion(Interval(-oo, oo)*Interval(-oo, 0))
  872. right_half_plane = ComplexRegion(Interval(0, oo)*Interval(-oo, oo))
  873. first_quad_plane = ComplexRegion(Interval(0, oo)*Interval(0, oo))
  874. assert upper_half_plane.intersect(unit_square) == upper_half_unit_square
  875. assert right_half_plane.intersect(first_quad_plane) == first_quad_plane
  876. assert upper_half_plane.intersect(right_half_plane) == first_quad_plane
  877. assert upper_half_plane.intersect(lower_half_plane) == X_axis
  878. c1 = ComplexRegion(Interval(-5, 5)*Interval(-10, 10))
  879. assert c1.intersect(Interval(2, 7)) == Interval(2, 5)
  880. assert c1.intersect(Interval(5, 7)) == FiniteSet(5)
  881. assert c1.intersect(Interval(6, 9)) is S.EmptySet
  882. # unevaluated object
  883. C1 = ComplexRegion(Interval(0, 1)*Interval(0, 2*S.Pi), polar=True)
  884. C2 = ComplexRegion(Interval(-1, 1)*Interval(-1, 1))
  885. assert C1.intersect(C2) == Intersection(C1, C2, evaluate=False)
  886. def test_ComplexRegion_union():
  887. # Polar form
  888. c1 = ComplexRegion(Interval(0, 1)*Interval(0, 2*S.Pi), polar=True)
  889. c2 = ComplexRegion(Interval(0, 1)*Interval(0, S.Pi), polar=True)
  890. c3 = ComplexRegion(Interval(0, oo)*Interval(0, S.Pi), polar=True)
  891. c4 = ComplexRegion(Interval(0, oo)*Interval(S.Pi, 2*S.Pi), polar=True)
  892. p1 = Union(Interval(0, 1)*Interval(0, 2*S.Pi), Interval(0, 1)*Interval(0, S.Pi))
  893. p2 = Union(Interval(0, oo)*Interval(0, S.Pi), Interval(0, oo)*Interval(S.Pi, 2*S.Pi))
  894. assert c1.union(c2) == ComplexRegion(p1, polar=True)
  895. assert c3.union(c4) == ComplexRegion(p2, polar=True)
  896. # Rectangular form
  897. c5 = ComplexRegion(Interval(2, 5)*Interval(6, 9))
  898. c6 = ComplexRegion(Interval(4, 6)*Interval(10, 12))
  899. c7 = ComplexRegion(Interval(0, 10)*Interval(-10, 0))
  900. c8 = ComplexRegion(Interval(12, 16)*Interval(14, 20))
  901. p3 = Union(Interval(2, 5)*Interval(6, 9), Interval(4, 6)*Interval(10, 12))
  902. p4 = Union(Interval(0, 10)*Interval(-10, 0), Interval(12, 16)*Interval(14, 20))
  903. assert c5.union(c6) == ComplexRegion(p3)
  904. assert c7.union(c8) == ComplexRegion(p4)
  905. assert c1.union(Interval(2, 4)) == Union(c1, Interval(2, 4), evaluate=False)
  906. assert c5.union(Interval(2, 4)) == Union(c5, ComplexRegion.from_real(Interval(2, 4)))
  907. def test_ComplexRegion_from_real():
  908. c1 = ComplexRegion(Interval(0, 1) * Interval(0, 2 * S.Pi), polar=True)
  909. raises(ValueError, lambda: c1.from_real(c1))
  910. assert c1.from_real(Interval(-1, 1)) == ComplexRegion(Interval(-1, 1) * FiniteSet(0), False)
  911. def test_ComplexRegion_measure():
  912. a, b = Interval(2, 5), Interval(4, 8)
  913. theta1, theta2 = Interval(0, 2*S.Pi), Interval(0, S.Pi)
  914. c1 = ComplexRegion(a*b)
  915. c2 = ComplexRegion(Union(a*theta1, b*theta2), polar=True)
  916. assert c1.measure == 12
  917. assert c2.measure == 9*pi
  918. def test_normalize_theta_set():
  919. # Interval
  920. assert normalize_theta_set(Interval(pi, 2*pi)) == \
  921. Union(FiniteSet(0), Interval.Ropen(pi, 2*pi))
  922. assert normalize_theta_set(Interval(pi*Rational(9, 2), 5*pi)) == Interval(pi/2, pi)
  923. assert normalize_theta_set(Interval(pi*Rational(-3, 2), pi/2)) == Interval.Ropen(0, 2*pi)
  924. assert normalize_theta_set(Interval.open(pi*Rational(-3, 2), pi/2)) == \
  925. Union(Interval.Ropen(0, pi/2), Interval.open(pi/2, 2*pi))
  926. assert normalize_theta_set(Interval.open(pi*Rational(-7, 2), pi*Rational(-3, 2))) == \
  927. Union(Interval.Ropen(0, pi/2), Interval.open(pi/2, 2*pi))
  928. assert normalize_theta_set(Interval(-pi/2, pi/2)) == \
  929. Union(Interval(0, pi/2), Interval.Ropen(pi*Rational(3, 2), 2*pi))
  930. assert normalize_theta_set(Interval.open(-pi/2, pi/2)) == \
  931. Union(Interval.Ropen(0, pi/2), Interval.open(pi*Rational(3, 2), 2*pi))
  932. assert normalize_theta_set(Interval(-4*pi, 3*pi)) == Interval.Ropen(0, 2*pi)
  933. assert normalize_theta_set(Interval(pi*Rational(-3, 2), -pi/2)) == Interval(pi/2, pi*Rational(3, 2))
  934. assert normalize_theta_set(Interval.open(0, 2*pi)) == Interval.open(0, 2*pi)
  935. assert normalize_theta_set(Interval.Ropen(-pi/2, pi/2)) == \
  936. Union(Interval.Ropen(0, pi/2), Interval.Ropen(pi*Rational(3, 2), 2*pi))
  937. assert normalize_theta_set(Interval.Lopen(-pi/2, pi/2)) == \
  938. Union(Interval(0, pi/2), Interval.open(pi*Rational(3, 2), 2*pi))
  939. assert normalize_theta_set(Interval(-pi/2, pi/2)) == \
  940. Union(Interval(0, pi/2), Interval.Ropen(pi*Rational(3, 2), 2*pi))
  941. assert normalize_theta_set(Interval.open(4*pi, pi*Rational(9, 2))) == Interval.open(0, pi/2)
  942. assert normalize_theta_set(Interval.Lopen(4*pi, pi*Rational(9, 2))) == Interval.Lopen(0, pi/2)
  943. assert normalize_theta_set(Interval.Ropen(4*pi, pi*Rational(9, 2))) == Interval.Ropen(0, pi/2)
  944. assert normalize_theta_set(Interval.open(3*pi, 5*pi)) == \
  945. Union(Interval.Ropen(0, pi), Interval.open(pi, 2*pi))
  946. # FiniteSet
  947. assert normalize_theta_set(FiniteSet(0, pi, 3*pi)) == FiniteSet(0, pi)
  948. assert normalize_theta_set(FiniteSet(0, pi/2, pi, 2*pi)) == FiniteSet(0, pi/2, pi)
  949. assert normalize_theta_set(FiniteSet(0, -pi/2, -pi, -2*pi)) == FiniteSet(0, pi, pi*Rational(3, 2))
  950. assert normalize_theta_set(FiniteSet(pi*Rational(-3, 2), pi/2)) == \
  951. FiniteSet(pi/2)
  952. assert normalize_theta_set(FiniteSet(2*pi)) == FiniteSet(0)
  953. # Unions
  954. assert normalize_theta_set(Union(Interval(0, pi/3), Interval(pi/2, pi))) == \
  955. Union(Interval(0, pi/3), Interval(pi/2, pi))
  956. assert normalize_theta_set(Union(Interval(0, pi), Interval(2*pi, pi*Rational(7, 3)))) == \
  957. Interval(0, pi)
  958. # ValueError for non-real sets
  959. raises(ValueError, lambda: normalize_theta_set(S.Complexes))
  960. # NotImplementedError for subset of reals
  961. raises(NotImplementedError, lambda: normalize_theta_set(Interval(0, 1)))
  962. # NotImplementedError without pi as coefficient
  963. raises(NotImplementedError, lambda: normalize_theta_set(Interval(1, 2*pi)))
  964. raises(NotImplementedError, lambda: normalize_theta_set(Interval(2*pi, 10)))
  965. raises(NotImplementedError, lambda: normalize_theta_set(FiniteSet(0, 3, 3*pi)))
  966. def test_ComplexRegion_FiniteSet():
  967. x, y, z, a, b, c = symbols('x y z a b c')
  968. # Issue #9669
  969. assert ComplexRegion(FiniteSet(a, b, c)*FiniteSet(x, y, z)) == \
  970. FiniteSet(a + I*x, a + I*y, a + I*z, b + I*x, b + I*y,
  971. b + I*z, c + I*x, c + I*y, c + I*z)
  972. assert ComplexRegion(FiniteSet(2)*FiniteSet(3)) == FiniteSet(2 + 3*I)
  973. def test_union_RealSubSet():
  974. assert (S.Complexes).union(Interval(1, 2)) == S.Complexes
  975. assert (S.Complexes).union(S.Integers) == S.Complexes
  976. def test_SetKind_fancySet():
  977. G = lambda *args: ImageSet(Lambda(x, x ** 2), *args)
  978. assert G(Interval(1, 4)).kind is SetKind(NumberKind)
  979. assert G(FiniteSet(1, 4)).kind is SetKind(NumberKind)
  980. assert S.Rationals.kind is SetKind(NumberKind)
  981. assert S.Naturals.kind is SetKind(NumberKind)
  982. assert S.Integers.kind is SetKind(NumberKind)
  983. assert Range(3).kind is SetKind(NumberKind)
  984. a = Interval(2, 3)
  985. b = Interval(4, 6)
  986. c1 = ComplexRegion(a*b)
  987. assert c1.kind is SetKind(TupleKind(NumberKind, NumberKind))
  988. def test_issue_9980():
  989. c1 = ComplexRegion(Interval(1, 2)*Interval(2, 3))
  990. c2 = ComplexRegion(Interval(1, 5)*Interval(1, 3))
  991. R = Union(c1, c2)
  992. assert simplify(R) == ComplexRegion(Union(Interval(1, 2)*Interval(2, 3), \
  993. Interval(1, 5)*Interval(1, 3)), False)
  994. assert c1.func(*c1.args) == c1
  995. assert R.func(*R.args) == R
  996. def test_issue_11732():
  997. interval12 = Interval(1, 2)
  998. finiteset1234 = FiniteSet(1, 2, 3, 4)
  999. pointComplex = Tuple(1, 5)
  1000. assert (interval12 in S.Naturals) == False
  1001. assert (interval12 in S.Naturals0) == False
  1002. assert (interval12 in S.Integers) == False
  1003. assert (interval12 in S.Complexes) == False
  1004. assert (finiteset1234 in S.Naturals) == False
  1005. assert (finiteset1234 in S.Naturals0) == False
  1006. assert (finiteset1234 in S.Integers) == False
  1007. assert (finiteset1234 in S.Complexes) == False
  1008. assert (pointComplex in S.Naturals) == False
  1009. assert (pointComplex in S.Naturals0) == False
  1010. assert (pointComplex in S.Integers) == False
  1011. assert (pointComplex in S.Complexes) == True
  1012. def test_issue_11730():
  1013. unit = Interval(0, 1)
  1014. square = ComplexRegion(unit ** 2)
  1015. assert Union(S.Complexes, FiniteSet(oo)) != S.Complexes
  1016. assert Union(S.Complexes, FiniteSet(eye(4))) != S.Complexes
  1017. assert Union(unit, square) == square
  1018. assert Intersection(S.Reals, square) == unit
  1019. def test_issue_11938():
  1020. unit = Interval(0, 1)
  1021. ival = Interval(1, 2)
  1022. cr1 = ComplexRegion(ival * unit)
  1023. assert Intersection(cr1, S.Reals) == ival
  1024. assert Intersection(cr1, unit) == FiniteSet(1)
  1025. arg1 = Interval(0, S.Pi)
  1026. arg2 = FiniteSet(S.Pi)
  1027. arg3 = Interval(S.Pi / 4, 3 * S.Pi / 4)
  1028. cp1 = ComplexRegion(unit * arg1, polar=True)
  1029. cp2 = ComplexRegion(unit * arg2, polar=True)
  1030. cp3 = ComplexRegion(unit * arg3, polar=True)
  1031. assert Intersection(cp1, S.Reals) == Interval(-1, 1)
  1032. assert Intersection(cp2, S.Reals) == Interval(-1, 0)
  1033. assert Intersection(cp3, S.Reals) == FiniteSet(0)
  1034. def test_issue_11914():
  1035. a, b = Interval(0, 1), Interval(0, pi)
  1036. c, d = Interval(2, 3), Interval(pi, 3 * pi / 2)
  1037. cp1 = ComplexRegion(a * b, polar=True)
  1038. cp2 = ComplexRegion(c * d, polar=True)
  1039. assert -3 in cp1.union(cp2)
  1040. assert -3 in cp2.union(cp1)
  1041. assert -5 not in cp1.union(cp2)
  1042. def test_issue_9543():
  1043. assert ImageSet(Lambda(x, x**2), S.Naturals).is_subset(S.Reals)
  1044. def test_issue_16871():
  1045. assert ImageSet(Lambda(x, x), FiniteSet(1)) == {1}
  1046. assert ImageSet(Lambda(x, x - 3), S.Integers
  1047. ).intersection(S.Integers) is S.Integers
  1048. @XFAIL
  1049. def test_issue_16871b():
  1050. assert ImageSet(Lambda(x, x - 3), S.Integers).is_subset(S.Integers)
  1051. def test_issue_18050():
  1052. assert imageset(Lambda(x, I*x + 1), S.Integers
  1053. ) == ImageSet(Lambda(x, I*x + 1), S.Integers)
  1054. assert imageset(Lambda(x, 3*I*x + 4 + 8*I), S.Integers
  1055. ) == ImageSet(Lambda(x, 3*I*x + 4 + 2*I), S.Integers)
  1056. # no 'Mod' for next 2 tests:
  1057. assert imageset(Lambda(x, 2*x + 3*I), S.Integers
  1058. ) == ImageSet(Lambda(x, 2*x + 3*I), S.Integers)
  1059. r = Symbol('r', positive=True)
  1060. assert imageset(Lambda(x, r*x + 10), S.Integers
  1061. ) == ImageSet(Lambda(x, r*x + 10), S.Integers)
  1062. # reduce real part:
  1063. assert imageset(Lambda(x, 3*x + 8 + 5*I), S.Integers
  1064. ) == ImageSet(Lambda(x, 3*x + 2 + 5*I), S.Integers)
  1065. def test_Rationals():
  1066. assert S.Integers.is_subset(S.Rationals)
  1067. assert S.Naturals.is_subset(S.Rationals)
  1068. assert S.Naturals0.is_subset(S.Rationals)
  1069. assert S.Rationals.is_subset(S.Reals)
  1070. assert S.Rationals.inf is -oo
  1071. assert S.Rationals.sup is oo
  1072. it = iter(S.Rationals)
  1073. assert [next(it) for i in range(12)] == [
  1074. 0, 1, -1, S.Half, 2, Rational(-1, 2), -2,
  1075. Rational(1, 3), 3, Rational(-1, 3), -3, Rational(2, 3)]
  1076. assert Basic() not in S.Rationals
  1077. assert S.Half in S.Rationals
  1078. assert S.Rationals.contains(0.5) == Contains(
  1079. 0.5, S.Rationals, evaluate=False)
  1080. assert 2 in S.Rationals
  1081. r = symbols('r', rational=True)
  1082. assert r in S.Rationals
  1083. raises(TypeError, lambda: x in S.Rationals)
  1084. # issue #18134:
  1085. assert S.Rationals.boundary == S.Reals
  1086. assert S.Rationals.closure == S.Reals
  1087. assert S.Rationals.is_open == False
  1088. assert S.Rationals.is_closed == False
  1089. def test_NZQRC_unions():
  1090. # check that all trivial number set unions are simplified:
  1091. nbrsets = (S.Naturals, S.Naturals0, S.Integers, S.Rationals,
  1092. S.Reals, S.Complexes)
  1093. unions = (Union(a, b) for a in nbrsets for b in nbrsets)
  1094. assert all(u.is_Union is False for u in unions)
  1095. def test_imageset_intersection():
  1096. n = Dummy()
  1097. s = ImageSet(Lambda(n, -I*(I*(2*pi*n - pi/4) +
  1098. log(Abs(sqrt(-I))))), S.Integers)
  1099. assert s.intersect(S.Reals) == ImageSet(
  1100. Lambda(n, 2*pi*n + pi*Rational(7, 4)), S.Integers)
  1101. def test_issue_17858():
  1102. assert 1 in Range(-oo, oo)
  1103. assert 0 in Range(oo, -oo, -1)
  1104. assert oo not in Range(-oo, oo)
  1105. assert -oo not in Range(-oo, oo)
  1106. def test_issue_17859():
  1107. r = Range(-oo,oo)
  1108. raises(ValueError,lambda: r[::2])
  1109. raises(ValueError, lambda: r[::-2])
  1110. r = Range(oo,-oo,-1)
  1111. raises(ValueError,lambda: r[::2])
  1112. raises(ValueError, lambda: r[::-2])