test_minpoly.py 23 KB

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