m2m模型翻译
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1195 lines
41 KiB

6 months ago
  1. """Tests for classes defining properties of ground domains, e.g. ZZ, QQ, ZZ[x] ... """
  2. from sympy.core.numbers import (E, Float, I, Integer, Rational, oo, pi)
  3. from sympy.core.singleton import S
  4. from sympy.functions.elementary.exponential import exp
  5. from sympy.functions.elementary.miscellaneous import sqrt
  6. from sympy.functions.elementary.trigonometric import sin
  7. from sympy.polys.polytools import Poly
  8. from sympy.abc import x, y, z
  9. from sympy.external.gmpy import HAS_GMPY
  10. from sympy.polys.domains import (ZZ, QQ, RR, CC, FF, GF, EX, EXRAW, ZZ_gmpy,
  11. ZZ_python, QQ_gmpy, QQ_python)
  12. from sympy.polys.domains.algebraicfield import AlgebraicField
  13. from sympy.polys.domains.gaussiandomains import ZZ_I, QQ_I
  14. from sympy.polys.domains.polynomialring import PolynomialRing
  15. from sympy.polys.domains.realfield import RealField
  16. from sympy.polys.rings import ring
  17. from sympy.polys.fields import field
  18. from sympy.polys.agca.extensions import FiniteExtension
  19. from sympy.polys.polyerrors import (
  20. UnificationFailed,
  21. GeneratorsError,
  22. CoercionFailed,
  23. NotInvertible,
  24. DomainError)
  25. from sympy.polys.polyutils import illegal
  26. from sympy.testing.pytest import raises
  27. from itertools import product
  28. ALG = QQ.algebraic_field(sqrt(2), sqrt(3))
  29. def unify(K0, K1):
  30. return K0.unify(K1)
  31. def test_Domain_unify():
  32. F3 = GF(3)
  33. assert unify(F3, F3) == F3
  34. assert unify(F3, ZZ) == ZZ
  35. assert unify(F3, QQ) == QQ
  36. assert unify(F3, ALG) == ALG
  37. assert unify(F3, RR) == RR
  38. assert unify(F3, CC) == CC
  39. assert unify(F3, ZZ[x]) == ZZ[x]
  40. assert unify(F3, ZZ.frac_field(x)) == ZZ.frac_field(x)
  41. assert unify(F3, EX) == EX
  42. assert unify(ZZ, F3) == ZZ
  43. assert unify(ZZ, ZZ) == ZZ
  44. assert unify(ZZ, QQ) == QQ
  45. assert unify(ZZ, ALG) == ALG
  46. assert unify(ZZ, RR) == RR
  47. assert unify(ZZ, CC) == CC
  48. assert unify(ZZ, ZZ[x]) == ZZ[x]
  49. assert unify(ZZ, ZZ.frac_field(x)) == ZZ.frac_field(x)
  50. assert unify(ZZ, EX) == EX
  51. assert unify(QQ, F3) == QQ
  52. assert unify(QQ, ZZ) == QQ
  53. assert unify(QQ, QQ) == QQ
  54. assert unify(QQ, ALG) == ALG
  55. assert unify(QQ, RR) == RR
  56. assert unify(QQ, CC) == CC
  57. assert unify(QQ, ZZ[x]) == QQ[x]
  58. assert unify(QQ, ZZ.frac_field(x)) == QQ.frac_field(x)
  59. assert unify(QQ, EX) == EX
  60. assert unify(ZZ_I, F3) == ZZ_I
  61. assert unify(ZZ_I, ZZ) == ZZ_I
  62. assert unify(ZZ_I, ZZ_I) == ZZ_I
  63. assert unify(ZZ_I, QQ) == QQ_I
  64. assert unify(ZZ_I, ALG) == QQ.algebraic_field(I, sqrt(2), sqrt(3))
  65. assert unify(ZZ_I, RR) == CC
  66. assert unify(ZZ_I, CC) == CC
  67. assert unify(ZZ_I, ZZ[x]) == ZZ_I[x]
  68. assert unify(ZZ_I, ZZ_I[x]) == ZZ_I[x]
  69. assert unify(ZZ_I, ZZ.frac_field(x)) == ZZ_I.frac_field(x)
  70. assert unify(ZZ_I, ZZ_I.frac_field(x)) == ZZ_I.frac_field(x)
  71. assert unify(ZZ_I, EX) == EX
  72. assert unify(QQ_I, F3) == QQ_I
  73. assert unify(QQ_I, ZZ) == QQ_I
  74. assert unify(QQ_I, ZZ_I) == QQ_I
  75. assert unify(QQ_I, QQ) == QQ_I
  76. assert unify(QQ_I, ALG) == QQ.algebraic_field(I, sqrt(2), sqrt(3))
  77. assert unify(QQ_I, RR) == CC
  78. assert unify(QQ_I, CC) == CC
  79. assert unify(QQ_I, ZZ[x]) == QQ_I[x]
  80. assert unify(QQ_I, ZZ_I[x]) == QQ_I[x]
  81. assert unify(QQ_I, QQ[x]) == QQ_I[x]
  82. assert unify(QQ_I, QQ_I[x]) == QQ_I[x]
  83. assert unify(QQ_I, ZZ.frac_field(x)) == QQ_I.frac_field(x)
  84. assert unify(QQ_I, ZZ_I.frac_field(x)) == QQ_I.frac_field(x)
  85. assert unify(QQ_I, QQ.frac_field(x)) == QQ_I.frac_field(x)
  86. assert unify(QQ_I, QQ_I.frac_field(x)) == QQ_I.frac_field(x)
  87. assert unify(QQ_I, EX) == EX
  88. assert unify(RR, F3) == RR
  89. assert unify(RR, ZZ) == RR
  90. assert unify(RR, QQ) == RR
  91. assert unify(RR, ALG) == RR
  92. assert unify(RR, RR) == RR
  93. assert unify(RR, CC) == CC
  94. assert unify(RR, ZZ[x]) == RR[x]
  95. assert unify(RR, ZZ.frac_field(x)) == RR.frac_field(x)
  96. assert unify(RR, EX) == EX
  97. assert RR[x].unify(ZZ.frac_field(y)) == RR.frac_field(x, y)
  98. assert unify(CC, F3) == CC
  99. assert unify(CC, ZZ) == CC
  100. assert unify(CC, QQ) == CC
  101. assert unify(CC, ALG) == CC
  102. assert unify(CC, RR) == CC
  103. assert unify(CC, CC) == CC
  104. assert unify(CC, ZZ[x]) == CC[x]
  105. assert unify(CC, ZZ.frac_field(x)) == CC.frac_field(x)
  106. assert unify(CC, EX) == EX
  107. assert unify(ZZ[x], F3) == ZZ[x]
  108. assert unify(ZZ[x], ZZ) == ZZ[x]
  109. assert unify(ZZ[x], QQ) == QQ[x]
  110. assert unify(ZZ[x], ALG) == ALG[x]
  111. assert unify(ZZ[x], RR) == RR[x]
  112. assert unify(ZZ[x], CC) == CC[x]
  113. assert unify(ZZ[x], ZZ[x]) == ZZ[x]
  114. assert unify(ZZ[x], ZZ.frac_field(x)) == ZZ.frac_field(x)
  115. assert unify(ZZ[x], EX) == EX
  116. assert unify(ZZ.frac_field(x), F3) == ZZ.frac_field(x)
  117. assert unify(ZZ.frac_field(x), ZZ) == ZZ.frac_field(x)
  118. assert unify(ZZ.frac_field(x), QQ) == QQ.frac_field(x)
  119. assert unify(ZZ.frac_field(x), ALG) == ALG.frac_field(x)
  120. assert unify(ZZ.frac_field(x), RR) == RR.frac_field(x)
  121. assert unify(ZZ.frac_field(x), CC) == CC.frac_field(x)
  122. assert unify(ZZ.frac_field(x), ZZ[x]) == ZZ.frac_field(x)
  123. assert unify(ZZ.frac_field(x), ZZ.frac_field(x)) == ZZ.frac_field(x)
  124. assert unify(ZZ.frac_field(x), EX) == EX
  125. assert unify(EX, F3) == EX
  126. assert unify(EX, ZZ) == EX
  127. assert unify(EX, QQ) == EX
  128. assert unify(EX, ALG) == EX
  129. assert unify(EX, RR) == EX
  130. assert unify(EX, CC) == EX
  131. assert unify(EX, ZZ[x]) == EX
  132. assert unify(EX, ZZ.frac_field(x)) == EX
  133. assert unify(EX, EX) == EX
  134. def test_Domain_unify_composite():
  135. assert unify(ZZ.poly_ring(x), ZZ) == ZZ.poly_ring(x)
  136. assert unify(ZZ.poly_ring(x), QQ) == QQ.poly_ring(x)
  137. assert unify(QQ.poly_ring(x), ZZ) == QQ.poly_ring(x)
  138. assert unify(QQ.poly_ring(x), QQ) == QQ.poly_ring(x)
  139. assert unify(ZZ, ZZ.poly_ring(x)) == ZZ.poly_ring(x)
  140. assert unify(QQ, ZZ.poly_ring(x)) == QQ.poly_ring(x)
  141. assert unify(ZZ, QQ.poly_ring(x)) == QQ.poly_ring(x)
  142. assert unify(QQ, QQ.poly_ring(x)) == QQ.poly_ring(x)
  143. assert unify(ZZ.poly_ring(x, y), ZZ) == ZZ.poly_ring(x, y)
  144. assert unify(ZZ.poly_ring(x, y), QQ) == QQ.poly_ring(x, y)
  145. assert unify(QQ.poly_ring(x, y), ZZ) == QQ.poly_ring(x, y)
  146. assert unify(QQ.poly_ring(x, y), QQ) == QQ.poly_ring(x, y)
  147. assert unify(ZZ, ZZ.poly_ring(x, y)) == ZZ.poly_ring(x, y)
  148. assert unify(QQ, ZZ.poly_ring(x, y)) == QQ.poly_ring(x, y)
  149. assert unify(ZZ, QQ.poly_ring(x, y)) == QQ.poly_ring(x, y)
  150. assert unify(QQ, QQ.poly_ring(x, y)) == QQ.poly_ring(x, y)
  151. assert unify(ZZ.frac_field(x), ZZ) == ZZ.frac_field(x)
  152. assert unify(ZZ.frac_field(x), QQ) == QQ.frac_field(x)
  153. assert unify(QQ.frac_field(x), ZZ) == QQ.frac_field(x)
  154. assert unify(QQ.frac_field(x), QQ) == QQ.frac_field(x)
  155. assert unify(ZZ, ZZ.frac_field(x)) == ZZ.frac_field(x)
  156. assert unify(QQ, ZZ.frac_field(x)) == QQ.frac_field(x)
  157. assert unify(ZZ, QQ.frac_field(x)) == QQ.frac_field(x)
  158. assert unify(QQ, QQ.frac_field(x)) == QQ.frac_field(x)
  159. assert unify(ZZ.frac_field(x, y), ZZ) == ZZ.frac_field(x, y)
  160. assert unify(ZZ.frac_field(x, y), QQ) == QQ.frac_field(x, y)
  161. assert unify(QQ.frac_field(x, y), ZZ) == QQ.frac_field(x, y)
  162. assert unify(QQ.frac_field(x, y), QQ) == QQ.frac_field(x, y)
  163. assert unify(ZZ, ZZ.frac_field(x, y)) == ZZ.frac_field(x, y)
  164. assert unify(QQ, ZZ.frac_field(x, y)) == QQ.frac_field(x, y)
  165. assert unify(ZZ, QQ.frac_field(x, y)) == QQ.frac_field(x, y)
  166. assert unify(QQ, QQ.frac_field(x, y)) == QQ.frac_field(x, y)
  167. assert unify(ZZ.poly_ring(x), ZZ.poly_ring(x)) == ZZ.poly_ring(x)
  168. assert unify(ZZ.poly_ring(x), QQ.poly_ring(x)) == QQ.poly_ring(x)
  169. assert unify(QQ.poly_ring(x), ZZ.poly_ring(x)) == QQ.poly_ring(x)
  170. assert unify(QQ.poly_ring(x), QQ.poly_ring(x)) == QQ.poly_ring(x)
  171. assert unify(ZZ.poly_ring(x, y), ZZ.poly_ring(x)) == ZZ.poly_ring(x, y)
  172. assert unify(ZZ.poly_ring(x, y), QQ.poly_ring(x)) == QQ.poly_ring(x, y)
  173. assert unify(QQ.poly_ring(x, y), ZZ.poly_ring(x)) == QQ.poly_ring(x, y)
  174. assert unify(QQ.poly_ring(x, y), QQ.poly_ring(x)) == QQ.poly_ring(x, y)
  175. assert unify(ZZ.poly_ring(x), ZZ.poly_ring(x, y)) == ZZ.poly_ring(x, y)
  176. assert unify(ZZ.poly_ring(x), QQ.poly_ring(x, y)) == QQ.poly_ring(x, y)
  177. assert unify(QQ.poly_ring(x), ZZ.poly_ring(x, y)) == QQ.poly_ring(x, y)
  178. assert unify(QQ.poly_ring(x), QQ.poly_ring(x, y)) == QQ.poly_ring(x, y)
  179. assert unify(ZZ.poly_ring(x, y), ZZ.poly_ring(x, z)) == ZZ.poly_ring(x, y, z)
  180. assert unify(ZZ.poly_ring(x, y), QQ.poly_ring(x, z)) == QQ.poly_ring(x, y, z)
  181. assert unify(QQ.poly_ring(x, y), ZZ.poly_ring(x, z)) == QQ.poly_ring(x, y, z)
  182. assert unify(QQ.poly_ring(x, y), QQ.poly_ring(x, z)) == QQ.poly_ring(x, y, z)
  183. assert unify(ZZ.frac_field(x), ZZ.frac_field(x)) == ZZ.frac_field(x)
  184. assert unify(ZZ.frac_field(x), QQ.frac_field(x)) == QQ.frac_field(x)
  185. assert unify(QQ.frac_field(x), ZZ.frac_field(x)) == QQ.frac_field(x)
  186. assert unify(QQ.frac_field(x), QQ.frac_field(x)) == QQ.frac_field(x)
  187. assert unify(ZZ.frac_field(x, y), ZZ.frac_field(x)) == ZZ.frac_field(x, y)
  188. assert unify(ZZ.frac_field(x, y), QQ.frac_field(x)) == QQ.frac_field(x, y)
  189. assert unify(QQ.frac_field(x, y), ZZ.frac_field(x)) == QQ.frac_field(x, y)
  190. assert unify(QQ.frac_field(x, y), QQ.frac_field(x)) == QQ.frac_field(x, y)
  191. assert unify(ZZ.frac_field(x), ZZ.frac_field(x, y)) == ZZ.frac_field(x, y)
  192. assert unify(ZZ.frac_field(x), QQ.frac_field(x, y)) == QQ.frac_field(x, y)
  193. assert unify(QQ.frac_field(x), ZZ.frac_field(x, y)) == QQ.frac_field(x, y)
  194. assert unify(QQ.frac_field(x), QQ.frac_field(x, y)) == QQ.frac_field(x, y)
  195. assert unify(ZZ.frac_field(x, y), ZZ.frac_field(x, z)) == ZZ.frac_field(x, y, z)
  196. assert unify(ZZ.frac_field(x, y), QQ.frac_field(x, z)) == QQ.frac_field(x, y, z)
  197. assert unify(QQ.frac_field(x, y), ZZ.frac_field(x, z)) == QQ.frac_field(x, y, z)
  198. assert unify(QQ.frac_field(x, y), QQ.frac_field(x, z)) == QQ.frac_field(x, y, z)
  199. assert unify(ZZ.poly_ring(x), ZZ.frac_field(x)) == ZZ.frac_field(x)
  200. assert unify(ZZ.poly_ring(x), QQ.frac_field(x)) == ZZ.frac_field(x)
  201. assert unify(QQ.poly_ring(x), ZZ.frac_field(x)) == ZZ.frac_field(x)
  202. assert unify(QQ.poly_ring(x), QQ.frac_field(x)) == QQ.frac_field(x)
  203. assert unify(ZZ.poly_ring(x, y), ZZ.frac_field(x)) == ZZ.frac_field(x, y)
  204. assert unify(ZZ.poly_ring(x, y), QQ.frac_field(x)) == ZZ.frac_field(x, y)
  205. assert unify(QQ.poly_ring(x, y), ZZ.frac_field(x)) == ZZ.frac_field(x, y)
  206. assert unify(QQ.poly_ring(x, y), QQ.frac_field(x)) == QQ.frac_field(x, y)
  207. assert unify(ZZ.poly_ring(x), ZZ.frac_field(x, y)) == ZZ.frac_field(x, y)
  208. assert unify(ZZ.poly_ring(x), QQ.frac_field(x, y)) == ZZ.frac_field(x, y)
  209. assert unify(QQ.poly_ring(x), ZZ.frac_field(x, y)) == ZZ.frac_field(x, y)
  210. assert unify(QQ.poly_ring(x), QQ.frac_field(x, y)) == QQ.frac_field(x, y)
  211. assert unify(ZZ.poly_ring(x, y), ZZ.frac_field(x, z)) == ZZ.frac_field(x, y, z)
  212. assert unify(ZZ.poly_ring(x, y), QQ.frac_field(x, z)) == ZZ.frac_field(x, y, z)
  213. assert unify(QQ.poly_ring(x, y), ZZ.frac_field(x, z)) == ZZ.frac_field(x, y, z)
  214. assert unify(QQ.poly_ring(x, y), QQ.frac_field(x, z)) == QQ.frac_field(x, y, z)
  215. assert unify(ZZ.frac_field(x), ZZ.poly_ring(x)) == ZZ.frac_field(x)
  216. assert unify(ZZ.frac_field(x), QQ.poly_ring(x)) == ZZ.frac_field(x)
  217. assert unify(QQ.frac_field(x), ZZ.poly_ring(x)) == ZZ.frac_field(x)
  218. assert unify(QQ.frac_field(x), QQ.poly_ring(x)) == QQ.frac_field(x)
  219. assert unify(ZZ.frac_field(x, y), ZZ.poly_ring(x)) == ZZ.frac_field(x, y)
  220. assert unify(ZZ.frac_field(x, y), QQ.poly_ring(x)) == ZZ.frac_field(x, y)
  221. assert unify(QQ.frac_field(x, y), ZZ.poly_ring(x)) == ZZ.frac_field(x, y)
  222. assert unify(QQ.frac_field(x, y), QQ.poly_ring(x)) == QQ.frac_field(x, y)
  223. assert unify(ZZ.frac_field(x), ZZ.poly_ring(x, y)) == ZZ.frac_field(x, y)
  224. assert unify(ZZ.frac_field(x), QQ.poly_ring(x, y)) == ZZ.frac_field(x, y)
  225. assert unify(QQ.frac_field(x), ZZ.poly_ring(x, y)) == ZZ.frac_field(x, y)
  226. assert unify(QQ.frac_field(x), QQ.poly_ring(x, y)) == QQ.frac_field(x, y)
  227. assert unify(ZZ.frac_field(x, y), ZZ.poly_ring(x, z)) == ZZ.frac_field(x, y, z)
  228. assert unify(ZZ.frac_field(x, y), QQ.poly_ring(x, z)) == ZZ.frac_field(x, y, z)
  229. assert unify(QQ.frac_field(x, y), ZZ.poly_ring(x, z)) == ZZ.frac_field(x, y, z)
  230. assert unify(QQ.frac_field(x, y), QQ.poly_ring(x, z)) == QQ.frac_field(x, y, z)
  231. def test_Domain_unify_algebraic():
  232. sqrt5 = QQ.algebraic_field(sqrt(5))
  233. sqrt7 = QQ.algebraic_field(sqrt(7))
  234. sqrt57 = QQ.algebraic_field(sqrt(5), sqrt(7))
  235. assert sqrt5.unify(sqrt7) == sqrt57
  236. assert sqrt5.unify(sqrt5[x, y]) == sqrt5[x, y]
  237. assert sqrt5[x, y].unify(sqrt5) == sqrt5[x, y]
  238. assert sqrt5.unify(sqrt5.frac_field(x, y)) == sqrt5.frac_field(x, y)
  239. assert sqrt5.frac_field(x, y).unify(sqrt5) == sqrt5.frac_field(x, y)
  240. assert sqrt5.unify(sqrt7[x, y]) == sqrt57[x, y]
  241. assert sqrt5[x, y].unify(sqrt7) == sqrt57[x, y]
  242. assert sqrt5.unify(sqrt7.frac_field(x, y)) == sqrt57.frac_field(x, y)
  243. assert sqrt5.frac_field(x, y).unify(sqrt7) == sqrt57.frac_field(x, y)
  244. def test_Domain_unify_FiniteExtension():
  245. KxZZ = FiniteExtension(Poly(x**2 - 2, x, domain=ZZ))
  246. KxQQ = FiniteExtension(Poly(x**2 - 2, x, domain=QQ))
  247. KxZZy = FiniteExtension(Poly(x**2 - 2, x, domain=ZZ[y]))
  248. KxQQy = FiniteExtension(Poly(x**2 - 2, x, domain=QQ[y]))
  249. assert KxZZ.unify(KxZZ) == KxZZ
  250. assert KxQQ.unify(KxQQ) == KxQQ
  251. assert KxZZy.unify(KxZZy) == KxZZy
  252. assert KxQQy.unify(KxQQy) == KxQQy
  253. assert KxZZ.unify(ZZ) == KxZZ
  254. assert KxZZ.unify(QQ) == KxQQ
  255. assert KxQQ.unify(ZZ) == KxQQ
  256. assert KxQQ.unify(QQ) == KxQQ
  257. assert KxZZ.unify(ZZ[y]) == KxZZy
  258. assert KxZZ.unify(QQ[y]) == KxQQy
  259. assert KxQQ.unify(ZZ[y]) == KxQQy
  260. assert KxQQ.unify(QQ[y]) == KxQQy
  261. assert KxZZy.unify(ZZ) == KxZZy
  262. assert KxZZy.unify(QQ) == KxQQy
  263. assert KxQQy.unify(ZZ) == KxQQy
  264. assert KxQQy.unify(QQ) == KxQQy
  265. assert KxZZy.unify(ZZ[y]) == KxZZy
  266. assert KxZZy.unify(QQ[y]) == KxQQy
  267. assert KxQQy.unify(ZZ[y]) == KxQQy
  268. assert KxQQy.unify(QQ[y]) == KxQQy
  269. K = FiniteExtension(Poly(x**2 - 2, x, domain=ZZ[y]))
  270. assert K.unify(ZZ) == K
  271. assert K.unify(ZZ[x]) == K
  272. assert K.unify(ZZ[y]) == K
  273. assert K.unify(ZZ[x, y]) == K
  274. Kz = FiniteExtension(Poly(x**2 - 2, x, domain=ZZ[y, z]))
  275. assert K.unify(ZZ[z]) == Kz
  276. assert K.unify(ZZ[x, z]) == Kz
  277. assert K.unify(ZZ[y, z]) == Kz
  278. assert K.unify(ZZ[x, y, z]) == Kz
  279. Kx = FiniteExtension(Poly(x**2 - 2, x, domain=ZZ))
  280. Ky = FiniteExtension(Poly(y**2 - 2, y, domain=ZZ))
  281. Kxy = FiniteExtension(Poly(y**2 - 2, y, domain=Kx))
  282. assert Kx.unify(Kx) == Kx
  283. assert Ky.unify(Ky) == Ky
  284. assert Kx.unify(Ky) == Kxy
  285. assert Ky.unify(Kx) == Kxy
  286. def test_Domain_unify_with_symbols():
  287. raises(UnificationFailed, lambda: ZZ[x, y].unify_with_symbols(ZZ, (y, z)))
  288. raises(UnificationFailed, lambda: ZZ.unify_with_symbols(ZZ[x, y], (y, z)))
  289. def test_Domain__contains__():
  290. assert (0 in EX) is True
  291. assert (0 in ZZ) is True
  292. assert (0 in QQ) is True
  293. assert (0 in RR) is True
  294. assert (0 in CC) is True
  295. assert (0 in ALG) is True
  296. assert (0 in ZZ[x, y]) is True
  297. assert (0 in QQ[x, y]) is True
  298. assert (0 in RR[x, y]) is True
  299. assert (-7 in EX) is True
  300. assert (-7 in ZZ) is True
  301. assert (-7 in QQ) is True
  302. assert (-7 in RR) is True
  303. assert (-7 in CC) is True
  304. assert (-7 in ALG) is True
  305. assert (-7 in ZZ[x, y]) is True
  306. assert (-7 in QQ[x, y]) is True
  307. assert (-7 in RR[x, y]) is True
  308. assert (17 in EX) is True
  309. assert (17 in ZZ) is True
  310. assert (17 in QQ) is True
  311. assert (17 in RR) is True
  312. assert (17 in CC) is True
  313. assert (17 in ALG) is True
  314. assert (17 in ZZ[x, y]) is True
  315. assert (17 in QQ[x, y]) is True
  316. assert (17 in RR[x, y]) is True
  317. assert (Rational(-1, 7) in EX) is True
  318. assert (Rational(-1, 7) in ZZ) is False
  319. assert (Rational(-1, 7) in QQ) is True
  320. assert (Rational(-1, 7) in RR) is True
  321. assert (Rational(-1, 7) in CC) is True
  322. assert (Rational(-1, 7) in ALG) is True
  323. assert (Rational(-1, 7) in ZZ[x, y]) is False
  324. assert (Rational(-1, 7) in QQ[x, y]) is True
  325. assert (Rational(-1, 7) in RR[x, y]) is True
  326. assert (Rational(3, 5) in EX) is True
  327. assert (Rational(3, 5) in ZZ) is False
  328. assert (Rational(3, 5) in QQ) is True
  329. assert (Rational(3, 5) in RR) is True
  330. assert (Rational(3, 5) in CC) is True
  331. assert (Rational(3, 5) in ALG) is True
  332. assert (Rational(3, 5) in ZZ[x, y]) is False
  333. assert (Rational(3, 5) in QQ[x, y]) is True
  334. assert (Rational(3, 5) in RR[x, y]) is True
  335. assert (3.0 in EX) is True
  336. assert (3.0 in ZZ) is True
  337. assert (3.0 in QQ) is True
  338. assert (3.0 in RR) is True
  339. assert (3.0 in CC) is True
  340. assert (3.0 in ALG) is True
  341. assert (3.0 in ZZ[x, y]) is True
  342. assert (3.0 in QQ[x, y]) is True
  343. assert (3.0 in RR[x, y]) is True
  344. assert (3.14 in EX) is True
  345. assert (3.14 in ZZ) is False
  346. assert (3.14 in QQ) is True
  347. assert (3.14 in RR) is True
  348. assert (3.14 in CC) is True
  349. assert (3.14 in ALG) is True
  350. assert (3.14 in ZZ[x, y]) is False
  351. assert (3.14 in QQ[x, y]) is True
  352. assert (3.14 in RR[x, y]) is True
  353. assert (oo in ALG) is False
  354. assert (oo in ZZ[x, y]) is False
  355. assert (oo in QQ[x, y]) is False
  356. assert (-oo in ZZ) is False
  357. assert (-oo in QQ) is False
  358. assert (-oo in ALG) is False
  359. assert (-oo in ZZ[x, y]) is False
  360. assert (-oo in QQ[x, y]) is False
  361. assert (sqrt(7) in EX) is True
  362. assert (sqrt(7) in ZZ) is False
  363. assert (sqrt(7) in QQ) is False
  364. assert (sqrt(7) in RR) is True
  365. assert (sqrt(7) in CC) is True
  366. assert (sqrt(7) in ALG) is False
  367. assert (sqrt(7) in ZZ[x, y]) is False
  368. assert (sqrt(7) in QQ[x, y]) is False
  369. assert (sqrt(7) in RR[x, y]) is True
  370. assert (2*sqrt(3) + 1 in EX) is True
  371. assert (2*sqrt(3) + 1 in ZZ) is False
  372. assert (2*sqrt(3) + 1 in QQ) is False
  373. assert (2*sqrt(3) + 1 in RR) is True
  374. assert (2*sqrt(3) + 1 in CC) is True
  375. assert (2*sqrt(3) + 1 in ALG) is True
  376. assert (2*sqrt(3) + 1 in ZZ[x, y]) is False
  377. assert (2*sqrt(3) + 1 in QQ[x, y]) is False
  378. assert (2*sqrt(3) + 1 in RR[x, y]) is True
  379. assert (sin(1) in EX) is True
  380. assert (sin(1) in ZZ) is False
  381. assert (sin(1) in QQ) is False
  382. assert (sin(1) in RR) is True
  383. assert (sin(1) in CC) is True
  384. assert (sin(1) in ALG) is False
  385. assert (sin(1) in ZZ[x, y]) is False
  386. assert (sin(1) in QQ[x, y]) is False
  387. assert (sin(1) in RR[x, y]) is True
  388. assert (x**2 + 1 in EX) is True
  389. assert (x**2 + 1 in ZZ) is False
  390. assert (x**2 + 1 in QQ) is False
  391. assert (x**2 + 1 in RR) is False
  392. assert (x**2 + 1 in CC) is False
  393. assert (x**2 + 1 in ALG) is False
  394. assert (x**2 + 1 in ZZ[x]) is True
  395. assert (x**2 + 1 in QQ[x]) is True
  396. assert (x**2 + 1 in RR[x]) is True
  397. assert (x**2 + 1 in ZZ[x, y]) is True
  398. assert (x**2 + 1 in QQ[x, y]) is True
  399. assert (x**2 + 1 in RR[x, y]) is True
  400. assert (x**2 + y**2 in EX) is True
  401. assert (x**2 + y**2 in ZZ) is False
  402. assert (x**2 + y**2 in QQ) is False
  403. assert (x**2 + y**2 in RR) is False
  404. assert (x**2 + y**2 in CC) is False
  405. assert (x**2 + y**2 in ALG) is False
  406. assert (x**2 + y**2 in ZZ[x]) is False
  407. assert (x**2 + y**2 in QQ[x]) is False
  408. assert (x**2 + y**2 in RR[x]) is False
  409. assert (x**2 + y**2 in ZZ[x, y]) is True
  410. assert (x**2 + y**2 in QQ[x, y]) is True
  411. assert (x**2 + y**2 in RR[x, y]) is True
  412. assert (Rational(3, 2)*x/(y + 1) - z in QQ[x, y, z]) is False
  413. def test_Domain_get_ring():
  414. assert ZZ.has_assoc_Ring is True
  415. assert QQ.has_assoc_Ring is True
  416. assert ZZ[x].has_assoc_Ring is True
  417. assert QQ[x].has_assoc_Ring is True
  418. assert ZZ[x, y].has_assoc_Ring is True
  419. assert QQ[x, y].has_assoc_Ring is True
  420. assert ZZ.frac_field(x).has_assoc_Ring is True
  421. assert QQ.frac_field(x).has_assoc_Ring is True
  422. assert ZZ.frac_field(x, y).has_assoc_Ring is True
  423. assert QQ.frac_field(x, y).has_assoc_Ring is True
  424. assert EX.has_assoc_Ring is False
  425. assert RR.has_assoc_Ring is False
  426. assert ALG.has_assoc_Ring is False
  427. assert ZZ.get_ring() == ZZ
  428. assert QQ.get_ring() == ZZ
  429. assert ZZ[x].get_ring() == ZZ[x]
  430. assert QQ[x].get_ring() == QQ[x]
  431. assert ZZ[x, y].get_ring() == ZZ[x, y]
  432. assert QQ[x, y].get_ring() == QQ[x, y]
  433. assert ZZ.frac_field(x).get_ring() == ZZ[x]
  434. assert QQ.frac_field(x).get_ring() == QQ[x]
  435. assert ZZ.frac_field(x, y).get_ring() == ZZ[x, y]
  436. assert QQ.frac_field(x, y).get_ring() == QQ[x, y]
  437. assert EX.get_ring() == EX
  438. assert RR.get_ring() == RR
  439. # XXX: This should also be like RR
  440. raises(DomainError, lambda: ALG.get_ring())
  441. def test_Domain_get_field():
  442. assert EX.has_assoc_Field is True
  443. assert ZZ.has_assoc_Field is True
  444. assert QQ.has_assoc_Field is True
  445. assert RR.has_assoc_Field is True
  446. assert ALG.has_assoc_Field is True
  447. assert ZZ[x].has_assoc_Field is True
  448. assert QQ[x].has_assoc_Field is True
  449. assert ZZ[x, y].has_assoc_Field is True
  450. assert QQ[x, y].has_assoc_Field is True
  451. assert EX.get_field() == EX
  452. assert ZZ.get_field() == QQ
  453. assert QQ.get_field() == QQ
  454. assert RR.get_field() == RR
  455. assert ALG.get_field() == ALG
  456. assert ZZ[x].get_field() == ZZ.frac_field(x)
  457. assert QQ[x].get_field() == QQ.frac_field(x)
  458. assert ZZ[x, y].get_field() == ZZ.frac_field(x, y)
  459. assert QQ[x, y].get_field() == QQ.frac_field(x, y)
  460. def test_Domain_get_exact():
  461. assert EX.get_exact() == EX
  462. assert ZZ.get_exact() == ZZ
  463. assert QQ.get_exact() == QQ
  464. assert RR.get_exact() == QQ
  465. assert ALG.get_exact() == ALG
  466. assert ZZ[x].get_exact() == ZZ[x]
  467. assert QQ[x].get_exact() == QQ[x]
  468. assert ZZ[x, y].get_exact() == ZZ[x, y]
  469. assert QQ[x, y].get_exact() == QQ[x, y]
  470. assert ZZ.frac_field(x).get_exact() == ZZ.frac_field(x)
  471. assert QQ.frac_field(x).get_exact() == QQ.frac_field(x)
  472. assert ZZ.frac_field(x, y).get_exact() == ZZ.frac_field(x, y)
  473. assert QQ.frac_field(x, y).get_exact() == QQ.frac_field(x, y)
  474. def test_Domain_is_unit():
  475. nums = [-2, -1, 0, 1, 2]
  476. invring = [False, True, False, True, False]
  477. invfield = [True, True, False, True, True]
  478. ZZx, QQx, QQxf = ZZ[x], QQ[x], QQ.frac_field(x)
  479. assert [ZZ.is_unit(ZZ(n)) for n in nums] == invring
  480. assert [QQ.is_unit(QQ(n)) for n in nums] == invfield
  481. assert [ZZx.is_unit(ZZx(n)) for n in nums] == invring
  482. assert [QQx.is_unit(QQx(n)) for n in nums] == invfield
  483. assert [QQxf.is_unit(QQxf(n)) for n in nums] == invfield
  484. assert ZZx.is_unit(ZZx(x)) is False
  485. assert QQx.is_unit(QQx(x)) is False
  486. assert QQxf.is_unit(QQxf(x)) is True
  487. def test_Domain_convert():
  488. def check_element(e1, e2, K1, K2, K3):
  489. assert type(e1) is type(e2), '%s, %s: %s %s -> %s' % (e1, e2, K1, K2, K3)
  490. assert e1 == e2, '%s, %s: %s %s -> %s' % (e1, e2, K1, K2, K3)
  491. def check_domains(K1, K2):
  492. K3 = K1.unify(K2)
  493. check_element(K3.convert_from( K1.one, K1), K3.one, K1, K2, K3)
  494. check_element(K3.convert_from( K2.one, K2), K3.one, K1, K2, K3)
  495. check_element(K3.convert_from(K1.zero, K1), K3.zero, K1, K2, K3)
  496. check_element(K3.convert_from(K2.zero, K2), K3.zero, K1, K2, K3)
  497. def composite_domains(K):
  498. domains = [
  499. K,
  500. K[y], K[z], K[y, z],
  501. K.frac_field(y), K.frac_field(z), K.frac_field(y, z),
  502. # XXX: These should be tested and made to work...
  503. # K.old_poly_ring(y), K.old_frac_field(y),
  504. ]
  505. return domains
  506. QQ2 = QQ.algebraic_field(sqrt(2))
  507. QQ3 = QQ.algebraic_field(sqrt(3))
  508. doms = [ZZ, QQ, QQ2, QQ3, QQ_I, ZZ_I, RR, CC]
  509. for i, K1 in enumerate(doms):
  510. for K2 in doms[i:]:
  511. for K3 in composite_domains(K1):
  512. for K4 in composite_domains(K2):
  513. check_domains(K3, K4)
  514. assert QQ.convert(10e-52) == QQ(1684996666696915, 1684996666696914987166688442938726917102321526408785780068975640576)
  515. R, xr = ring("x", ZZ)
  516. assert ZZ.convert(xr - xr) == 0
  517. assert ZZ.convert(xr - xr, R.to_domain()) == 0
  518. assert CC.convert(ZZ_I(1, 2)) == CC(1, 2)
  519. assert CC.convert(QQ_I(1, 2)) == CC(1, 2)
  520. K1 = QQ.frac_field(x)
  521. K2 = ZZ.frac_field(x)
  522. K3 = QQ[x]
  523. K4 = ZZ[x]
  524. Ks = [K1, K2, K3, K4]
  525. for Ka, Kb in product(Ks, Ks):
  526. assert Ka.convert_from(Kb.from_sympy(x), Kb) == Ka.from_sympy(x)
  527. assert K2.convert_from(QQ(1, 2), QQ) == K2(QQ(1, 2))
  528. def test_GlobalPolynomialRing_convert():
  529. K1 = QQ.old_poly_ring(x)
  530. K2 = QQ[x]
  531. assert K1.convert(x) == K1.convert(K2.convert(x), K2)
  532. assert K2.convert(x) == K2.convert(K1.convert(x), K1)
  533. K1 = QQ.old_poly_ring(x, y)
  534. K2 = QQ[x]
  535. assert K1.convert(x) == K1.convert(K2.convert(x), K2)
  536. #assert K2.convert(x) == K2.convert(K1.convert(x), K1)
  537. K1 = ZZ.old_poly_ring(x, y)
  538. K2 = QQ[x]
  539. assert K1.convert(x) == K1.convert(K2.convert(x), K2)
  540. #assert K2.convert(x) == K2.convert(K1.convert(x), K1)
  541. def test_PolynomialRing__init():
  542. R, = ring("", ZZ)
  543. assert ZZ.poly_ring() == R.to_domain()
  544. def test_FractionField__init():
  545. F, = field("", ZZ)
  546. assert ZZ.frac_field() == F.to_domain()
  547. def test_FractionField_convert():
  548. K = QQ.frac_field(x)
  549. assert K.convert(QQ(2, 3), QQ) == K.from_sympy(Rational(2, 3))
  550. K = QQ.frac_field(x)
  551. assert K.convert(ZZ(2), ZZ) == K.from_sympy(Integer(2))
  552. def test_inject():
  553. assert ZZ.inject(x, y, z) == ZZ[x, y, z]
  554. assert ZZ[x].inject(y, z) == ZZ[x, y, z]
  555. assert ZZ.frac_field(x).inject(y, z) == ZZ.frac_field(x, y, z)
  556. raises(GeneratorsError, lambda: ZZ[x].inject(x))
  557. def test_drop():
  558. assert ZZ.drop(x) == ZZ
  559. assert ZZ[x].drop(x) == ZZ
  560. assert ZZ[x, y].drop(x) == ZZ[y]
  561. assert ZZ.frac_field(x).drop(x) == ZZ
  562. assert ZZ.frac_field(x, y).drop(x) == ZZ.frac_field(y)
  563. assert ZZ[x][y].drop(y) == ZZ[x]
  564. assert ZZ[x][y].drop(x) == ZZ[y]
  565. assert ZZ.frac_field(x)[y].drop(x) == ZZ[y]
  566. assert ZZ.frac_field(x)[y].drop(y) == ZZ.frac_field(x)
  567. Ky = FiniteExtension(Poly(x**2-1, x, domain=ZZ[y]))
  568. K = FiniteExtension(Poly(x**2-1, x, domain=ZZ))
  569. assert Ky.drop(y) == K
  570. raises(GeneratorsError, lambda: Ky.drop(x))
  571. def test_Domain_map():
  572. seq = ZZ.map([1, 2, 3, 4])
  573. assert all(ZZ.of_type(elt) for elt in seq)
  574. seq = ZZ.map([[1, 2, 3, 4]])
  575. assert all(ZZ.of_type(elt) for elt in seq[0]) and len(seq) == 1
  576. def test_Domain___eq__():
  577. assert (ZZ[x, y] == ZZ[x, y]) is True
  578. assert (QQ[x, y] == QQ[x, y]) is True
  579. assert (ZZ[x, y] == QQ[x, y]) is False
  580. assert (QQ[x, y] == ZZ[x, y]) is False
  581. assert (ZZ.frac_field(x, y) == ZZ.frac_field(x, y)) is True
  582. assert (QQ.frac_field(x, y) == QQ.frac_field(x, y)) is True
  583. assert (ZZ.frac_field(x, y) == QQ.frac_field(x, y)) is False
  584. assert (QQ.frac_field(x, y) == ZZ.frac_field(x, y)) is False
  585. assert RealField()[x] == RR[x]
  586. def test_Domain__algebraic_field():
  587. alg = ZZ.algebraic_field(sqrt(2))
  588. assert alg.ext.minpoly == Poly(x**2 - 2)
  589. assert alg.dom == QQ
  590. alg = QQ.algebraic_field(sqrt(2))
  591. assert alg.ext.minpoly == Poly(x**2 - 2)
  592. assert alg.dom == QQ
  593. alg = alg.algebraic_field(sqrt(3))
  594. assert alg.ext.minpoly == Poly(x**4 - 10*x**2 + 1)
  595. assert alg.dom == QQ
  596. def test_PolynomialRing_from_FractionField():
  597. F, x,y = field("x,y", ZZ)
  598. R, X,Y = ring("x,y", ZZ)
  599. f = (x**2 + y**2)/(x + 1)
  600. g = (x**2 + y**2)/4
  601. h = x**2 + y**2
  602. assert R.to_domain().from_FractionField(f, F.to_domain()) is None
  603. assert R.to_domain().from_FractionField(g, F.to_domain()) == X**2/4 + Y**2/4
  604. assert R.to_domain().from_FractionField(h, F.to_domain()) == X**2 + Y**2
  605. F, x,y = field("x,y", QQ)
  606. R, X,Y = ring("x,y", QQ)
  607. f = (x**2 + y**2)/(x + 1)
  608. g = (x**2 + y**2)/4
  609. h = x**2 + y**2
  610. assert R.to_domain().from_FractionField(f, F.to_domain()) is None
  611. assert R.to_domain().from_FractionField(g, F.to_domain()) == X**2/4 + Y**2/4
  612. assert R.to_domain().from_FractionField(h, F.to_domain()) == X**2 + Y**2
  613. def test_FractionField_from_PolynomialRing():
  614. R, x,y = ring("x,y", QQ)
  615. F, X,Y = field("x,y", ZZ)
  616. f = 3*x**2 + 5*y**2
  617. g = x**2/3 + y**2/5
  618. assert F.to_domain().from_PolynomialRing(f, R.to_domain()) == 3*X**2 + 5*Y**2
  619. assert F.to_domain().from_PolynomialRing(g, R.to_domain()) == (5*X**2 + 3*Y**2)/15
  620. def test_FF_of_type():
  621. assert FF(3).of_type(FF(3)(1)) is True
  622. assert FF(5).of_type(FF(5)(3)) is True
  623. assert FF(5).of_type(FF(7)(3)) is False
  624. def test___eq__():
  625. assert not QQ[x] == ZZ[x]
  626. assert not QQ.frac_field(x) == ZZ.frac_field(x)
  627. def test_RealField_from_sympy():
  628. assert RR.convert(S.Zero) == RR.dtype(0)
  629. assert RR.convert(S(0.0)) == RR.dtype(0.0)
  630. assert RR.convert(S.One) == RR.dtype(1)
  631. assert RR.convert(S(1.0)) == RR.dtype(1.0)
  632. assert RR.convert(sin(1)) == RR.dtype(sin(1).evalf())
  633. def test_not_in_any_domain():
  634. check = illegal + [x] + [
  635. float(i) for i in illegal if i != S.ComplexInfinity]
  636. for dom in (ZZ, QQ, RR, CC, EX):
  637. for i in check:
  638. if i == x and dom == EX:
  639. continue
  640. assert i not in dom, (i, dom)
  641. raises(CoercionFailed, lambda: dom.convert(i))
  642. def test_ModularInteger():
  643. F3 = FF(3)
  644. a = F3(0)
  645. assert isinstance(a, F3.dtype) and a == 0
  646. a = F3(1)
  647. assert isinstance(a, F3.dtype) and a == 1
  648. a = F3(2)
  649. assert isinstance(a, F3.dtype) and a == 2
  650. a = F3(3)
  651. assert isinstance(a, F3.dtype) and a == 0
  652. a = F3(4)
  653. assert isinstance(a, F3.dtype) and a == 1
  654. a = F3(F3(0))
  655. assert isinstance(a, F3.dtype) and a == 0
  656. a = F3(F3(1))
  657. assert isinstance(a, F3.dtype) and a == 1
  658. a = F3(F3(2))
  659. assert isinstance(a, F3.dtype) and a == 2
  660. a = F3(F3(3))
  661. assert isinstance(a, F3.dtype) and a == 0
  662. a = F3(F3(4))
  663. assert isinstance(a, F3.dtype) and a == 1
  664. a = -F3(1)
  665. assert isinstance(a, F3.dtype) and a == 2
  666. a = -F3(2)
  667. assert isinstance(a, F3.dtype) and a == 1
  668. a = 2 + F3(2)
  669. assert isinstance(a, F3.dtype) and a == 1
  670. a = F3(2) + 2
  671. assert isinstance(a, F3.dtype) and a == 1
  672. a = F3(2) + F3(2)
  673. assert isinstance(a, F3.dtype) and a == 1
  674. a = F3(2) + F3(2)
  675. assert isinstance(a, F3.dtype) and a == 1
  676. a = 3 - F3(2)
  677. assert isinstance(a, F3.dtype) and a == 1
  678. a = F3(3) - 2
  679. assert isinstance(a, F3.dtype) and a == 1
  680. a = F3(3) - F3(2)
  681. assert isinstance(a, F3.dtype) and a == 1
  682. a = F3(3) - F3(2)
  683. assert isinstance(a, F3.dtype) and a == 1
  684. a = 2*F3(2)
  685. assert isinstance(a, F3.dtype) and a == 1
  686. a = F3(2)*2
  687. assert isinstance(a, F3.dtype) and a == 1
  688. a = F3(2)*F3(2)
  689. assert isinstance(a, F3.dtype) and a == 1
  690. a = F3(2)*F3(2)
  691. assert isinstance(a, F3.dtype) and a == 1
  692. a = 2/F3(2)
  693. assert isinstance(a, F3.dtype) and a == 1
  694. a = F3(2)/2
  695. assert isinstance(a, F3.dtype) and a == 1
  696. a = F3(2)/F3(2)
  697. assert isinstance(a, F3.dtype) and a == 1
  698. a = F3(2)/F3(2)
  699. assert isinstance(a, F3.dtype) and a == 1
  700. a = 1 % F3(2)
  701. assert isinstance(a, F3.dtype) and a == 1
  702. a = F3(1) % 2
  703. assert isinstance(a, F3.dtype) and a == 1
  704. a = F3(1) % F3(2)
  705. assert isinstance(a, F3.dtype) and a == 1
  706. a = F3(1) % F3(2)
  707. assert isinstance(a, F3.dtype) and a == 1
  708. a = F3(2)**0
  709. assert isinstance(a, F3.dtype) and a == 1
  710. a = F3(2)**1
  711. assert isinstance(a, F3.dtype) and a == 2
  712. a = F3(2)**2
  713. assert isinstance(a, F3.dtype) and a == 1
  714. F7 = FF(7)
  715. a = F7(3)**100000000000
  716. assert isinstance(a, F7.dtype) and a == 4
  717. a = F7(3)**-100000000000
  718. assert isinstance(a, F7.dtype) and a == 2
  719. a = F7(3)**S(2)
  720. assert isinstance(a, F7.dtype) and a == 2
  721. assert bool(F3(3)) is False
  722. assert bool(F3(4)) is True
  723. F5 = FF(5)
  724. a = F5(1)**(-1)
  725. assert isinstance(a, F5.dtype) and a == 1
  726. a = F5(2)**(-1)
  727. assert isinstance(a, F5.dtype) and a == 3
  728. a = F5(3)**(-1)
  729. assert isinstance(a, F5.dtype) and a == 2
  730. a = F5(4)**(-1)
  731. assert isinstance(a, F5.dtype) and a == 4
  732. assert (F5(1) < F5(2)) is True
  733. assert (F5(1) <= F5(2)) is True
  734. assert (F5(1) > F5(2)) is False
  735. assert (F5(1) >= F5(2)) is False
  736. assert (F5(3) < F5(2)) is False
  737. assert (F5(3) <= F5(2)) is False
  738. assert (F5(3) > F5(2)) is True
  739. assert (F5(3) >= F5(2)) is True
  740. assert (F5(1) < F5(7)) is True
  741. assert (F5(1) <= F5(7)) is True
  742. assert (F5(1) > F5(7)) is False
  743. assert (F5(1) >= F5(7)) is False
  744. assert (F5(3) < F5(7)) is False
  745. assert (F5(3) <= F5(7)) is False
  746. assert (F5(3) > F5(7)) is True
  747. assert (F5(3) >= F5(7)) is True
  748. assert (F5(1) < 2) is True
  749. assert (F5(1) <= 2) is True
  750. assert (F5(1) > 2) is False
  751. assert (F5(1) >= 2) is False
  752. assert (F5(3) < 2) is False
  753. assert (F5(3) <= 2) is False
  754. assert (F5(3) > 2) is True
  755. assert (F5(3) >= 2) is True
  756. assert (F5(1) < 7) is True
  757. assert (F5(1) <= 7) is True
  758. assert (F5(1) > 7) is False
  759. assert (F5(1) >= 7) is False
  760. assert (F5(3) < 7) is False
  761. assert (F5(3) <= 7) is False
  762. assert (F5(3) > 7) is True
  763. assert (F5(3) >= 7) is True
  764. raises(NotInvertible, lambda: F5(0)**(-1))
  765. raises(NotInvertible, lambda: F5(5)**(-1))
  766. raises(ValueError, lambda: FF(0))
  767. raises(ValueError, lambda: FF(2.1))
  768. def test_QQ_int():
  769. assert int(QQ(2**2000, 3**1250)) == 455431
  770. assert int(QQ(2**100, 3)) == 422550200076076467165567735125
  771. def test_RR_double():
  772. assert RR(3.14) > 1e-50
  773. assert RR(1e-13) > 1e-50
  774. assert RR(1e-14) > 1e-50
  775. assert RR(1e-15) > 1e-50
  776. assert RR(1e-20) > 1e-50
  777. assert RR(1e-40) > 1e-50
  778. def test_RR_Float():
  779. f1 = Float("1.01")
  780. f2 = Float("1.0000000000000000000001")
  781. assert f1._prec == 53
  782. assert f2._prec == 80
  783. assert RR(f1)-1 > 1e-50
  784. assert RR(f2)-1 < 1e-50 # RR's precision is lower than f2's
  785. RR2 = RealField(prec=f2._prec)
  786. assert RR2(f1)-1 > 1e-50
  787. assert RR2(f2)-1 > 1e-50 # RR's precision is equal to f2's
  788. def test_CC_double():
  789. assert CC(3.14).real > 1e-50
  790. assert CC(1e-13).real > 1e-50
  791. assert CC(1e-14).real > 1e-50
  792. assert CC(1e-15).real > 1e-50
  793. assert CC(1e-20).real > 1e-50
  794. assert CC(1e-40).real > 1e-50
  795. assert CC(3.14j).imag > 1e-50
  796. assert CC(1e-13j).imag > 1e-50
  797. assert CC(1e-14j).imag > 1e-50
  798. assert CC(1e-15j).imag > 1e-50
  799. assert CC(1e-20j).imag > 1e-50
  800. assert CC(1e-40j).imag > 1e-50
  801. def test_gaussian_domains():
  802. I = S.ImaginaryUnit
  803. a, b, c, d = [ZZ_I.convert(x) for x in (5, 2 + I, 3 - I, 5 - 5*I)]
  804. assert ZZ_I.gcd(a, b) == b
  805. assert ZZ_I.gcd(a, c) == b
  806. assert ZZ_I.lcm(a, b) == a
  807. assert ZZ_I.lcm(a, c) == d
  808. assert ZZ_I(3, 4) != QQ_I(3, 4) # XXX is this right or should QQ->ZZ if possible?
  809. assert ZZ_I(3, 0) != 3 # and should this go to Integer?
  810. assert QQ_I(S(3)/4, 0) != S(3)/4 # and this to Rational?
  811. assert ZZ_I(0, 0).quadrant() == 0
  812. assert ZZ_I(-1, 0).quadrant() == 2
  813. assert QQ_I.convert(QQ(3, 2)) == QQ_I(QQ(3, 2), QQ(0))
  814. assert QQ_I.convert(QQ(3, 2), QQ) == QQ_I(QQ(3, 2), QQ(0))
  815. for G in (QQ_I, ZZ_I):
  816. q = G(3, 4)
  817. assert str(q) == '3 + 4*I'
  818. assert q.parent() == G
  819. assert q._get_xy(pi) == (None, None)
  820. assert q._get_xy(2) == (2, 0)
  821. assert q._get_xy(2*I) == (0, 2)
  822. assert hash(q) == hash((3, 4))
  823. assert G(1, 2) == G(1, 2)
  824. assert G(1, 2) != G(1, 3)
  825. assert G(3, 0) == G(3)
  826. assert q + q == G(6, 8)
  827. assert q - q == G(0, 0)
  828. assert 3 - q == -q + 3 == G(0, -4)
  829. assert 3 + q == q + 3 == G(6, 4)
  830. assert q * q == G(-7, 24)
  831. assert 3 * q == q * 3 == G(9, 12)
  832. assert q ** 0 == G(1, 0)
  833. assert q ** 1 == q
  834. assert q ** 2 == q * q == G(-7, 24)
  835. assert q ** 3 == q * q * q == G(-117, 44)
  836. assert 1 / q == q ** -1 == QQ_I(S(3)/25, - S(4)/25)
  837. assert q / 1 == QQ_I(3, 4)
  838. assert q / 2 == QQ_I(S(3)/2, 2)
  839. assert q/3 == QQ_I(1, S(4)/3)
  840. assert 3/q == QQ_I(S(9)/25, -S(12)/25)
  841. i, r = divmod(q, 2)
  842. assert 2*i + r == q
  843. i, r = divmod(2, q)
  844. assert q*i + r == G(2, 0)
  845. raises(ZeroDivisionError, lambda: q % 0)
  846. raises(ZeroDivisionError, lambda: q / 0)
  847. raises(ZeroDivisionError, lambda: q // 0)
  848. raises(ZeroDivisionError, lambda: divmod(q, 0))
  849. raises(ZeroDivisionError, lambda: divmod(q, 0))
  850. raises(TypeError, lambda: q + x)
  851. raises(TypeError, lambda: q - x)
  852. raises(TypeError, lambda: x + q)
  853. raises(TypeError, lambda: x - q)
  854. raises(TypeError, lambda: q * x)
  855. raises(TypeError, lambda: x * q)
  856. raises(TypeError, lambda: q / x)
  857. raises(TypeError, lambda: x / q)
  858. raises(TypeError, lambda: q // x)
  859. raises(TypeError, lambda: x // q)
  860. assert G.from_sympy(S(2)) == G(2, 0)
  861. assert G.to_sympy(G(2, 0)) == S(2)
  862. raises(CoercionFailed, lambda: G.from_sympy(pi))
  863. PR = G.inject(x)
  864. assert isinstance(PR, PolynomialRing)
  865. assert PR.domain == G
  866. assert len(PR.gens) == 1 and PR.gens[0].as_expr() == x
  867. if G is QQ_I:
  868. AF = G.as_AlgebraicField()
  869. assert isinstance(AF, AlgebraicField)
  870. assert AF.domain == QQ
  871. assert AF.ext.args[0] == I
  872. for qi in [G(-1, 0), G(1, 0), G(0, -1), G(0, 1)]:
  873. assert G.is_negative(qi) is False
  874. assert G.is_positive(qi) is False
  875. assert G.is_nonnegative(qi) is False
  876. assert G.is_nonpositive(qi) is False
  877. domains = [ZZ_python(), QQ_python(), AlgebraicField(QQ, I)]
  878. if HAS_GMPY:
  879. domains += [ZZ_gmpy(), QQ_gmpy()]
  880. for K in domains:
  881. assert G.convert(K(2)) == G(2, 0)
  882. assert G.convert(K(2), K) == G(2, 0)
  883. for K in ZZ_I, QQ_I:
  884. assert G.convert(K(1, 1)) == G(1, 1)
  885. assert G.convert(K(1, 1), K) == G(1, 1)
  886. if G == ZZ_I:
  887. assert repr(q) == 'ZZ_I(3, 4)'
  888. assert q//3 == G(1, 1)
  889. assert 12//q == G(1, -2)
  890. assert 12 % q == G(1, 2)
  891. assert q % 2 == G(-1, 0)
  892. assert i == G(0, 0)
  893. assert r == G(2, 0)
  894. assert G.get_ring() == G
  895. assert G.get_field() == QQ_I
  896. else:
  897. assert repr(q) == 'QQ_I(3, 4)'
  898. assert G.get_ring() == ZZ_I
  899. assert G.get_field() == G
  900. assert q//3 == G(1, S(4)/3)
  901. assert 12//q == G(S(36)/25, -S(48)/25)
  902. assert 12 % q == G(0, 0)
  903. assert q % 2 == G(0, 0)
  904. assert i == G(S(6)/25, -S(8)/25), (G,i)
  905. assert r == G(0, 0)
  906. q2 = G(S(3)/2, S(5)/3)
  907. assert G.numer(q2) == ZZ_I(9, 10)
  908. assert G.denom(q2) == ZZ_I(6)
  909. def test_EX_EXRAW():
  910. assert EXRAW.zero is S.Zero
  911. assert EXRAW.one is S.One
  912. assert EX(1) == EX.Expression(1)
  913. assert EX(1).ex is S.One
  914. assert EXRAW(1) is S.One
  915. # EX has cancelling but EXRAW does not
  916. assert 2*EX((x + y*x)/x) == EX(2 + 2*y) != 2*((x + y*x)/x)
  917. assert 2*EXRAW((x + y*x)/x) == 2*((x + y*x)/x) != (1 + y)
  918. assert EXRAW.convert_from(EX(1), EX) is EXRAW.one
  919. assert EX.convert_from(EXRAW(1), EXRAW) == EX.one
  920. assert EXRAW.from_sympy(S.One) is S.One
  921. assert EXRAW.to_sympy(EXRAW.one) is S.One
  922. raises(CoercionFailed, lambda: EXRAW.from_sympy([]))
  923. assert EXRAW.get_field() == EXRAW
  924. assert EXRAW.unify(EX) == EXRAW
  925. assert EX.unify(EXRAW) == EXRAW
  926. def test_canonical_unit():
  927. for K in [ZZ, QQ, RR]: # CC?
  928. assert K.canonical_unit(K(2)) == K(1)
  929. assert K.canonical_unit(K(-2)) == K(-1)
  930. for K in [ZZ_I, QQ_I]:
  931. i = K.from_sympy(I)
  932. assert K.canonical_unit(K(2)) == K(1)
  933. assert K.canonical_unit(K(2)*i) == -i
  934. assert K.canonical_unit(-K(2)) == K(-1)
  935. assert K.canonical_unit(-K(2)*i) == i
  936. K = ZZ[x]
  937. assert K.canonical_unit(K(x + 1)) == K(1)
  938. assert K.canonical_unit(K(-x + 1)) == K(-1)
  939. K = ZZ_I[x]
  940. assert K.canonical_unit(K.from_sympy(I*x)) == ZZ_I(0, -1)
  941. K = ZZ_I.frac_field(x, y)
  942. i = K.from_sympy(I)
  943. assert i / i == K.one
  944. assert (K.one + i)/(i - K.one) == -i
  945. def test_issue_18278():
  946. assert str(RR(2).parent()) == 'RR'
  947. assert str(CC(2).parent()) == 'CC'
  948. def test_Domain_is_negative():
  949. I = S.ImaginaryUnit
  950. a, b = [CC.convert(x) for x in (2 + I, 5)]
  951. assert CC.is_negative(a) == False
  952. assert CC.is_negative(b) == False
  953. def test_Domain_is_positive():
  954. I = S.ImaginaryUnit
  955. a, b = [CC.convert(x) for x in (2 + I, 5)]
  956. assert CC.is_positive(a) == False
  957. assert CC.is_positive(b) == False
  958. def test_Domain_is_nonnegative():
  959. I = S.ImaginaryUnit
  960. a, b = [CC.convert(x) for x in (2 + I, 5)]
  961. assert CC.is_nonnegative(a) == False
  962. assert CC.is_nonnegative(b) == False
  963. def test_Domain_is_nonpositive():
  964. I = S.ImaginaryUnit
  965. a, b = [CC.convert(x) for x in (2 + I, 5)]
  966. assert CC.is_nonpositive(a) == False
  967. assert CC.is_nonpositive(b) == False
  968. def test_exponential_domain():
  969. K = ZZ[E]
  970. eK = K.from_sympy(E)
  971. assert K.from_sympy(exp(3)) == eK ** 3
  972. assert K.convert(exp(3)) == eK ** 3