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.

454 lines
21 KiB

7 months ago
  1. """Tests for minimal polynomials. """
  2. from sympy.core.function import expand
  3. from sympy.core import (GoldenRatio, TribonacciConstant)
  4. from sympy.core.numbers import (AlgebraicNumber, I, Rational, oo, pi)
  5. from sympy.core.power import Pow
  6. from sympy.core.singleton import S
  7. from sympy.functions.elementary.exponential import exp
  8. from sympy.functions.elementary.miscellaneous import (cbrt, sqrt)
  9. from sympy.functions.elementary.trigonometric import (cos, sin, tan)
  10. from sympy.polys.polytools import Poly
  11. from sympy.solvers.solveset import nonlinsolve
  12. from sympy.geometry import Circle, intersection
  13. from sympy.testing.pytest import raises, slow
  14. from sympy.sets.sets import FiniteSet
  15. from sympy.geometry.point import Point2D
  16. from sympy.polys.numberfields.minpoly import (
  17. minimal_polynomial,
  18. _choose_factor,
  19. _minpoly_op_algebraic_element,
  20. _separate_sq,
  21. _minpoly_groebner,
  22. )
  23. from sympy.polys.partfrac import apart
  24. from sympy.polys.polyerrors import (
  25. NotAlgebraic,
  26. GeneratorsError,
  27. )
  28. from sympy.polys.domains import QQ
  29. from sympy.polys.rootoftools import rootof
  30. from sympy.polys.polytools import degree
  31. from sympy.abc import x, y, z
  32. Q = Rational
  33. def test_minimal_polynomial():
  34. assert minimal_polynomial(-7, x) == x + 7
  35. assert minimal_polynomial(-1, x) == x + 1
  36. assert minimal_polynomial( 0, x) == x
  37. assert minimal_polynomial( 1, x) == x - 1
  38. assert minimal_polynomial( 7, x) == x - 7
  39. assert minimal_polynomial(sqrt(2), x) == x**2 - 2
  40. assert minimal_polynomial(sqrt(5), x) == x**2 - 5
  41. assert minimal_polynomial(sqrt(6), x) == x**2 - 6
  42. assert minimal_polynomial(2*sqrt(2), x) == x**2 - 8
  43. assert minimal_polynomial(3*sqrt(5), x) == x**2 - 45
  44. assert minimal_polynomial(4*sqrt(6), x) == x**2 - 96
  45. assert minimal_polynomial(2*sqrt(2) + 3, x) == x**2 - 6*x + 1
  46. assert minimal_polynomial(3*sqrt(5) + 6, x) == x**2 - 12*x - 9
  47. assert minimal_polynomial(4*sqrt(6) + 7, x) == x**2 - 14*x - 47
  48. assert minimal_polynomial(2*sqrt(2) - 3, x) == x**2 + 6*x + 1
  49. assert minimal_polynomial(3*sqrt(5) - 6, x) == x**2 + 12*x - 9
  50. assert minimal_polynomial(4*sqrt(6) - 7, x) == x**2 + 14*x - 47
  51. assert minimal_polynomial(sqrt(1 + sqrt(6)), x) == x**4 - 2*x**2 - 5
  52. assert minimal_polynomial(sqrt(I + sqrt(6)), x) == x**8 - 10*x**4 + 49
  53. assert minimal_polynomial(2*I + sqrt(2 + I), x) == x**4 + 4*x**2 + 8*x + 37
  54. assert minimal_polynomial(sqrt(2) + sqrt(3), x) == x**4 - 10*x**2 + 1
  55. assert minimal_polynomial(
  56. sqrt(2) + sqrt(3) + sqrt(6), x) == x**4 - 22*x**2 - 48*x - 23
  57. a = 1 - 9*sqrt(2) + 7*sqrt(3)
  58. assert minimal_polynomial(
  59. 1/a, x) == 392*x**4 - 1232*x**3 + 612*x**2 + 4*x - 1
  60. assert minimal_polynomial(
  61. 1/sqrt(a), x) == 392*x**8 - 1232*x**6 + 612*x**4 + 4*x**2 - 1
  62. raises(NotAlgebraic, lambda: minimal_polynomial(oo, x))
  63. raises(NotAlgebraic, lambda: minimal_polynomial(2**y, x))
  64. raises(NotAlgebraic, lambda: minimal_polynomial(sin(1), x))
  65. assert minimal_polynomial(sqrt(2)).dummy_eq(x**2 - 2)
  66. assert minimal_polynomial(sqrt(2), x) == x**2 - 2
  67. assert minimal_polynomial(sqrt(2), polys=True) == Poly(x**2 - 2)
  68. assert minimal_polynomial(sqrt(2), x, polys=True) == Poly(x**2 - 2, domain='QQ')
  69. assert minimal_polynomial(sqrt(2), x, polys=True, compose=False) == Poly(x**2 - 2, domain='QQ')
  70. a = AlgebraicNumber(sqrt(2))
  71. b = AlgebraicNumber(sqrt(3))
  72. assert minimal_polynomial(a, x) == x**2 - 2
  73. assert minimal_polynomial(b, x) == x**2 - 3
  74. assert minimal_polynomial(a, x, polys=True) == Poly(x**2 - 2, domain='QQ')
  75. assert minimal_polynomial(b, x, polys=True) == Poly(x**2 - 3, domain='QQ')
  76. assert minimal_polynomial(sqrt(a/2 + 17), x) == 2*x**4 - 68*x**2 + 577
  77. assert minimal_polynomial(sqrt(b/2 + 17), x) == 4*x**4 - 136*x**2 + 1153
  78. a, b = sqrt(2)/3 + 7, AlgebraicNumber(sqrt(2)/3 + 7)
  79. f = 81*x**8 - 2268*x**6 - 4536*x**5 + 22644*x**4 + 63216*x**3 - \
  80. 31608*x**2 - 189648*x + 141358
  81. assert minimal_polynomial(sqrt(a) + sqrt(sqrt(a)), x) == f
  82. assert minimal_polynomial(sqrt(b) + sqrt(sqrt(b)), x) == f
  83. assert minimal_polynomial(
  84. a**Q(3, 2), x) == 729*x**4 - 506898*x**2 + 84604519
  85. # issue 5994
  86. eq = S('''
  87. -1/(800*sqrt(-1/240 + 1/(18000*(-1/17280000 +
  88. sqrt(15)*I/28800000)**(1/3)) + 2*(-1/17280000 +
  89. sqrt(15)*I/28800000)**(1/3)))''')
  90. assert minimal_polynomial(eq, x) == 8000*x**2 - 1
  91. ex = (sqrt(5)*sqrt(I)/(5*sqrt(1 + 125*I))
  92. + 25*sqrt(5)/(I**Q(5,2)*(1 + 125*I)**Q(3,2))
  93. + 3125*sqrt(5)/(I**Q(11,2)*(1 + 125*I)**Q(3,2))
  94. + 5*I*sqrt(1 - I/125))
  95. mp = minimal_polynomial(ex, x)
  96. assert mp == 25*x**4 + 5000*x**2 + 250016
  97. ex = 1 + sqrt(2) + sqrt(3)
  98. mp = minimal_polynomial(ex, x)
  99. assert mp == x**4 - 4*x**3 - 4*x**2 + 16*x - 8
  100. ex = 1/(1 + sqrt(2) + sqrt(3))
  101. mp = minimal_polynomial(ex, x)
  102. assert mp == 8*x**4 - 16*x**3 + 4*x**2 + 4*x - 1
  103. p = (expand((1 + sqrt(2) - 2*sqrt(3) + sqrt(7))**3))**Rational(1, 3)
  104. mp = minimal_polynomial(p, x)
  105. assert mp == x**8 - 8*x**7 - 56*x**6 + 448*x**5 + 480*x**4 - 5056*x**3 + 1984*x**2 + 7424*x - 3008
  106. p = expand((1 + sqrt(2) - 2*sqrt(3) + sqrt(7))**3)
  107. mp = minimal_polynomial(p, x)
  108. assert mp == x**8 - 512*x**7 - 118208*x**6 + 31131136*x**5 + 647362560*x**4 - 56026611712*x**3 + 116994310144*x**2 + 404854931456*x - 27216576512
  109. assert minimal_polynomial(S("-sqrt(5)/2 - 1/2 + (-sqrt(5)/2 - 1/2)**2"), x) == x - 1
  110. a = 1 + sqrt(2)
  111. assert minimal_polynomial((a*sqrt(2) + a)**3, x) == x**2 - 198*x + 1
  112. p = 1/(1 + sqrt(2) + sqrt(3))
  113. assert minimal_polynomial(p, x, compose=False) == 8*x**4 - 16*x**3 + 4*x**2 + 4*x - 1
  114. p = 2/(1 + sqrt(2) + sqrt(3))
  115. assert minimal_polynomial(p, x, compose=False) == x**4 - 4*x**3 + 2*x**2 + 4*x - 2
  116. assert minimal_polynomial(1 + sqrt(2)*I, x, compose=False) == x**2 - 2*x + 3
  117. assert minimal_polynomial(1/(1 + sqrt(2)) + 1, x, compose=False) == x**2 - 2
  118. assert minimal_polynomial(sqrt(2)*I + I*(1 + sqrt(2)), x,
  119. compose=False) == x**4 + 18*x**2 + 49
  120. # minimal polynomial of I
  121. assert minimal_polynomial(I, x, domain=QQ.algebraic_field(I)) == x - I
  122. K = QQ.algebraic_field(I*(sqrt(2) + 1))
  123. assert minimal_polynomial(I, x, domain=K) == x - I
  124. assert minimal_polynomial(I, x, domain=QQ) == x**2 + 1
  125. assert minimal_polynomial(I, x, domain='QQ(y)') == x**2 + 1
  126. #issue 11553
  127. assert minimal_polynomial(GoldenRatio, x) == x**2 - x - 1
  128. assert minimal_polynomial(TribonacciConstant + 3, x) == x**3 - 10*x**2 + 32*x - 34
  129. assert minimal_polynomial(GoldenRatio, x, domain=QQ.algebraic_field(sqrt(5))) == \
  130. 2*x - sqrt(5) - 1
  131. assert minimal_polynomial(TribonacciConstant, x, domain=QQ.algebraic_field(cbrt(19 - 3*sqrt(33)))) == \
  132. 48*x - 19*(19 - 3*sqrt(33))**Rational(2, 3) - 3*sqrt(33)*(19 - 3*sqrt(33))**Rational(2, 3) \
  133. - 16*(19 - 3*sqrt(33))**Rational(1, 3) - 16
  134. # AlgebraicNumber with an alias.
  135. # Wester H24
  136. phi = AlgebraicNumber(S.GoldenRatio.expand(func=True), alias='phi')
  137. assert minimal_polynomial(phi, x) == x**2 - x - 1
  138. def test_minimal_polynomial_issue_19732():
  139. # https://github.com/sympy/sympy/issues/19732
  140. expr = (-280898097948878450887044002323982963174671632174995451265117559518123750720061943079105185551006003416773064305074191140286225850817291393988597615/(-488144716373031204149459129212782509078221364279079444636386844223983756114492222145074506571622290776245390771587888364089507840000000*sqrt(238368341569)*sqrt(S(11918417078450)/63568729
  141. - 24411360*sqrt(238368341569)/63568729) +
  142. 238326799225996604451373809274348704114327860564921529846705817404208077866956345381951726531296652901169111729944612727047670549086208000000*sqrt(S(11918417078450)/63568729
  143. - 24411360*sqrt(238368341569)/63568729)) -
  144. 180561807339168676696180573852937120123827201075968945871075967679148461189459480842956689723484024031016208588658753107/(-59358007109636562851035004992802812513575019937126272896569856090962677491318275291141463850327474176000000*sqrt(238368341569)*sqrt(S(11918417078450)/63568729
  145. - 24411360*sqrt(238368341569)/63568729) +
  146. 28980348180319251787320809875930301310576055074938369007463004788921613896002936637780993064387310446267596800000*sqrt(S(11918417078450)/63568729
  147. - 24411360*sqrt(238368341569)/63568729)))
  148. poly = (2151288870990266634727173620565483054187142169311153766675688628985237817262915166497766867289157986631135400926544697981091151416655364879773546003475813114962656742744975460025956167152918469472166170500512008351638710934022160294849059721218824490226159355197136265032810944357335461128949781377875451881300105989490353140886315677977149440000000000000000000000*x**4
  149. - 5773274155644072033773937864114266313663195672820501581692669271302387257492905909558846459600429795784309388968498783843631580008547382703258503404023153694528041873101120067477617592651525155101107144042679962433039557235772239171616433004024998230222455940044709064078962397144550855715640331680262171410099614469231080995436488414164502751395405398078353242072696360734131090111239998110773292915337556205692674790561090109440000000000000*x**2
  150. + 211295968822207088328287206509522887719741955693091053353263782924470627623790749534705683380138972642560898936171035770539616881000369889020398551821767092685775598633794696371561234818461806577723412581353857653829324364446419444210520602157621008010129702779407422072249192199762604318993590841636967747488049176548615614290254356975376588506729604345612047361483789518445332415765213187893207704958013682516462853001964919444736320672860140355089)
  151. assert minimal_polynomial(expr, x) == poly
  152. def test_minimal_polynomial_hi_prec():
  153. p = 1/sqrt(1 - 9*sqrt(2) + 7*sqrt(3) + Rational(1, 10)**30)
  154. mp = minimal_polynomial(p, x)
  155. # checked with Wolfram Alpha
  156. assert mp.coeff(x**6) == -1232000000000000000000000000001223999999999999999999999999999987999999999999999999999999999996000000000000000000000000000000
  157. def test_minimal_polynomial_sq():
  158. from sympy.core.add import Add
  159. from sympy.core.function import expand_multinomial
  160. p = expand_multinomial((1 + 5*sqrt(2) + 2*sqrt(3))**3)
  161. mp = minimal_polynomial(p**Rational(1, 3), x)
  162. assert mp == x**4 - 4*x**3 - 118*x**2 + 244*x + 1321
  163. p = expand_multinomial((1 + sqrt(2) - 2*sqrt(3) + sqrt(7))**3)
  164. mp = minimal_polynomial(p**Rational(1, 3), x)
  165. assert mp == x**8 - 8*x**7 - 56*x**6 + 448*x**5 + 480*x**4 - 5056*x**3 + 1984*x**2 + 7424*x - 3008
  166. p = Add(*[sqrt(i) for i in range(1, 12)])
  167. mp = minimal_polynomial(p, x)
  168. assert mp.subs({x: 0}) == -71965773323122507776
  169. def test_minpoly_compose():
  170. # issue 6868
  171. eq = S('''
  172. -1/(800*sqrt(-1/240 + 1/(18000*(-1/17280000 +
  173. sqrt(15)*I/28800000)**(1/3)) + 2*(-1/17280000 +
  174. sqrt(15)*I/28800000)**(1/3)))''')
  175. mp = minimal_polynomial(eq + 3, x)
  176. assert mp == 8000*x**2 - 48000*x + 71999
  177. # issue 5888
  178. assert minimal_polynomial(exp(I*pi/8), x) == x**8 + 1
  179. mp = minimal_polynomial(sin(pi/7) + sqrt(2), x)
  180. assert mp == 4096*x**12 - 63488*x**10 + 351488*x**8 - 826496*x**6 + \
  181. 770912*x**4 - 268432*x**2 + 28561
  182. mp = minimal_polynomial(cos(pi/7) + sqrt(2), x)
  183. assert mp == 64*x**6 - 64*x**5 - 432*x**4 + 304*x**3 + 712*x**2 - \
  184. 232*x - 239
  185. mp = minimal_polynomial(exp(I*pi/7) + sqrt(2), x)
  186. assert mp == x**12 - 2*x**11 - 9*x**10 + 16*x**9 + 43*x**8 - 70*x**7 - 97*x**6 + 126*x**5 + 211*x**4 - 212*x**3 - 37*x**2 + 142*x + 127
  187. mp = minimal_polynomial(sin(pi/7) + sqrt(2), x)
  188. assert mp == 4096*x**12 - 63488*x**10 + 351488*x**8 - 826496*x**6 + \
  189. 770912*x**4 - 268432*x**2 + 28561
  190. mp = minimal_polynomial(cos(pi/7) + sqrt(2), x)
  191. assert mp == 64*x**6 - 64*x**5 - 432*x**4 + 304*x**3 + 712*x**2 - \
  192. 232*x - 239
  193. mp = minimal_polynomial(exp(I*pi/7) + sqrt(2), x)
  194. assert mp == x**12 - 2*x**11 - 9*x**10 + 16*x**9 + 43*x**8 - 70*x**7 - 97*x**6 + 126*x**5 + 211*x**4 - 212*x**3 - 37*x**2 + 142*x + 127
  195. mp = minimal_polynomial(exp(I*pi*Rational(2, 7)), x)
  196. assert mp == x**6 + x**5 + x**4 + x**3 + x**2 + x + 1
  197. mp = minimal_polynomial(exp(I*pi*Rational(2, 15)), x)
  198. assert mp == x**8 - x**7 + x**5 - x**4 + x**3 - x + 1
  199. mp = minimal_polynomial(cos(pi*Rational(2, 7)), x)
  200. assert mp == 8*x**3 + 4*x**2 - 4*x - 1
  201. mp = minimal_polynomial(sin(pi*Rational(2, 7)), x)
  202. ex = (5*cos(pi*Rational(2, 7)) - 7)/(9*cos(pi/7) - 5*cos(pi*Rational(3, 7)))
  203. mp = minimal_polynomial(ex, x)
  204. assert mp == x**3 + 2*x**2 - x - 1
  205. assert minimal_polynomial(-1/(2*cos(pi/7)), x) == x**3 + 2*x**2 - x - 1
  206. assert minimal_polynomial(sin(pi*Rational(2, 15)), x) == \
  207. 256*x**8 - 448*x**6 + 224*x**4 - 32*x**2 + 1
  208. assert minimal_polynomial(sin(pi*Rational(5, 14)), x) == 8*x**3 - 4*x**2 - 4*x + 1
  209. assert minimal_polynomial(cos(pi/15), x) == 16*x**4 + 8*x**3 - 16*x**2 - 8*x + 1
  210. ex = rootof(x**3 +x*4 + 1, 0)
  211. mp = minimal_polynomial(ex, x)
  212. assert mp == x**3 + 4*x + 1
  213. mp = minimal_polynomial(ex + 1, x)
  214. assert mp == x**3 - 3*x**2 + 7*x - 4
  215. assert minimal_polynomial(exp(I*pi/3), x) == x**2 - x + 1
  216. assert minimal_polynomial(exp(I*pi/4), x) == x**4 + 1
  217. assert minimal_polynomial(exp(I*pi/6), x) == x**4 - x**2 + 1
  218. assert minimal_polynomial(exp(I*pi/9), x) == x**6 - x**3 + 1
  219. assert minimal_polynomial(exp(I*pi/10), x) == x**8 - x**6 + x**4 - x**2 + 1
  220. assert minimal_polynomial(sin(pi/9), x) == 64*x**6 - 96*x**4 + 36*x**2 - 3
  221. assert minimal_polynomial(sin(pi/11), x) == 1024*x**10 - 2816*x**8 + \
  222. 2816*x**6 - 1232*x**4 + 220*x**2 - 11
  223. assert minimal_polynomial(sin(pi/21), x) == 4096*x**12 - 11264*x**10 + \
  224. 11264*x**8 - 4992*x**6 + 960*x**4 - 64*x**2 + 1
  225. assert minimal_polynomial(cos(pi/9), x) == 8*x**3 - 6*x - 1
  226. ex = 2**Rational(1, 3)*exp(2*I*pi/3)
  227. assert minimal_polynomial(ex, x) == x**3 - 2
  228. raises(NotAlgebraic, lambda: minimal_polynomial(cos(pi*sqrt(2)), x))
  229. raises(NotAlgebraic, lambda: minimal_polynomial(sin(pi*sqrt(2)), x))
  230. raises(NotAlgebraic, lambda: minimal_polynomial(exp(1.618*I*pi), x))
  231. raises(NotAlgebraic, lambda: minimal_polynomial(exp(I*pi*sqrt(2)), x))
  232. # issue 5934
  233. ex = 1/(-36000 - 7200*sqrt(5) + (12*sqrt(10)*sqrt(sqrt(5) + 5) +
  234. 24*sqrt(10)*sqrt(-sqrt(5) + 5))**2) + 1
  235. raises(ZeroDivisionError, lambda: minimal_polynomial(ex, x))
  236. ex = sqrt(1 + 2**Rational(1,3)) + sqrt(1 + 2**Rational(1,4)) + sqrt(2)
  237. mp = minimal_polynomial(ex, x)
  238. assert degree(mp) == 48 and mp.subs({x:0}) == -16630256576
  239. ex = tan(pi/5, evaluate=False)
  240. mp = minimal_polynomial(ex, x)
  241. assert mp == x**4 - 10*x**2 + 5
  242. assert mp.subs(x, tan(pi/5)).is_zero
  243. ex = tan(pi/6, evaluate=False)
  244. mp = minimal_polynomial(ex, x)
  245. assert mp == 3*x**2 - 1
  246. assert mp.subs(x, tan(pi/6)).is_zero
  247. ex = tan(pi/10, evaluate=False)
  248. mp = minimal_polynomial(ex, x)
  249. assert mp == 5*x**4 - 10*x**2 + 1
  250. assert mp.subs(x, tan(pi/10)).is_zero
  251. raises(NotAlgebraic, lambda: minimal_polynomial(tan(pi*sqrt(2)), x))
  252. def test_minpoly_issue_7113():
  253. # see discussion in https://github.com/sympy/sympy/pull/2234
  254. from sympy.simplify.simplify import nsimplify
  255. r = nsimplify(pi, tolerance=0.000000001)
  256. mp = minimal_polynomial(r, x)
  257. assert mp == 1768292677839237920489538677417507171630859375*x**109 - \
  258. 2734577732179183863586489182929671773182898498218854181690460140337930774573792597743853652058046464
  259. def test_minpoly_issue_7574():
  260. ex = -(-1)**Rational(1, 3) + (-1)**Rational(2,3)
  261. assert minimal_polynomial(ex, x) == x + 1
  262. def test_choose_factor():
  263. # Test that this does not enter an infinite loop:
  264. bad_factors = [Poly(x-2, x), Poly(x+2, x)]
  265. raises(NotImplementedError, lambda: _choose_factor(bad_factors, x, sqrt(3)))
  266. def test_minpoly_fraction_field():
  267. assert minimal_polynomial(1/x, y) == -x*y + 1
  268. assert minimal_polynomial(1 / (x + 1), y) == (x + 1)*y - 1
  269. assert minimal_polynomial(sqrt(x), y) == y**2 - x
  270. assert minimal_polynomial(sqrt(x + 1), y) == y**2 - x - 1
  271. assert minimal_polynomial(sqrt(x) / x, y) == x*y**2 - 1
  272. assert minimal_polynomial(sqrt(2) * sqrt(x), y) == y**2 - 2 * x
  273. assert minimal_polynomial(sqrt(2) + sqrt(x), y) == \
  274. y**4 + (-2*x - 4)*y**2 + x**2 - 4*x + 4
  275. assert minimal_polynomial(x**Rational(1,3), y) == y**3 - x
  276. assert minimal_polynomial(x**Rational(1,3) + sqrt(x), y) == \
  277. y**6 - 3*x*y**4 - 2*x*y**3 + 3*x**2*y**2 - 6*x**2*y - x**3 + x**2
  278. assert minimal_polynomial(sqrt(x) / z, y) == z**2*y**2 - x
  279. assert minimal_polynomial(sqrt(x) / (z + 1), y) == (z**2 + 2*z + 1)*y**2 - x
  280. assert minimal_polynomial(1/x, y, polys=True) == Poly(-x*y + 1, y, domain='ZZ(x)')
  281. assert minimal_polynomial(1 / (x + 1), y, polys=True) == \
  282. Poly((x + 1)*y - 1, y, domain='ZZ(x)')
  283. assert minimal_polynomial(sqrt(x), y, polys=True) == Poly(y**2 - x, y, domain='ZZ(x)')
  284. assert minimal_polynomial(sqrt(x) / z, y, polys=True) == \
  285. Poly(z**2*y**2 - x, y, domain='ZZ(x, z)')
  286. # this is (sqrt(1 + x**3)/x).integrate(x).diff(x) - sqrt(1 + x**3)/x
  287. a = sqrt(x)/sqrt(1 + x**(-3)) - sqrt(x**3 + 1)/x + 1/(x**Rational(5, 2)* \
  288. (1 + x**(-3))**Rational(3, 2)) + 1/(x**Rational(11, 2)*(1 + x**(-3))**Rational(3, 2))
  289. assert minimal_polynomial(a, y) == y
  290. raises(NotAlgebraic, lambda: minimal_polynomial(exp(x), y))
  291. raises(GeneratorsError, lambda: minimal_polynomial(sqrt(x), x))
  292. raises(GeneratorsError, lambda: minimal_polynomial(sqrt(x) - y, x))
  293. raises(NotImplementedError, lambda: minimal_polynomial(sqrt(x), y, compose=False))
  294. @slow
  295. def test_minpoly_fraction_field_slow():
  296. assert minimal_polynomial(minimal_polynomial(sqrt(x**Rational(1,5) - 1),
  297. y).subs(y, sqrt(x**Rational(1,5) - 1)), z) == z
  298. def test_minpoly_domain():
  299. assert minimal_polynomial(sqrt(2), x, domain=QQ.algebraic_field(sqrt(2))) == \
  300. x - sqrt(2)
  301. assert minimal_polynomial(sqrt(8), x, domain=QQ.algebraic_field(sqrt(2))) == \
  302. x - 2*sqrt(2)
  303. assert minimal_polynomial(sqrt(Rational(3,2)), x,
  304. domain=QQ.algebraic_field(sqrt(2))) == 2*x**2 - 3
  305. raises(NotAlgebraic, lambda: minimal_polynomial(y, x, domain=QQ))
  306. def test_issue_14831():
  307. a = -2*sqrt(2)*sqrt(12*sqrt(2) + 17)
  308. assert minimal_polynomial(a, x) == x**2 + 16*x - 8
  309. e = (-3*sqrt(12*sqrt(2) + 17) + 12*sqrt(2) +
  310. 17 - 2*sqrt(2)*sqrt(12*sqrt(2) + 17))
  311. assert minimal_polynomial(e, x) == x
  312. def test_issue_18248():
  313. assert nonlinsolve([x*y**3-sqrt(2)/3, x*y**6-4/(9*(sqrt(3)))],x,y) == \
  314. FiniteSet((sqrt(3)/2, sqrt(6)/3), (sqrt(3)/2, -sqrt(6)/6 - sqrt(2)*I/2),
  315. (sqrt(3)/2, -sqrt(6)/6 + sqrt(2)*I/2))
  316. def test_issue_13230():
  317. c1 = Circle(Point2D(3, sqrt(5)), 5)
  318. c2 = Circle(Point2D(4, sqrt(7)), 6)
  319. assert intersection(c1, c2) == [Point2D(-1 + (-sqrt(7) + sqrt(5))*(-2*sqrt(7)/29
  320. + 9*sqrt(5)/29 + sqrt(196*sqrt(35) + 1941)/29), -2*sqrt(7)/29 + 9*sqrt(5)/29
  321. + sqrt(196*sqrt(35) + 1941)/29), Point2D(-1 + (-sqrt(7) + sqrt(5))*(-sqrt(196*sqrt(35)
  322. + 1941)/29 - 2*sqrt(7)/29 + 9*sqrt(5)/29), -sqrt(196*sqrt(35) + 1941)/29 - 2*sqrt(7)/29 + 9*sqrt(5)/29)]
  323. def test_issue_19760():
  324. e = 1/(sqrt(1 + sqrt(2)) - sqrt(2)*sqrt(1 + sqrt(2))) + 1
  325. mp_expected = x**4 - 4*x**3 + 4*x**2 - 2
  326. for comp in (True, False):
  327. mp = Poly(minimal_polynomial(e, compose=comp))
  328. assert mp(x) == mp_expected, "minimal_polynomial(e, compose=%s) = %s; %s expected" % (comp, mp(x), mp_expected)
  329. def test_issue_20163():
  330. assert apart(1/(x**6+1), extension=[sqrt(3), I]) == \
  331. (sqrt(3) + I)/(2*x + sqrt(3) + I)/6 + \
  332. (sqrt(3) - I)/(2*x + sqrt(3) - I)/6 - \
  333. (sqrt(3) - I)/(2*x - sqrt(3) + I)/6 - \
  334. (sqrt(3) + I)/(2*x - sqrt(3) - I)/6 + \
  335. I/(x + I)/6 - I/(x - I)/6
  336. def test_issue_22559():
  337. alpha = AlgebraicNumber(sqrt(2))
  338. assert minimal_polynomial(alpha**3, x) == x**2 - 8
  339. def test_issue_22561():
  340. a = AlgebraicNumber(sqrt(2) + sqrt(3), [S(1) / 2, 0, S(-9) / 2, 0], gen=x)
  341. assert a.as_expr() == sqrt(2)
  342. assert minimal_polynomial(a, x) == x**2 - 2
  343. assert minimal_polynomial(a**3, x) == x**2 - 8
  344. def test_separate_sq_not_impl():
  345. raises(NotImplementedError, lambda: _separate_sq(x**(S(1)/3) + x))
  346. def test_minpoly_op_algebraic_element_not_impl():
  347. raises(NotImplementedError,
  348. lambda: _minpoly_op_algebraic_element(Pow, sqrt(2), sqrt(3), x, QQ))
  349. def test_minpoly_groebner():
  350. assert _minpoly_groebner(S(2)/3, x, Poly) == 3*x - 2
  351. assert _minpoly_groebner(
  352. (sqrt(2) + 3)*(sqrt(2) + 1), x, Poly) == x**2 - 10*x - 7
  353. assert _minpoly_groebner((sqrt(2) + 3)**(S(1)/3)*(sqrt(2) + 1)**(S(1)/3),
  354. x, Poly) == x**6 - 10*x**3 - 7
  355. assert _minpoly_groebner((sqrt(2) + 3)**(-S(1)/3)*(sqrt(2) + 1)**(S(1)/3),
  356. x, Poly) == 7*x**6 - 2*x**3 - 1
  357. raises(NotAlgebraic, lambda: _minpoly_groebner(pi**2, x, Poly))