§
    OŠtj�l  ã                   ó4  — d Z ddlmZ ddlmZ ddlmZ ddlmZm	Z	m
Z
 ddlmZ ddlmZmZmZmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZmZ ddlm Z m!Z!m"Z" ddl#m$Z$ ddl%m&Z& ddl'm(Z(m)Z)m*Z* ddl+m,Z, ddl-m.Z.m/Z/ ddl0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z: ddl;m<Z<m=Z= ddl>m?Z? ddl@mAZA ddlBmCZC ddlDmEZE ddlFmGZGmHZHmIZI e)ddfd„ZJd„ ZKd„ ZLd „ ZMd3d"„ZNd#„ ZOd$„ ZPd4d%„ZQd&„ ZRd'„ ZSd(„ ZTd)„ ZUd*„ ZVd+„ ZWd,„ ZXd-„ ZYeHd5d0„¦   «         ZZd1„ Z[eHd5d2„¦   «         Z\d!S )6z*Minimal polynomials for algebraic numbers.é    )Úreduce)ÚAdd)ÚFactors)Ú
expand_mulÚexpand_multinomialÚ_mexpand)ÚMul)ÚIÚRationalÚpiÚ_illegal)ÚS)ÚDummy)Úsympify)Úpreorder_traversal)Úexp)ÚsqrtÚcbrt)ÚcosÚsinÚtan)Údivisors)Úsubsets)ÚZZÚQQÚFractionField)Údup_chebyshevt)ÚNotAlgebraicÚGeneratorsError)
ÚPolyÚPurePolyÚinvertÚfactor_listÚgroebnerÚ	resultantÚdegreeÚpoly_from_exprÚparallel_poly_from_exprÚlcm)Údict_from_exprÚexpr_from_dict)Úrs_compose_add)Úring)ÚCRootOf©Úcyclotomic_poly)Únumbered_symbolsÚpublicÚsiftéÈ   é   c                 óÂ  ‡‡‡‡‡— t          | d         t          ¦  «        rd„ | D ¦   «         } t          | ¦  «        dk    r| d         S dŠi Št          |d¦  «        r|j        ng }‰‰k    räˆˆfd„| D ¦   «         }‰j        rˆfd„|D ¦   «         }t          t          |¦  «        t          |¦  «        d¬	¦  «        D ]ˆ}t          ||¦  «        D ]
\  }	}
|
‰|	<   Œˆˆfd
„t          |¦  «        D ¦   «         }t          d„ |D ¦   «         ¦  «        rŒSt          |¦  «        }|dd…         \  \  }}\  }}||dz  k    r
| |         c S Œ‰‰dz  Š‰‰k    °ät          d‰z  ¦  «        ‚)ze
    Return a factor having root ``v``
    It is assumed that one of the factors has root ``v``.
    r   c                 ó   — g | ]
}|d          ‘ŒS )r   © )Ú.0Úfs     ú^/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/sympy/polys/numberfields/minpoly.pyú
<listcomp>z"_choose_factor.<locals>.<listcomp>/   s   € Ð)Ð)Ð)˜A�1�Q”4Ð)Ð)Ð)ó    é   é
   Úsymbolsc                 ób   •— g | ]+}|                      ¦   «                              ‰‰i¦  «        ‘Œ,S r8   )Úas_exprÚxreplace)r9   r:   ÚvÚxs     €€r;   r<   z"_choose_factor.<locals>.<listcomp>9   s3   ø€ Ð;Ð;Ð;¨aˆa�iŠi‰kŒk×"Ò" A a 5Ñ)Ô)Ð;Ð;Ð;r=   c                 ó:   •— g | ]}|                      ‰¦  «        ‘ŒS r8   )Ún)r9   r:   Úprecs     €r;   r<   z"_choose_factor.<locals>.<listcomp>;   s#   ø€ Ð(Ð(Ð( �!—#’#�d‘)”)Ð(Ð(Ð(r=   T)ÚkÚ
