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

298 lines
12 KiB

7 months ago
  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]