test_domains.py 50 KB

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