repetitionc                 ó„   •— g | ]<\  }}t          |                     ‰¦  «                             ‰¦  «        ¦  «        |f‘Œ=S r8   )ÚabsÚsubsrG   )r9   Úir:   ÚpointsÚprec1s      €€r;   r<   z"_choose_factor.<locals>.<listcomp>C   sR   ø€ ð *ð *ð *Ù�A�aõ ˜qŸvšv f™~œ~×/Ò/°Ñ6Ô6Ñ7Ô7¸Ð;ð *ð *ð *r=   c              3   ó.   K  — | ]\  }}|t           v V — Œd S ©N)r   )r9   rN   Ú_s      r;   ú	<genexpr>z!_choose_factor.<locals>.<genexpr>H   s*   è è € Ð8Ð8¡T Q¨�1��=Ð8Ð8Ð8Ð8Ð8Ð8r=   Né   i@B z4multiple candidates for the minimal polynomial of %s)Ú
isinstanceÚtupleÚlenÚhasattrr@   Ú	is_numberr   ÚrangeÚzipÚ	enumerateÚanyÚsortedÚNotImplementedError)ÚfactorsrE   rD   ÚdomrH   Úboundr@   ÚferG   ÚsrN   Ú
candidatesÚcanÚaÚixÚbrS   rO   rP   s    `` `            @@r;   Ú_choose_factorrk   (   sÛ  øøøøø€ õ �'˜!”*�eÑ$Ô$ð *Ø)Ð) Ð)Ñ)Ô)ˆÝ
ˆ7�|„|�qÒÐØ�qŒzÐà€EØ€FÝ$ S¨)Ñ4Ô4Ð<ˆcŒkˆk¸"€GØ
�4Š-ˆ-ð <Ð;Ð;Ð;Ð;°7Ð;Ñ;Ô;ˆØŒ;ð 	)Ø(Ð(Ð(Ð( RÐ(Ñ(Ô(ˆBõ �˜u™œ­¨W©¬À$ÐGÑGÔGð 	#ð 	#ˆAÝ˜G Q™œð ð ‘��1Ø��q‘	�	ð*ð *ð *ð *ð *Ý$ R™=œ=ð*ñ *ô *ˆJõ
 Ð8Ð8¨ZÐ8Ñ8Ô8Ñ8Ô8ð Øõ
 ˜Ñ$Ô$ˆCØ! " 1 "œg‰O‰GˆQ�‘V�a˜Ø�1�u‘9Š}ˆ}Ø˜r”{Ð"Ð"Ð"ð ð 	�‰
ˆð; �4Š-ˆ-õ> ÐTÐWXÑXÑ
YÔ
YÐYr=   c                 óX   — t          d„ t          j        | ¦  «        D ¦   «         ¦  «        S )Nc              3   ó¤   K  — | ]K}t          j        |¦  «        D ]4}|j        p(|j        o!|j        j        od |j        z  j        o|j        V — Œ5ŒLdS )rU   N)r	   Ú	make_argsÚis_RationalÚis_PowÚbaser   Ú
is_IntegerÚis_extended_real)r9   Útr:   s      r;   rT   z _is_sum_surds.<locals>.<genexpr>Y   sŒ   è è € ð =ð =à­3¬=¸Ñ+;Ô+;ð=ð =à&'ð Œ}ð K ¤ð !KØ	ŒÔð!KØ ! !¤%¡Ô3ð!KØ89Ô8Jð=ð =ð =ð =ð =ð =ð =r=   )Úallr   rn   )Úps    r;   Ú_is_sum_surdsrw   X   s:   € Ýð =ð =å”˜qÑ!Ô!ð=ñ =ô =ñ =ô =ð =r=   c                 ó
  — d„ }g }| j         D ]à}|j        s• ||¦  «        r%|                     t          j        |dz  f¦  «         Œ9|j        r"|                     |t          j        f¦  «         Œb|j        r.|j        j        r"|                     |t          j        f¦  «         Œ—t          ‚t          |j         |d¬¦  «        \  }}|                     t          |Ž t          |Ž dz  f¦  «         Œá|                     d„ ¬¦  «         |d         d         t          j        u r| S d	„ |D ¦   «         }t          t          |¦  «        ¦  «        D ]}||         dk    r nŒd
dlm}  |||d…         Ž \  }	}
}g }g }|D ]T\  }}||
v r&|                     ||t          j        z  z  ¦  «         Œ/|                     ||t          j        z  z  ¦  «         ŒUt%          |Ž }t%          |Ž }t'          |dz  ¦  «        t'          |dz  ¦  «        z
  } | S )a?  
    helper function for ``_minimal_polynomial_sq``

    It selects a rational ``g`` such that the polynomial ``p``
    consists of a sum of terms whose surds squared have gcd equal to ``g``
    and a sum of terms with surds squared prime with ``g``;
    then it takes the field norm to eliminate ``sqrt(g)``

    See simplify.simplify.split_surds and polytools.sqf_norm.

    Examples
    ========

    >>> from sympy import sqrt
    >>> from sympy.abc import x
    >>> from sympy.polys.numberfields.minpoly import _separate_sq
    >>> p= -x + sqrt(2) + sqrt(3) + sqrt(7)
    >>> p = _separate_sq(p); p
    -x**2 + 2*sqrt(3)*x + 2*sqrt(7)*x - 2*sqrt(21) - 8
    >>> p = _separate_sq(p); p
    -x**4 + 4*sqrt(7)*x**3 - 32*x**2 + 8*sqrt(7)*x + 20
    >>> p = _separate_sq(p); p
    -x**8 + 48*x**6 - 536*x**4 + 1728*x**2 - 400

    c                 ó6   — | j         o| j        t          j        u S rR   )rp   r   r   ÚHalf)Úexprs    r;   Úis_sqrtz_separate_sq.<locals>.is_sqrtx   s   € ØŒ{Ð1˜tœx­1¬6Ð1Ð1r=   rU   T)Úbinaryc                 ó   — | d         S )Nr>   r8   )Úzs    r;   ú<lambda>z_separate_sq.<locals>.<lambda>‰   s
   € ˜˜1œ€ r=   )Úkeyéÿÿÿÿr>   c                 ó   — g | ]\  }}|‘ŒS r8   r8   )r9   Úyr   s      r;   r<   z _separate_sq.<locals>.<listcomp>�   s   € ÐÐÐ‘4�1�aˆQÐÐÐr=   r   )Ú
_split_gcdN)ÚargsÚis_MulÚappendr   ÚOneÚis_Atomrp   r   Ú
is_integerr`   r3   r	   Úsortr[   rX   Úsympy.simplify.radsimpr…   rz   r   r   )rv   r|   rh   r„   ÚTÚFÚsurdsrN   r…   ÚgÚb1Úb2Úa1Úa2r   Úp1Úp2s                    r;   Ú_separate_sqr˜   ^   s:  € ð42ð 2ð 2ð 	€AØŒVð ,ð ,ˆØŒxð 	,Øˆw�q‰zŒzð *Ø—’�!œ%  A¡˜Ñ'Ô'Ð'Ð'Ø”ð *Ø—’˜!�QœU˜Ñ$Ô$Ð$Ð$Ø”ð *˜aœeÔ.ð *Ø—’˜!�QœU˜Ñ$Ô$Ð$Ð$å)Ð)å˜œ °Ð5Ñ5Ô5‰DˆAˆqØ�HŠH•c˜1�g�s A˜w¨™zÐ*Ñ+Ô+Ð+Ð+Ø‡F‚Fˆ~ˆ~€FÑÔÐØˆ„uˆQ„x•1”5ÐÐàˆØÐ˜1ÐÑÔ€EÝ•3�u‘:”:ÑÔð ð ˆØ�Œ8�qŠ=ˆ=ØˆEð à1Ð1Ð1Ð1Ð1Ð1Ø�
˜E ! " "œIÐ&�I€A€rˆ2Ø	€BØ	€BØð #ð #‰ˆˆ1Ø�ˆ7ˆ7Ø�IŠI�a˜�1œ6™	‘kÑ"Ô"Ð"Ð"à�IŠI�a˜�1œ6™	‘kÑ"Ô"Ð"Ð"Ý	ˆbˆ€BÝ	ˆbˆ€BÝ��Q‘‰Œ�( 2 q¡5™/œ/Ñ)€AØ€Hr=   c                 ó$  — t          | ¦  «        } t          |¦  «        }|j        r|dk    rt          | ¦  «        sdS | t          d|¦  «        z  }| |z  } 	 t	          | ¦  «        }|| u r|                     |||z  i¦  «        } n|} Œ1|dk    r]t          | ¦  «        }|                      ||                     |¦  «        z  ¦  «        dk     r|  } |  	                    ¦   «         d         } | S t          | ¦  «        d         }t          |||¦  «        }|S )a  
    Returns the minimal polynomial for the ``nth-root`` of a sum of surds
    or ``None`` if it fails.

    Parameters
    ==========

    p : sum of surds
    n : positive integer
    x : variable of the returned polynomial

    Examples
    ========

    >>> from sympy.polys.numberfields.minpoly import _minimal_polynomial_sq
    >>> from sympy import sqrt
    >>> from sympy.abc import x
    >>> q = 1 + sqrt(2) + sqrt(3)
    >>> _minimal_polynomial_sq(q, 3, x)
    x**12 - 4*x**9 - 4*x**6 + 16*x**3 - 8

    r   Nr>   )r   rr   rw   r   r˜   rM   r    Úcoeffr&   Ú	primitiver#   rk   )rv   rG   rE   Úpnr–   ra   Úresults          r;   Ú_minimal_polynomial_sqrž   Ÿ   s  € õ. 	�‰
Œ
€AÝ�‰
Œ
€AØŒ<ð ˜q 1šu˜u­M¸!Ñ,<Ô,<˜uØˆtØ	
�H�Q˜‰NŒNÑ	€Bàˆ�F€AðÝ˜!‰_Œ_ˆØ�ˆ7ˆ7Ø—’˜˜1˜a™4˜Ñ!Ô!ˆAØàˆAðð 	ˆA‚v€vÝ�!‰WŒWˆØ�7Š7�1�b—i’i ‘l”l‘?Ñ#Ô# aÒ'Ð'Ø�ˆAØ�KŠK‰MŒM˜!ÔˆØˆõ ˜!‰nŒn˜QÔ€Gå˜G Q¨Ñ+Ô+€FØ€Mr=   Nc                 ó>  — t          t          |¦  «        ¦  «        }|€t          |||¦  «        }|€t          |||¦  «        }n|                     ||i¦  «        }| t          u r¦|t
          k    rUt          dt
          ¦  «        \  }}	 |t          |¦  «        d         ¦  «        }
 |t          |¦  «        d         ¦  «        }npt          |||z
  f||¦  «        \  \  }
}}|
 	                    |¦  «        }| 
                    ¦   «         }n*| t          u rt          |||¦  «        }nt          d¦  «        ‚| t          u s|t
          k    rt          ||||g¬¦  «        }n2t          |
