图片解析应用
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

298 lines
12 KiB

  1. """Tests for the subfield problem and allied problems. """
  2. from sympy.core.numbers import (AlgebraicNumber, I, pi, Rational)
  3. from sympy.core.singleton import S
  4. from sympy.functions.elementary.exponential import exp
  5. from sympy.functions.elementary.miscellaneous import sqrt
  6. from sympy.polys.numberfields.subfield import (
  7. is_isomorphism_possible,
  8. field_isomorphism_pslq,
  9. field_isomorphism,
  10. primitive_element,
  11. to_number_field,
  12. )
  13. from sympy.polys.polyerrors import IsomorphismFailed
  14. from sympy.polys.polytools import Poly
  15. from sympy.polys.rootoftools import CRootOf
  16. from sympy.testing.pytest import raises
  17. from sympy.abc import x
  18. Q = Rational
  19. def test_field_isomorphism_pslq():
  20. a = AlgebraicNumber(I)
  21. b = AlgebraicNumber(I*sqrt(3))
  22. raises(NotImplementedError, lambda: field_isomorphism_pslq(a, b))
  23. a = AlgebraicNumber(sqrt(2))
  24. b = AlgebraicNumber(sqrt(3))
  25. c = AlgebraicNumber(sqrt(7))
  26. d = AlgebraicNumber(sqrt(2) + sqrt(3))
  27. e = AlgebraicNumber(sqrt(2) + sqrt(3) + sqrt(7))
  28. assert field_isomorphism_pslq(a, a) == [1, 0]
  29. assert field_isomorphism_pslq(a, b) is None
  30. assert field_isomorphism_pslq(a, c) is None
  31. assert field_isomorphism_pslq(a, d) == [Q(1, 2), 0, -Q(9, 2), 0]
  32. assert field_isomorphism_pslq(
  33. a, e) == [Q(1, 80), 0, -Q(1, 2), 0, Q(59, 20), 0]
  34. assert field_isomorphism_pslq(b, a) is None
  35. assert field_isomorphism_pslq(b, b) == [1, 0]
  36. assert field_isomorphism_pslq(b, c) is None
  37. assert field_isomorphism_pslq(b, d) == [-Q(1, 2), 0, Q(11, 2), 0]
  38. assert field_isomorphism_pslq(b, e) == [-Q(
  39. 3, 640), 0, Q(67, 320), 0, -Q(297, 160), 0, Q(313, 80), 0]
  40. assert field_isomorphism_pslq(c, a) is None
  41. assert field_isomorphism_pslq(c, b) is None
  42. assert field_isomorphism_pslq(c, c) == [1, 0]
  43. assert field_isomorphism_pslq(c, d) is None
  44. assert field_isomorphism_pslq(c, e) == [Q(
  45. 3, 640), 0, -Q(71, 320), 0, Q(377, 160), 0, -Q(469, 80), 0]
  46. assert field_isomorphism_pslq(d, a) is None
  47. assert field_isomorphism_pslq(d, b) is None
  48. assert field_isomorphism_pslq(d, c) is None
  49. assert field_isomorphism_pslq(d, d) == [1, 0]
  50. assert field_isomorphism_pslq(d, e) == [-Q(
  51. 3, 640), 0, Q(71, 320), 0, -Q(377, 160), 0, Q(549, 80), 0]
  52. assert field_isomorphism_pslq(e, a) is None
  53. assert field_isomorphism_pslq(e, b) is None
  54. assert field_isomorphism_pslq(e, c) is None
  55. assert field_isomorphism_pslq(e, d) is None
  56. assert field_isomorphism_pslq(e, e) == [1, 0]
  57. f = AlgebraicNumber(3*sqrt(2) + 8*sqrt(7) - 5)
  58. assert field_isomorphism_pslq(
  59. f, e) == [Q(3, 80), 0, -Q(139, 80), 0, Q(347, 20), 0, -Q(761, 20), -5]
  60. def test_field_isomorphism():
  61. assert field_isomorphism(3, sqrt(2)) == [3]
  62. assert field_isomorphism( I*sqrt(3), I*sqrt(3)/2) == [ 2, 0]
  63. assert field_isomorphism(-I*sqrt(3), I*sqrt(3)/2) == [-2, 0]
  64. assert field_isomorphism( I*sqrt(3), -I*sqrt(3)/2) == [-2, 0]
  65. assert field_isomorphism(-I*sqrt(3), -I*sqrt(3)/2) == [ 2, 0]
  66. assert field_isomorphism( 2*I*sqrt(3)/7, 5*I*sqrt(3)/3) == [ Rational(6, 35), 0]
  67. assert field_isomorphism(-2*I*sqrt(3)/7, 5*I*sqrt(3)/3) == [Rational(-6, 35), 0]
  68. assert field_isomorphism( 2*I*sqrt(3)/7, -5*I*sqrt(3)/3) == [Rational(-6, 35), 0]
  69. assert field_isomorphism(-2*I*sqrt(3)/7, -5*I*sqrt(3)/3) == [ Rational(6, 35), 0]
  70. assert field_isomorphism(
  71. 2*I*sqrt(3)/7 + 27, 5*I*sqrt(3)/3) == [ Rational(6, 35), 27]
  72. assert field_isomorphism(
  73. -2*I*sqrt(3)/7 + 27, 5*I*sqrt(3)/3) == [Rational(-6, 35), 27]
  74. assert field_isomorphism(
  75. 2*I*sqrt(3)/7 + 27, -5*I*sqrt(3)/3) == [Rational(-6, 35), 27]
  76. assert field_isomorphism(
  77. -2*I*sqrt(3)/7 + 27, -5*I*sqrt(3)/3) == [ Rational(6, 35), 27]
  78. p = AlgebraicNumber( sqrt(2) + sqrt(3))
  79. q = AlgebraicNumber(-sqrt(2) + sqrt(3))
  80. r = AlgebraicNumber( sqrt(2) - sqrt(3))
  81. s = AlgebraicNumber(-sqrt(2) - sqrt(3))
  82. pos_coeffs = [ S.Half, S.Zero, Rational(-9, 2), S.Zero]
  83. neg_coeffs = [Rational(-1, 2), S.Zero, Rational(9, 2), S.Zero]
  84. a = AlgebraicNumber(sqrt(2))
  85. assert is_isomorphism_possible(a, p) is True
  86. assert is_isomorphism_possible(a, q) is True
  87. assert is_isomorphism_possible(a, r) is True
  88. assert is_isomorphism_possible(a, s) is True
  89. assert field_isomorphism(a, p, fast=True) == pos_coeffs
  90. assert field_isomorphism(a, q, fast=True) == neg_coeffs
  91. assert field_isomorphism(a, r, fast=True) == pos_coeffs
  92. assert field_isomorphism(a, s, fast=True) == neg_coeffs
  93. assert field_isomorphism(a, p, fast=False) == pos_coeffs
  94. assert field_isomorphism(a, q, fast=False) == neg_coeffs
  95. assert field_isomorphism(a, r, fast=False) == pos_coeffs
  96. assert field_isomorphism(a, s, fast=False) == neg_coeffs
  97. a = AlgebraicNumber(-sqrt(2))
  98. assert is_isomorphism_possible(a, p) is True
  99. assert is_isomorphism_possible(a, q) is True
  100. assert is_isomorphism_possible(a, r) is True
  101. assert is_isomorphism_possible(a, s) is True
  102. assert field_isomorphism(a, p, fast=True) == neg_coeffs
  103. assert field_isomorphism(a, q, fast=True) == pos_coeffs
  104. assert field_isomorphism(a, r, fast=True) == neg_coeffs
  105. assert field_isomorphism(a, s, fast=True) == pos_coeffs
  106. assert field_isomorphism(a, p, fast=False) == neg_coeffs
  107. assert field_isomorphism(a, q, fast=False) == pos_coeffs
  108. assert field_isomorphism(a, r, fast=False) == neg_coeffs
  109. assert field_isomorphism(a, s, fast=False) == pos_coeffs
  110. pos_coeffs = [ S.Half, S.Zero, Rational(-11, 2), S.Zero]
  111. neg_coeffs = [Rational(-1, 2), S.Zero, Rational(11, 2), S.Zero]
  112. a = AlgebraicNumber(sqrt(3))
  113. assert is_isomorphism_possible(a, p) is True
  114. assert is_isomorphism_possible(a, q) is True
  115. assert is_isomorphism_possible(a, r) is True
  116. assert is_isomorphism_possible(a, s) is True
  117. assert field_isomorphism(a, p, fast=True) == neg_coeffs
  118. assert field_isomorphism(a, q, fast=True) == neg_coeffs
  119. assert field_isomorphism(a, r, fast=True) == pos_coeffs
  120. assert field_isomorphism(a, s, fast=True) == pos_coeffs
  121. assert field_isomorphism(a, p, fast=False) == neg_coeffs
  122. assert field_isomorphism(a, q, fast=False) == neg_coeffs
  123. assert field_isomorphism(a, r, fast=False) == pos_coeffs
  124. assert field_isomorphism(a, s, fast=False) == pos_coeffs
  125. a = AlgebraicNumber(-sqrt(3))
  126. assert is_isomorphism_possible(a, p) is True
  127. assert is_isomorphism_possible(a, q) is True
  128. assert is_isomorphism_possible(a, r) is True
  129. assert is_isomorphism_possible(a, s) is True
  130. assert field_isomorphism(a, p, fast=True) == pos_coeffs
  131. assert field_isomorphism(a, q, fast=True) == pos_coeffs
  132. assert field_isomorphism(a, r, fast=True) == neg_coeffs
  133. assert field_isomorphism(a, s, fast=True) == neg_coeffs
  134. assert field_isomorphism(a, p, fast=False) == pos_coeffs
  135. assert field_isomorphism(a, q, fast=False) == pos_coeffs
  136. assert field_isomorphism(a, r, fast=False) == neg_coeffs
  137. assert field_isomorphism(a, s, fast=False) == neg_coeffs
  138. pos_coeffs = [ Rational(3, 2), S.Zero, Rational(-33, 2), -S(8)]
  139. neg_coeffs = [Rational(-3, 2), S.Zero, Rational(33, 2), -S(8)]
  140. a = AlgebraicNumber(3*sqrt(3) - 8)
  141. assert is_isomorphism_possible(a, p) is True
  142. assert is_isomorphism_possible(a, q) is True
  143. assert is_isomorphism_possible(a, r) is True
  144. assert is_isomorphism_possible(a, s) is True
  145. assert field_isomorphism(a, p, fast=True) == neg_coeffs
  146. assert field_isomorphism(a, q, fast=True) == neg_coeffs
  147. assert field_isomorphism(a, r, fast=True) == pos_coeffs
  148. assert field_isomorphism(a, s, fast=True) == pos_coeffs
  149. assert field_isomorphism(a, p, fast=False) == neg_coeffs
  150. assert field_isomorphism(a, q, fast=False) == neg_coeffs
  151. assert field_isomorphism(a, r, fast=False) == pos_coeffs
  152. assert field_isomorphism(a, s, fast=False) == pos_coeffs
  153. a = AlgebraicNumber(3*sqrt(2) + 2*sqrt(3) + 1)
  154. pos_1_coeffs = [ S.Half, S.Zero, Rational(-5, 2), S.One]
  155. neg_5_coeffs = [Rational(-5, 2), S.Zero, Rational(49, 2), S.One]
  156. pos_5_coeffs = [ Rational(5, 2), S.Zero, Rational(-49, 2), S.One]
  157. neg_1_coeffs = [Rational(-1, 2), S.Zero, Rational(5, 2), S.One]
  158. assert is_isomorphism_possible(a, p) is True
  159. assert is_isomorphism_possible(a, q) is True
  160. assert is_isomorphism_possible(a, r) is True
  161. assert is_isomorphism_possible(a, s) is True
  162. assert field_isomorphism(a, p, fast=True) == pos_1_coeffs
  163. assert field_isomorphism(a, q, fast=True) == neg_5_coeffs
  164. assert field_isomorphism(a, r, fast=True) == pos_5_coeffs
  165. assert field_isomorphism(a, s, fast=True) == neg_1_coeffs
  166. assert field_isomorphism(a, p, fast=False) == pos_1_coeffs
  167. assert field_isomorphism(a, q, fast=False) == neg_5_coeffs
  168. assert field_isomorphism(a, r, fast=False) == pos_5_coeffs
  169. assert field_isomorphism(a, s, fast=False) == neg_1_coeffs
  170. a = AlgebraicNumber(sqrt(2))
  171. b = AlgebraicNumber(sqrt(3))
  172. c = AlgebraicNumber(sqrt(7))
  173. assert is_isomorphism_possible(a, b) is True
  174. assert is_isomorphism_possible(b, a) is True
  175. assert is_isomorphism_possible(c, p) is False
  176. assert field_isomorphism(sqrt(2), sqrt(3), fast=True) is None
  177. assert field_isomorphism(sqrt(3), sqrt(2), fast=True) is None
  178. assert field_isomorphism(sqrt(2), sqrt(3), fast=False) is None
  179. assert field_isomorphism(sqrt(3), sqrt(2), fast=False) is None
  180. a = AlgebraicNumber(sqrt(2))
  181. b = AlgebraicNumber(2 ** (S(1) / 3))
  182. assert is_isomorphism_possible(a, b) is False
  183. assert field_isomorphism(a, b) is None
  184. def test_primitive_element():
  185. assert primitive_element([sqrt(2)], x) == (x**2 - 2, [1])
  186. assert primitive_element(
  187. [sqrt(2), sqrt(3)], x) == (x**4 - 10*x**2 + 1, [1, 1])
  188. assert primitive_element([sqrt(2)], x, polys=True) == (Poly(x**2 - 2, domain='QQ'), [1])
  189. assert primitive_element([sqrt(
  190. 2), sqrt(3)], x, polys=True) == (Poly(x**4 - 10*x**2 + 1, domain='QQ'), [1, 1])
  191. assert primitive_element(
  192. [sqrt(2)], x, ex=True) == (x**2 - 2, [1], [[1, 0]])
  193. assert primitive_element([sqrt(2), sqrt(3)], x, ex=True) == \
  194. (x**4 - 10*x**2 + 1, [1, 1], [[Q(1, 2), 0, -Q(9, 2), 0], [-
  195. Q(1, 2), 0, Q(11, 2), 0]])
  196. assert primitive_element(
  197. [sqrt(2)], x, ex=True, polys=True) == (Poly(x**2 - 2, domain='QQ'), [1], [[1, 0]])
  198. assert primitive_element([sqrt(2), sqrt(3)], x, ex=True, polys=True) == \
  199. (Poly(x**4 - 10*x**2 + 1, domain='QQ'), [1, 1], [[Q(1, 2), 0, -Q(9, 2),
  200. 0], [-Q(1, 2), 0, Q(11, 2), 0]])
  201. assert primitive_element([sqrt(2)], polys=True) == (Poly(x**2 - 2), [1])
  202. raises(ValueError, lambda: primitive_element([], x, ex=False))
  203. raises(ValueError, lambda: primitive_element([], x, ex=True))
  204. # Issue 14117
  205. a, b = I*sqrt(2*sqrt(2) + 3), I*sqrt(-2*sqrt(2) + 3)
  206. assert primitive_element([a, b, I], x) == (x**4 + 6*x**2 + 1, [1, 0, 0])
  207. def test_to_number_field():
  208. assert to_number_field(sqrt(2)) == AlgebraicNumber(sqrt(2))
  209. assert to_number_field(
  210. [sqrt(2), sqrt(3)]) == AlgebraicNumber(sqrt(2) + sqrt(3))
  211. a = AlgebraicNumber(sqrt(2) + sqrt(3), [S.Half, S.Zero, Rational(-9, 2), S.Zero])
  212. assert to_number_field(sqrt(2), sqrt(2) + sqrt(3)) == a
  213. assert to_number_field(sqrt(2), AlgebraicNumber(sqrt(2) + sqrt(3))) == a
  214. raises(IsomorphismFailed, lambda: to_number_field(sqrt(2), sqrt(3)))
  215. def test_issue_22561():
  216. a = to_number_field(sqrt(2), sqrt(2) + sqrt(3))
  217. b = to_number_field(sqrt(2), sqrt(2) + sqrt(5))
  218. assert field_isomorphism(a, b) == [1, 0]
  219. def test_issue_22736():
  220. a = CRootOf(x**4 + x**3 + x**2 + x + 1, -1)
  221. a._reset()
  222. b = exp(2*I*pi/5)
  223. assert field_isomorphism(a, b) == [1, 0]