test_fancysets.py 50 KB

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