|¦  «        }t!          |                     ¦   «         |¦  «        }t%          ||¦  «        }t%          ||¦  «        }| t          u r|dk    s|dk    r|S t'          |||¬¦  «        }|                     ¦   «         \  }}t+          || | ||¦  «        |¦  «        }| 
                    ¦   «         S )aÜ  
    return the minimal polynomial for ``op(ex1, ex2)``

    Parameters
    ==========

    op : operation ``Add`` or ``Mul``
    ex1, ex2 : expressions for the algebraic elements
    x : indeterminate of the polynomials
    dom: ground domain
    mp1, mp2 : minimal polynomials for ``ex1`` and ``ex2`` or None

    Examples
    ========

    >>> from sympy import sqrt, Add, Mul, QQ
    >>> from sympy.polys.numberfields.minpoly import _minpoly_op_algebraic_element
    >>> from sympy.abc import x, y
    >>> p1 = sqrt(sqrt(2) + 1)
    >>> p2 = sqrt(sqrt(2) - 1)
    >>> _minpoly_op_algebraic_element(Mul, p1, p2, x, QQ)
    x - 1
    >>> q1 = sqrt(y)
    >>> q2 = 1 / y
    >>> _minpoly_op_algebraic_element(Add, q1, q2, x, QQ.frac_field(y))
    x**2*y**2 - 2*x*y - y**3 + 1

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Resultant
    .. [2] I.M. Isaacs, Proc. Amer. Math. Soc. 25 (1970), 638
           "Degrees of sums in a separable field extension".

    NÚXr   zoption not available©Úgensr>   ©Údomain)r   ÚstrÚ_minpoly_composerM   r   r   r-   r*   r(   ÚcomposerB   r	   Ú_mulyr`   r%   r,   r+   Úas_expr_dictr&   r    r#   rk   )ÚopÚex1Úex2rE   rb   Úmp1Úmp2r„   ÚRr    r–   r—   rS   ÚrÚmp1aÚdeg1Údeg2ra   Úress                      r;   Ú_minpoly_op_algebraic_elementrµ   Õ   sý  € õH 	�c�!‰fŒf‰Œ€AØ
€{Ý˜s A sÑ+Ô+ˆØ
€{Ý˜s A sÑ+Ô+ˆˆà�hŠh˜˜1�vÑÔˆà	�S€y€yà•"Š9ˆ9Ý˜�R‘=”=‰DˆAˆqØ�•> #Ñ&Ô& qÔ)Ñ*Ô*ˆBØ�•> #Ñ&Ô& qÔ)Ñ*Ô*ˆBˆBå1°3¸¸A¹°,ÀÀ1ÑEÔE‰K‰HˆR��aØ—
’
˜2‘”ˆAØ—9’9‘;”;ˆDˆDà	�sˆˆÝ�S˜!˜QÑÔˆˆå!Ð"8Ñ9Ô9Ð9à	�S€y€y�C�2’I�IÝ�d˜C q¨! fÐ-Ñ-Ô-ˆˆå˜2˜rÑ"Ô"ˆÝ˜1Ÿ>š>Ñ+Ô+¨QÑ/Ô/ˆå�#�q‰>Œ>€DÝ�#�q‰>Œ>€DØ	�S€y€y�T˜Q’Y�Y $¨!¢) )ð ˆåˆQ�˜#ÐÑÔ€AØ—’‘”�J€A€wÝ
˜ ! R R¨¨S¡\¤\°3Ñ
7Ô
7€CØ�;Š;‰=Œ=Ðr=   c                 ó¤   ‡‡— t          | ‰¦  «        d         }t          |¦  «        Šˆˆfd„|                     ¦   «         D ¦   «         }t          |Ž S )z@
    Returns ``expand_mul(x**degree(p, x)*p.subs(x, 1/x))``
    r   c                 ó0   •— g | ]\  \  }}|‰‰|z
  z  z  ‘ŒS r8   r8   )r9   rN   ÚcrG   rE   s      €€r;   r<   z_invertx.<locals>.<listcomp>+  s+   ø€ Ð2Ð2Ð2™G™D˜Q !ˆˆQ��Q‘‰Z‰Ð2Ð2Ð2r=   ©r'   r&   Útermsr   )rv   rE   r–   rh   rG   s    `  @r;   Ú_invertxr»   $  sR   øø€ õ 
˜˜1Ñ	Ô	˜aÔ	 €Båˆr‰
Œ
€AØ2Ð2Ð2Ð2Ð2 r§x¢x¡z¤zÐ2Ñ2Ô2€AÝ�ˆ7€Nr=   c                 ó¨   ‡‡‡— t          | ‰¦  «        d         }t          |¦  «        Šˆˆˆfd„|                     ¦   «         D ¦   «         }t          |Ž S )z8
    Returns ``_mexpand(y**deg*p.subs({x:x / y}))``
    r   c                 ó<   •— g | ]\  \  }}|‰|z  z  ‰‰|z
  z  z  ‘ŒS r8   r8   )r9   rN   r¸   rG   rE   r„   s      €€€r;   r<   z_muly.<locals>.<listcomp>6  s4   ø€ Ð9Ð9Ð9¡7¡4 A¨ˆˆQ�‰T‰�A˜˜A™‘JÑ	Ð9Ð9Ð9r=   r¹   )rv   rE   r„   r–   rh   rG   s    ``  @r;   r¨   r¨   /  sV   øøø€ õ 
