test_domains.py 43 KB

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