test_minpoly.py 22 KB

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