˜˜1Ñ	Ô	˜aÔ	 €Båˆr‰
Œ
€AØ9Ð9Ð9Ð9Ð9Ð9¨b¯hªh©j¬jÐ9Ñ9Ô9€AÝ�ˆ7€Nr=   c                 ó`  — t          |¦  «        }|st          | ||¦  «        }|j        st          d| z  ¦  «        ‚|dk     r8||k    rt	          d| z  ¦  «        ‚t          ||¦  «        }|dk    r|S | }d| z  } t          t          |¦  «        ¦  «        }|                     ||i¦  «        }| 	                    ¦   «         \  }}t          t          |||z  ||z  z
  |g¬¦  «        ||¬¦  «        }|                     ¦   «         \  }	}
t          |
|| |z  |¦  «        }|                     ¦   «         S )a”  
    Returns ``minpoly(ex**pw, x)``

    Parameters
    ==========

    ex : algebraic element
    pw : rational number
    x : indeterminate of the polynomial
    dom: ground domain
    mp : minimal polynomial of ``p``

    Examples
    ========

    >>> from sympy import sqrt, QQ, Rational
    >>> from sympy.polys.numberfields.minpoly import _minpoly_pow, minpoly
    >>> from sympy.abc import x, y
    >>> p = sqrt(1 + sqrt(2))
    >>> _minpoly_pow(p, 2, x, QQ)
    x**2 - 2*x - 1
    >>> minpoly(p**2, x)
    x**2 - 2*x - 1
    >>> _minpoly_pow(y, Rational(1, 3), x, QQ.frac_field(y))
    x**3 - y
    >>> minpoly(y**Rational(1, 3), x)
    x**3 - y

    ú+%s does not seem to be an algebraic elementr   z
%s is zeror‚   r>   r¡   r£   )r   r¦   Úis_rationalr   ÚZeroDivisionErrorr»   r   r¥   rM   Úas_numer_denomr    r%   r#   rk   rB   )ÚexÚpwrE   rb   Úmpr„   rG   Údr´   rS   ra   s              r;   Ú_minpoly_powrÇ   :  s9  € õ< 
�‰Œ€BØð *Ý˜b ! SÑ)Ô)ˆØŒ>ð OÝÐHÈ2ÑMÑNÔNÐNØ	ˆA‚v€vØ�Š7ˆ7Ý# L°2Ñ$5Ñ6Ô6Ð6Ý�b˜!‰_Œ_ˆØ�Š8ˆ8ØˆIØˆSˆØˆr‰Tˆå�c�!‰fŒf‰Œ€AØ	�Š�!�Q�‰Œ€BØ×ÒÑÔ�D€A€qÝ
�y˜˜Q ™T A q¡D™[°¨sÐ3Ñ3Ô3°Q¸sÐ
CÑ
CÔ
C€CØ—’Ñ"Ô"�J€A€wÝ
˜ ! R¨¡V¨SÑ
1Ô
1€CØ�;Š;‰=Œ=Ðr=   c           	      óÈ   — t          t          |d         |d         | |¦  «        }|d         |d         z   }|dd…         D ]!}t          t          ||| ||¬¦  «        }||z   }Œ"|S )z.
    returns ``minpoly(Add(*a), dom, x)``
    r   r>   rU   N©r­   )rµ   r   ©rE   rb   rh   rÅ   rv   Úpxs         r;   Ú_minpoly_addrÌ   o  ós   € õ 
'¥s¨A¨a¬D°!°A´$¸¸3Ñ	?Ô	?€BØ	ˆ!Œˆq�Œt‰€AØ���Œeð ð ˆÝ*­3°°2°q¸#À2ÐFÑFÔFˆØ�‰FˆˆØ€Ir=   c           	      óÈ   — t          t          |d         |d         | |¦  «        }|d         |d         z  }|dd…         D ]!}t          t          ||| ||¬¦  «        }||z  }Œ"|S )z.
    returns ``minpoly(Mul(*a), dom, x)``
    r   r>   rU   NrÉ   )rµ   r	   rÊ   s         r;   Ú_minpoly_mulrÏ   {  rÍ   r=   c                 óþ  ‡‡	‡
— | j         d                              ¦   «         \  }Š	‰	t          u �r=|j        �r5|j        Š
t          ‰
¦  «        }|j        r9t          ‰
t          ¦  «        Š	t          ˆ	ˆ
ˆfd„t          ‰
¦  «        D ¦   «         Ž S |j        dk    r#|dk    rd‰dz  z  d‰dz  z  z
  d	‰d
z  z  z   dz
  S ‰
d
z  dk    rct          ‰
t          ¦  «        Š	ˆ	ˆ
ˆfd„t          ‰
dz   ¦  «        D ¦   «         Š	t          ‰	Ž }t          |¦  «        \  }}t          |‰| ¦  «        }|S dt          d
|z  t          z  ¦  «        z
  d
z  t          j        z  }t#          |‰t$          ¦  «        }|S t'          d| z  ¦  «        ‚)zu
    Returns the minimal polynomial of ``sin(ex)``
    see https://mathworld.wolfram.com/TrigonometryAngles.html
    r   c                 ó8   •— g | ]}‰‰|z
  d z
  z  ‰|         z  ‘ŒS )r>   r8   ©r9   rN   rh   rG   rE   s     €€€r;   r<   z _minpoly_sin.<locals>.<listcomp>–  s.   ø€ ÐCÐCÐC°Q˜Q  Q¡¨¡™^¨A¨a¬DÑ0ÐCÐCÐCr=   r>   é	   é@   é   é`   é   é$   rU   é   c                 ó2   •— g | ]}‰‰|z
  z  ‰|         z  ‘ŒS r8   r8   rÒ   s     €€€r;   r<   z _minpoly_sin.<locals>.<listcomp>   s)   ø€ Ð;Ð;Ð;¨�Q˜˜Q™‘Z  !¤‘_Ð;Ð;Ð;r=   r¿   )r†   Úas_coeff_Mulr   rÀ   Úqr   Úis_primer   r   r   r[   rv   r#   rk   r   r   rz   r¦   r   r   )rÃ   rE   r¸   rÜ   r°   rS   ra   r´   r{   rh   rG   s    `       @@r;   Ú_minpoly_sinrÞ   ‡  s’  øøø€ ð
 Œ7�1Œ:×"Ò"Ñ$Ô$�D€A€qØ�B€w�wØŒ=ñ 	Ø”ˆAÝ˜‘
”
ˆAØŒzð Eõ # 1¥bÑ)Ô)�ÝÐCÐCÐCÐCÐCÐC½%À¹(¼(ÐCÑCÔCÐDÐDØŒs�aŠxˆxØ˜’6�6Ø˜a ™d™7 R¨¨1©¡WÑ,¨r°!°Q±$©wÑ6¸Ñ:Ð:à�1‰u˜Šzˆzõ # 1¥bÑ)Ô)�Ø;Ð;Ð;Ð;Ð;Ð;­e°A¸±E©l¬lÐ;Ñ;Ô;�Ý˜�G�Ý(¨™^œ^‘
��7Ý$ W¨a°Ñ4Ô4�Ø�
à�˜Q˜q™S¥™V™œ‘_ aÑ'­!¬&Ñ0ˆDÝ" 4¨­BÑ/Ô/ˆCØˆJå
ÐDÀrÑIÑ
JÔ
JÐJr=   c           	      ó  ‡‡	‡
— | j         d                              ¦   «         \  }Š	‰	t          u �rD|j        �r<|j        dk    rB|j        dk    rd‰dz  z  d‰dz  z  z
  d‰z  z
  dz   S |j        dk    rd‰dz  z  d	‰z  z
  dz
  S nm|j        dk    rbt          |j        ¦  «        }|j        rGt          | ‰¦  «        }t          | 
                    ‰t          d‰z
  dz  ¦  «        i¦  «        ¦  «        S t          |j        ¦  «        Š
t          ‰
t          ¦  «        Š	ˆ	ˆ
ˆfd
„t          ‰
dz   ¦  «        D ¦   «         Š	t!          ‰	Ž d|j        z  z
  }t#          |¦  «        \  }}t%          |‰| ¦  «        }|S t'          d| z  ¦  «        ‚)zu
    Returns the minimal polynomial of ``cos(ex)``
    see https://mathworld.wolfram.com/TrigonometryAngles.html
    r   r>   é   é   rÙ   r×   rU   rÓ   rÕ   c                 ó2   •— g | ]}‰‰|z
  z  ‰|         z  ‘ŒS r8   r8   rÒ   s     €€€r;   r<   z _minpoly_cos.<locals>.<listcomp>Ã  s)   ø€ Ð7Ð7Ð7 Q��Q˜‘U‘˜A˜aœD‘Ð7Ð7Ð7r=   r‚   r¿   )r†   rÛ   r   rÀ   rv   rÜ   r   rÝ   rÞ   r   rM   r   Úintr   r   r[   r   r#   rk   r   )rÃ   rE   r¸   rÜ   re   r°   rS   ra   r´   rh   rG   s    `       @@r;   Ú_minpoly_cosrä   ­  s‘  øøø€ ð
 Œ7�1Œ:×"Ò"Ñ$Ô$�D€A€qØ�B€w�wØŒ=ñ 	ØŒs�aŠxˆxØ”3˜!’8�8Ø˜Q ™T™6 A a¨¡d¡F™?¨Q¨q©SÑ0°1Ñ4Ð4Ø”3˜!’8�8Ø˜Q ™T™6 A a¡C™<¨!Ñ+Ð+ð à”˜’�Ý˜AœC‘L”L�Ø”:ð AÝ$ R¨Ñ+Ô+�AÝ# A§F¢F¨A­d°A¸±E¸1±9©o¬oÐ+>Ñ$?Ô$?Ñ@Ô@Ð@õ �A”C‘”ˆAÝ˜q¥"Ñ%Ô%ˆAØ7Ð7Ð7Ð7Ð7Ð7­%°°A±©,¬,Ð7Ñ7Ô7ˆAÝ�Q�˜2 ¤™)Ñ#ˆAÝ$ Q™œ‰JˆAˆwÝ  ¨!¨RÑ0Ô0ˆCØˆJå
ÐDÀrÑIÑ
JÔ
JÐJr=   c                 óö  — | j         d                              ¦   «         \  }}|t          u r½|j        r¶|dz  }t	          |j        ¦  «        }|j        dz  dk    r|nd}g }t          |j        dz   dz  |dz   d¦  «        D ];}|                     |||z  z  ¦  «         |||z
  dz
  z  ||z
  z   |dz   |dz   z  z  }Œ<t          |Ž }t          |¦  «        \  }}	t          |	|| ¦  «        }
|
S t          d| z  ¦  «        ‚)zk
    Returns the minimal polynomial of ``tan(ex)``
    see https://github.com/sympy/sympy/issues/21430
    r   rU   r>   r¿   )r†   rÛ   r   rÀ   rã   rÜ   rv   r[   rˆ   r   r#   rk   r   )rÃ   rE   r¸   rh   rG   rº   rI   r°   rS   ra   r´   s              r;   Ú_minpoly_tanræ   Ì  s  € ð
 Œ7�1Œ:×"Ò"Ñ$Ô$�D€A€qØ�B€w€wØŒ=ð 	Ø�A‘ˆAÝ�A”C‘”ˆAØ”S˜1‘W ’\�\�� qˆAØˆEÝ˜AœC ™E 1™9 a¨¡c¨1Ñ-Ô-ð 8ð 8�Ø—’˜Q˜q !™t™VÑ$Ô$Ð$Ø˜˜1™˜Q™‘i  1¡‘oÐ&¨A¨a©C°!°A±#©;Ñ7��å�U�ˆAÝ$ Q™œ‰JˆAˆwÝ  ¨!¨RÑ0Ô0ˆCØˆJå
ÐDÀrÑIÑ
JÔ
JÐJr=   c                 ó²  ‡— | j         d                              ¦   «         \  }}|t          t          z  k    �r|j        röt          |j        ¦  «        }|j        dk    s|j        dk    r›|dk    r‰dz  ‰z
  dz   S |dk    r‰dz  dz   S |dk    r‰dz  ‰dz  z
  dz   S |dk    r‰dz  dz   S |d	k    r‰dz  ‰dz  z
  dz   S |d
k    r‰dz  ‰dz  z
  ‰dz  z   ‰dz  z
  dz   S |j        rd}t          |¦  «        D ]}|‰ |z  z  }Œ|S ˆfd„t          d|z  ¦  «        D ¦   «         }t          |‰| ¦  «        }|S t          d| z  ¦  «        ‚t          d| z  ¦  «        ‚)z7
    Returns the minimal polynomial of ``exp(ex)``
    r   r>   r‚   rÙ   rU   r×   rÕ   rá   rÓ   r?   c                 ó0   •— g | ]}t          |‰¦  «        ‘ŒS r8   r/   )r9   rN   rE   s     €r;   r<   z _minpoly_exp.<locals>.<listcomp>   s#   ø€ ÐDÐDÐD°• q¨!Ñ,Ô,ÐDÐDÐDr=   r¿   )r†   rÛ   r
   r   rÀ   r   rÜ   rv   rÝ   r[   r   rk   r   )	rÃ   rE   r¸   rh   rÜ   re   rN   ra   rÅ   s	    `       r;   Ú_minpoly_expré   ä  s¯  ø€ ð Œ7�1Œ:×"Ò"Ñ$Ô$�D€A€qØ�A�b‰D‚y�yØŒ=ð 	SÝ˜œ‘”ˆAØŒs�aŠxˆx˜1œ3 "š9˜9Ø˜’6�6Ø˜a™4 !™8 a™<Ð'Ø˜’6�6Ø˜a™4 !™8�OØ˜’6�6Ø˜a™4 ! Q¡$™;¨™?Ð*Ø˜’6�6Ø˜a™4 !™8�OØ˜’6�6Ø˜a™4 ! Q¡$™;¨™?Ð*Ø˜’7�7Ø˜a™4 ! Q¡$™;¨¨A©Ñ-°°1±Ñ4°qÑ8Ð8Ø”:ð Ø�AÝ" 1™XœXð %ð %˜Ø˜q˜b 1™W™˜˜Ø�Hð EÐDÐDÐDµh¸qÀ¹s±m´mÐDÑDÔDˆGÝ ¨¨BÑ/Ô/ˆBØˆIåÐLÈrÑQÑRÔRÐRÝ
ÐDÀrÑIÑ
JÔ
JÐJr=   c                 óª   — | j         }|                     | j        j        d         |i¦  «        }t	          ||¦  «        \  }}t          ||| ¦  «        }|S )zA
    Returns the minimal polynomial of a ``CRootOf`` object.
    r   )r{   rM   Úpolyr¢   r#   rk   )rÃ   rE   rv   rS   ra   r�   s         r;   Ú_minpoly_rootofrì     sR   € ð 	Œ€AØ	�Š�””˜Q” Ð"Ñ#Ô#€AÝ˜Q Ñ"Ô"�J€A€wÝ˜G Q¨Ñ+Ô+€FØ€Mr=   c           	      óð  ‡— | j         r| j        |z  | j        z
  S | t          u r@t	          |dz  dz   ||¬¦  «        \  }}t          |¦  «        dk    r|dz  dz   n	|t          z
  S | t          j        u rbt	          |dz  |z
  dz
  ||¬¦  «        \  }}t          |¦  «        dk    r|dz  |z
  dz
  S t          ||dt          d¦  «        z   dz  |¬¦  «        S | t          j
        u r¦t	          |dz  |dz  z
  |z
  dz
  ||¬¦  «        \  }}t          |¦  «        dk    r|dz  |dz  z
  |z
  dz
  S dt          ddt          d¦  «        z  z
  ¦  «        z   t          ddt          d¦  «        z  z   ¦  «        z   dz  }t          ||||¬¦  «        S t          |d	¦  «        r| |j        v r|| z
  S |j        rQt          | ¦  «        rB| }| |z  } 	 t!          | ¦  «        }|| u r$t          t	          | ¦  «        d         ||¦  «        S |} Œ:| j        rt%          ||g| j        ¢R Ž }�n\| j        �rƒt+          | ¦  «        j        }	t/          |	                     ¦   «         d
„ ¦  «        }
|
d         �r/|t2          k    �r#t5          d„ |
d         |
d         z   D ¦   «         Ž }t7          |
d         ¦  «        }d„ |                     ¦   «         D ¦   «         }t;          t<          |d¦  «        Št          j        }|                      |t          j!        ¦  «        }ˆfd„|                     ¦   «         D ¦   «         }t5          |Ž }tE          ||¦  «        }|j        |‰z  z  |j        ||‰z  z  z  z
  }||z  |tG          d‰¦  «        z  z  }tI          t4          ||||||¬¦  «        }nåtK          ||g| j        ¢R Ž }nÑ| j&        rtO          | j(        | j)        ||¦  «        }n­| j*        tV          u rtY          | |¦  «        }nŽ| j*        tZ          u rt]          | |¦  «        }no| j*        t^          u rta          | |¦  «        }nP| j*        tR          u rtc          | |¦  «        }n1| j*        td          u rtg          | |¦  «        }nti          d| z  ¦  «        ‚|S )a¡  
    Computes the minimal polynomial of an algebraic element
    using operations on minimal polynomials

    Examples
    ========

    >>> from sympy import minimal_polynomial, sqrt, Rational
    >>> from sympy.abc import x, y
    >>> minimal_polynomial(sqrt(2) + 3*Rational(1, 3), x, compose=True)
    x**2 - 2*x - 1
    >>> minimal_polynomial(sqrt(y) + 1/y, x, compose=True)
    x**2*y**2 - 2*x*y - y**3 + 1

    rU   r>   r£   r5   )rb   rÙ   é   é!   r@   c                 ó6   — | d         j         o| d         j         S )Nr   r>   )ro   )Úitxs    r;   r€   z"_minpoly_compose.<locals>.<lambda>J  s   € ¨¨A¬Ô(:Ð(Q¸sÀ1¼vÔ?Q€ r=   Tc                 ó   — g | ]
\  }}||z  ‘ŒS r8   r8   )r9   ÚbxrÃ   s      r;   r<   z$_minpoly_compose.<locals>.<listcomp>L  s    € Ð@Ð@Ð@¡6 2 r˜˜B™Ð@Ð@Ð@r=   FNc                 ó   — g | ]	}|j         ‘Œ
S r8   )rÜ   )r9   r„   s     r;   r<   z$_minpoly_compose.<locals>.<listcomp>N  s   € Ð-Ð-Ð-˜A�A”CÐ-Ð-Ð-r=   c                 ó@   •— g | ]\  }}||j         ‰z  |j        z  z  ‘ŒS r8   )rv   rÜ   )r9   rq   r„   Úlcmdenss      €r;   r<   z$_minpoly_compose.<locals>.<listcomp>R  s/   ø€ ÐIÐIÐI±7°4¸�D˜1œ3˜w™;¨!¬#Ñ-Ñ.ÐIÐIÐIr=   )r­   r®   r¿   )5ro   rÜ   rv   r
   r#   rX   r   ÚGoldenRatiork   r   ÚTribonacciConstantr   rY   r@   Úis_QQrw   r˜   Úis_AddrÌ   r†   r‡   r   ra   r3   Úitemsr   r	   ÚdictÚvaluesr   r)   ÚNegativeOneÚpopÚZeroÚminimal_polynomialr   rµ   rÏ   rp   rÇ   rq   r   Ú	__class__r   rÞ   r   rä   r   ræ   ré   r.   rì   r   )rÃ   rE   rb   rS   ra   ÚfacrD   r«   r´   r:   r°   Úr1ÚdensÚneg1Úexpn1Únumsr¬   r­   r®   rö   s                      @r;   r¦   r¦     s®  ø€ ð  
„~ð ØŒt�A‰v˜œ‰}ÐØ	�Q€w€wÝ   A¡¨¡¨1°SÐ9Ñ9Ô9‰
ˆˆ7Ý˜w™<œ<¨1Ò,Ð,ˆq�!‰t�a‰xˆx°!µa±%Ð7à	�QŒ]ÐÐÝ   A¡¨¡¨A¡¨q¸Ð=Ñ=Ô=‰
ˆˆ7Ýˆw‰<Œ<˜1ÒÐØ�a‘4˜!‘8˜a‘<Ðå! '¨1¨qµ4¸±7´7©{¸A©oÀ3ÐGÑGÔGÐGà	�QÔ!Ð!Ð!Ý   A¡¨¨1©¡¨q¡°1Ñ!4°aÀÐDÑDÔD‰
ˆˆ7Ýˆw‰<Œ<˜1ÒÐØ�a‘4˜!˜Q™$‘; ‘? QÑ&Ð&à•t˜B ¥4¨¡8¤8¡™OÑ,Ô,Ñ,­t°B¸½4À¹8¼8¹±OÑ/DÔ/DÑDÈÑIˆCÝ! '¨1¨c°sÐ;Ñ;Ô;Ð;åˆs�IÑÔð  2¨¬Ð#4Ð#4Ø�2‰vˆà
„yð 	•] 2Ñ&Ô&ð 	àˆØ
ˆa‰ˆð	Ý˜rÑ"Ô"ˆCØ�bˆyˆyÝ%¥k°"¡o¤o°aÔ&8¸!¸QÑ?Ô?Ð?à�ð	ð 
„yð &OÝ˜1˜cÐ, B¤GÐ,Ð,Ð,ˆ‰Ø	Œñ $OÝ�B‰KŒKÔˆÝ�—’‘”ÐQÐQÑRÔRˆØˆTŒ7ñ 	1�s�b’y‘yÝÐ@Ð@¨Q¨u¬X¸¸$¼Ñ-?Ð@Ñ@Ô@ÐAˆCÝ�a˜”g‘”ˆBØ-Ð- §¢¡¤Ð-Ñ-Ô-ˆDÝ�S $¨Ñ*Ô*ˆGÝ”=ˆDØ—F’F˜4¥¤Ñ(Ô(ˆEØIÐIÐIÐI¸b¿hºh¹j¼jÐIÑIÔIˆDÝ�t�*ˆCÝ$ S¨!Ñ,Ô,ˆCð ”%˜˜7™
Ñ" S¤U¨4°%¸±-Ñ+@Ñ%@Ñ@ˆCØ˜‘+ ¥X¨a°Ñ%9Ô%9Ñ 9Ñ9ˆCÝ/µ°S¸#¸qÀ#È3ÐTWÐXÑXÔXˆCˆCå˜q #Ð0¨¬Ð0Ð0Ð0ˆCˆCØ	Œð OÝ˜2œ7 B¤F¨A¨sÑ3Ô3ˆˆØ	Œ�Ð	Ð	Ý˜2˜qÑ!Ô!ˆˆØ	Œ�Ð	Ð	Ý˜2˜qÑ!Ô!ˆˆØ	Œ�Ð	Ð	Ý˜2˜qÑ!Ô!ˆˆØ	Œ�Ð	Ð	Ý˜2˜qÑ!Ô!ˆˆØ	Œ�Ð	 Ð	 Ý˜b !Ñ$Ô$ˆˆåÐHÈ2ÑMÑNÔNÐNØ€Jr=   TFc                 ój  — t          | ¦  «        } | j        rt          | d¬¦  «        } t          | ¦  «        D ]}|j        rd} nŒ|�t          |¦  «        t
          }}nt          d¦  «        t          }}|s6| j        r(t          t          t          | j        ¦  «        ¦  «        }nt          }t          |d¦  «        r||j        v rt          d|›d|›�¦  «        ‚|r�t          | ||¦  «        }|                     ¦   «         d	         }|                     |t%          ||¦  «        z  ¦  «        }|j        rt)          | ¦  «        }|r |||d¬
¦  «        n|                     |¦  «        S |j        st/          d¦  «        ‚t1          | ||¦  «        }|r |||d¬
¦  «        n|                     |¦  «        S )a-  
    Computes the minimal polynomial of an algebraic element.

    Parameters
    ==========

    ex : Expr
        Element or expression whose minimal polynomial is to be calculated.

    x : Symbol, optional
        Independent variable of the minimal polynomial

    compose : boolean, optional (default=True)
        Method to use for computing minimal polynomial. If ``compose=True``
        (default) then ``_minpoly_compose`` is used, if ``compose=False`` then
        groebner bases are used.

    polys : boolean, optional (default=False)
        If ``True`` returns a ``Poly`` object else an ``Expr`` object.

    domain : Domain, optional
        Ground domain

    Notes
    =====

    By default ``compose=True``, the minimal polynomial of the subexpressions of ``ex``
    are computed, then the arithmetic operations on them are performed using the resultant
    and factorization.
    If ``compose=False``, a bottom-up algorithm is used with ``groebner``.
    The default algorithm stalls less frequently.

    If no ground domain is given, it will be generated automatically from the expression.

    Examples
    ========

    >>> from sympy import minimal_polynomial, sqrt, solve, QQ
    >>> from sympy.abc import x, y

    >>> minimal_polynomial(sqrt(2), x)
    x**2 - 2
    >>> minimal_polynomial(sqrt(2), x, domain=QQ.algebraic_field(sqrt(2)))
    x - sqrt(2)
    >>> minimal_polynomial(sqrt(2) + sqrt(3), x)
    x**4 - 10*x**2 + 1
    >>> minimal_polynomial(solve(x**3 + x + 3)[0], x)
    x**3 + x + 3
    >>> minimal_polynomial(sqrt(y), x)
    x**2 - y

    T)Ú	recursiveFNrE   r@   zthe variable z$ is an element of the ground domain r>   )Úfieldz!groebner method only works for QQ)r   rZ   r   r   Úis_AlgebraicNumberr    r   r!   Úfree_symbolsr   r   ÚlistrY   r@   r   r¦   r›   rš   r&   Úis_negativer   Úcollectrù   r`   Ú_minpoly_groebner)	rÃ   rE   r§   Úpolysr¤   r{   Úclsr�   r¸   s	            r;   r  r  p  sè  € õn 
�‰Œ€BØ	„|ð *å�b DÐ)Ñ)Ô)ˆÝ" 2Ñ&Ô&ð ð ˆØÔ"ð 	ØˆGØˆEð	ð 	€}Ý˜‘”�Tˆ3ˆˆå�s‘”�Xˆ3ˆàð ØŒ?ð 	Ý"¥2¥t¨B¬OÑ'<Ô'<Ñ=Ô=ˆFˆFåˆFÝˆv�yÑ!Ô!ð 9 a¨6¬>Ð&9Ð&9ÝˆoØ-.¨Q¨Q°°ð8ñ 9ô 9ð 	9ð ð JÝ! " a¨Ñ0Ô0ˆØ×!Ò!Ñ#Ô# AÔ&ˆØ�LŠL˜�F 6¨1Ñ-Ô-Ñ-Ñ.Ô.ˆØŒ=ð 	)Ý  Ñ(Ô(ˆFØ-2ÐIˆsˆs�6˜1 DÐ)Ñ)Ô)Ð)¸¿ºÀqÑ8IÔ8IÐIàŒ<ð GÝ!Ð"EÑFÔFÐFå˜r 1 cÑ*Ô*€FØ).ÐEˆ3ˆ3ˆv�q Ð%Ñ%Ô%Ð%°F·N²NÀ1Ñ4EÔ4EÐEr=   c                 óØ  ‡‡‡‡‡‡‡— t          dt          ¬¦  «        Ši i cŠŠdˆˆˆfd„	Šˆˆˆˆˆˆfd„Šd„ }d}t          | ¦  «        } | j        r'|                      ¦   «                              ‰¦  «        S | j        r| j        ‰z  | j        z
  }�n || ¦  «        }|r| dz  } d}| j	        r0d	| j
        z  j        r!d	| j
        z  }t          | j        |‰¦  «        }n*t          | ¦  «        rt          | t          j        ‰¦  «        }|�|}|€‘ ‰| ¦  «        }‰|z
  gt#          ‰                     ¦   «         ¦  «        z   }	t'          |	t#          ‰                     ¦   «         ¦  «        ‰gz   d
¬¦  «        }
t)          |
d         ¦  «        \  }}t+          |‰| ¦  «        }|rJt-          |‰¦  «        }|                     ‰t1          |‰¦  «        z  ¦  «        dk     rt3          | ¦  «        }|S )a/  
    Computes the minimal polynomial of an algebraic number
    using Groebner bases

    Examples
    ========

    >>> from sympy import minimal_polynomial, sqrt, Rational
    >>> from sympy.abc import x
    >>> minimal_polynomial(sqrt(2) + 3*Rational(1, 3), x, compose=False)
    x**2 - 2*x - 1

    rh   )r  Nc                 ór   •— t          ‰¦  «        }|‰| <   |�||z  |z   ‰| <   n |j        |¦  «        ‰| <   |S rR   )ÚnextrB   )rÃ   r   rq   rh   Ú	generatorÚmappingr@   s       €€€r;   Úupdate_mappingz)_minpoly_groebner.<locals>.update_mappingß  sH   ø€ Ý�‰OŒOˆØˆ�‰àÐØ˜S™& 4™-ˆG�B‰KˆKà%˜#œ+ a™.œ.ˆG�B‰Kàˆr=   c                 ó  •— | j         r2| t          j        u r| ‰	vr ‰| dd¦  «        S ‰
|          S | j        r| S �n½| j        rt          ˆfd„| j        D ¦   «         Ž S | j        rt          ˆfd„| j        D ¦   «         Ž S | j	        �rB| j
        j        �r4| j
        dk     r†t          | j        ‰‰¦  «        }t          ‰|¦  «                             ¦   «         }|                     ‰| j        ¦  «                             ¦   «         }| j
        dk    r ‰|¦  «        S || j
         z  } | j
        j        sA| j        | j
        j        z                       ¦   «         t'          d| j
        j        ¦  «        }}n| j        | j
        }} ‰|¦  «        }||z  }|‰	vr,|j        r|                     ¦   «         S  ‰|d|z  | ¦  «        S ‰
|         S n1| j        r*| ‰	vr ‰| |                      ¦   «         ¦  «        S ‰
|          S t/          d| z  ¦  «        ‚)aÓ  
        Transform a given algebraic expression *ex* into a multivariate
        polynomial, by introducing fresh variables with defining equations.

        Explanation
        ===========

        The critical elements of the algebraic expression *ex* are root
        extractions, instances of :py:class:`~.AlgebraicNumber`, and negative
        powers.

        When we encounter a root extraction or an :py:class:`~.AlgebraicNumber`
        we replace this expression with a fresh variable ``a_i``, and record
        the defining polynomial for ``a_i``. For example, if ``a_0**(1/3)``
        occurs, we will replace it with ``a_1``, and record the new defining
        polynomial ``a_1**3 - a_0``.

        When we encounter a negative power we transform it into a positive
        power by algebraically inverting the base. This means computing the
        minimal polynomial in ``x`` for the base, inverting ``x`` modulo this
        poly (which generates a new polynomial) and then substituting the
        original base expression for ``x`` in this last polynomial.

        We return the transformed expression, and we record the defining
        equations for new symbols using the ``update_mapping()`` function.

        rU   r>   c                 ó&   •— g | ]} ‰|¦  «        ‘ŒS r8   r8   ©r9   r‘   Úbottom_up_scans     €r;   r<   z=_minpoly_groebner.<locals>.bottom_up_scan.<locals>.<listcomp>  ó#   ø€ Ð>Ð>Ð>°˜.˜.¨Ñ+Ô+Ð>Ð>Ð>r=   c                 ó&   •— g | ]} ‰|¦  «        ‘ŒS r8   r8   r  s     €r;   r<   z=_minpoly_groebner.<locals>.bottom_up_scan.<locals>.<listcomp>  r  r=   r   r‚   z*%s does not seem to be an algebraic number)rŠ   r   ÚImaginaryUnitro   rú   r   r†   r‡   r	   rp   r   r  rq   r"   rB   rM   Úexpandrr   rv   r   rÜ   r  Úminpoly_of_elementr   )rÃ   Úminpoly_baseÚinverseÚbase_invrq   r   r{   r  r  r  r@   r  rE   s          €€€€€€r;   r  z)_minpoly_groebner.<locals>.bottom_up_scanê  sO  ø€ ð8 Œ:ð *	#Ø•Q”_Ð$Ð$Ø˜WÐ$Ð$Ø)˜>¨"¨a°Ñ3Ô3Ð3à" 2œ;Ð&Ø”ð Ø�	ñàŒYð "	#ÝÐ>Ð>Ð>Ð>°R´WÐ>Ñ>Ô>Ð?Ð?ØŒYð  	#ÝÐ>Ð>Ð>Ð>°R´WÐ>Ñ>Ô>Ð?Ð?ØŒYñ 	#ØŒvÔ!ñ )Ø”6˜A’:�:Ý#4°R´W¸aÀÑ#EÔ#E�LÝ$ Q¨Ñ5Ô5×=Ò=Ñ?Ô?�GØ&Ÿ|š|¨A¨r¬wÑ7Ô7×>Ò>Ñ@Ô@�Hà”v ’|�|Ø-˜~¨hÑ7Ô7Ð7à%¨¬¨Ñ0˜Ø”vÔ(ð 0àœ ¤¤Ñ)¯6ª6©8¬8µX¸aÀÄÄÑ5JÔ5Jð �D�Dð !#¤¨¬˜#�DØ%�~ dÑ+Ô+�Ø˜S‘y�à˜wÐ&Ð&Ø”~ð DØ#Ÿ{š{™}œ}Ð,à-˜~¨d°A¸±G¸d¸UÑCÔCÐCà" 4œ=Ð(ð1)ð2 Ô"ð 	#Ø˜Ð Ð Ø%�~ b¨"×*?Ò*?Ñ*AÔ*AÑBÔBÐBà˜r”{Ð"åÐGÈ"ÑLÑMÔMÐMr=   c                 óè   — | j         r(d| j        z  j        r| j        dk     r| j        j        rdS | j        r;d}| j        D ]-}|j        r dS |j         r|j        j        r|j        dk    r dS Œ.|rdS dS )z
        Returns True if it is more likely that the minimal polynomial
        algorithm works better with the inverse
        r>   r   TF)rp   r   r‹   rq   rú   r‡   r†   )rÃ   Úhitrv   s      r;   Úsimpler_inversez*_minpoly_groebner.<locals>.simpler_inverse4  s¥   € ð
 Œ9ð 	 Ø�"”&‘Ô$ð  ¨¬°!ª¨Ø”7”>ð  Ø˜4ØŒ9ð 
	ØˆCØ”Wð %ð %�Ø”8ð !Ø ˜5˜5Ø”8ð %Ø”v”}ð %¨¬°ª¨Ø$˜u˜uøàð Ø�tØˆur=   Fr‚   r>   Úlex)Úorderr   rR   )r1   r   r   r  r"  rB   ro   rÜ   rv   rp   r   rr   rž   rq   rw   r   r‰   r  rý   r$   r#   rk   r»   rš   r&   r   )rÃ   rE   r  r(  Úinvertedr�   r´   rG   Úbusr�   ÚGrS   ra   r  r  r  r@   r  s    ``          @@@@@r;   r  r  Í  si  øøøøøøø€ õ ! ­%Ð0Ñ0Ô0€IØ˜2Ð€GˆWð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ðHNð HNð HNð HNð HNð HNð HNð HNð HNð HNðTð ð ð, €HÝ	˜BÑ	Ô	€BØ	Ôð 4Ø×$Ò$Ñ&Ô&×.Ò.¨qÑ1Ô1Ð1Ø	Œð 4Ø”�a‘˜"œ$‘ˆ‰à"�? 2Ñ&Ô&ˆØð 	Ø�R‘ˆBØˆØŒ9ð 	7˜!˜BœF™(Ô.ð 	7Ø�"”&‘ˆAÝ(¨¬°!°QÑ7Ô7ˆCˆCå˜2ÑÔð 	7Ý(¨­Q¬U°AÑ6Ô6ˆCàˆ?ØˆFàˆ;Ø �. Ñ$Ô$ˆCØ�S‘�	�D §¢Ñ!1Ô!1Ñ2Ô2Ñ2ˆAÝ˜�D §¢Ñ!1Ô!1Ñ2Ô2°a°SÑ8ÀÐFÑFÔFˆAå$ Q r¤UÑ+Ô+‰JˆAˆwå# G¨Q°Ñ3Ô3ˆFØð )Ý˜& !Ñ$Ô$ˆØ�<Š<˜�6 &¨!Ñ,Ô,Ñ,Ñ-Ô-°Ò1Ð1Ý  Ñ(Ô(ˆFà€Mr=   c                 ó*   — t          | ||||¬¦  «        S )z6This is a synonym for :py:func:`~.minimal_polynomial`.)rE   r§   r  r¤   )r  )rÃ   rE   r§   r  r¤   s        r;   Úminpolyr/  o  s   € õ ˜b A¨w¸eÈFÐSÑSÔSÐSr=   )NNrR   )NTFN)]Ú__doc__Ú	functoolsr   Úsympy.core.addr   Úsympy.core.exprtoolsr   Úsympy.core.functionr   r   r   Úsympy.core.mulr	   Úsympy.core.numbersr
   r   r   r   Úsympy.core.singletonr   Úsympy.core.symbolr   Úsympy.core.sympifyr   Úsympy.core.traversalr   Ú&sympy.functions.elementary.exponentialr   Ú(sympy.functions.elementary.miscellaneousr   r   Ú(sympy.functions.elementary.trigonometricr   r   r   Úsympy.ntheory.factor_r   Úsympy.utilities.iterablesr   Úsympy.polys.domainsr   r   r   Úsympy.polys.orthopolysr   Úsympy.polys.polyerrorsr   r   Úsympy.polys.polytoolsr    r!   r"   r#   r$   r%   r&   r'   r(   r)   Úsympy.polys.polyutilsr*   r+   Úsympy.polys.ring_seriesr,   Úsympy.polys.ringsr-   Úsympy.polys.rootoftoolsr.   Úsympy.polys.specialpolysr0   Úsympy.utilitiesr1   r2   r3   rk   rw   r˜   rž   rµ   r»   r¨   rÇ   rÌ   rÏ   rÞ   rä   ræ   ré   rì   r¦   r  r  r/  r8   r=   r;   ú<module>rJ     sA  ðØ 0Ð 0à Ð Ð Ð Ð Ð à Ð Ð Ð Ð Ð Ø (Ð (Ð (Ð (Ð (Ð (Ø HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HØ Ð Ð Ð Ð Ð Ø :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ø "Ð "Ð "Ð "Ð "Ð "Ø #Ð #Ð #Ð #Ð #Ð #Ø &Ð &Ð &Ð &Ð &Ð &Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ø BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BØ *Ð *Ð *Ð *Ð *Ð *Ø -Ð -Ð -Ð -Ð -Ð -à 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1ðð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð AÐ @Ð @Ð @Ð @Ð @Ð @Ð @Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø "Ð "Ð "Ð "Ð "Ð "Ø +Ð +Ð +Ð +Ð +Ð +Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4ðð ð ð ð ð ð ð ð ð ð
 ')¨s¸!ð -Zð -Zð -Zð -Zð`=ð =ð =ð?ð ?ð ?ðB4ð 4ð 4ðlLð Lð Lð Lð^ð ð ðð ð ð2ð 2ð 2ð 2ðj	ð 	ð 	ð	ð 	ð 	ð#Kð #Kð #KðLKð Kð Kð>Kð Kð Kð0!Kð !Kð !KðHð ð ðZð Zð Zðz ðYFð YFð YFñ „ðYFðx_ð _ð _ðD ðTð Tð Tñ „ðTð Tð Tr=   