§
    PŠtj`T  ã                   óì   — d dl mZmZmZ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mZ d„ Zdefd	„Zd
„ Zd„ Zdd„Zd„ Z G d„ de¦  «        Zd„ Zd„ Zdd„Z d„ Z!d„ Z"d„ Z#d„ Z$d„ Z%dS )é    )ÚAddÚExprÚMulÚSÚsympify)Ú_mexpandÚ	count_opsÚ
expand_mul)Údefault_sort_key)ÚDummy)ÚrootÚsignÚsqrt)ÚPolyÚPolynomialErrorc                 óh   — | j         o+| j        j        ot          | j        ¦  «        t          j        u S )z/Return True if expr is a sqrt, otherwise False.)Úis_PowÚexpÚis_RationalÚabsr   ÚHalf)Úexprs    úW/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/sympy/simplify/sqrtdenest.pyÚis_sqrtr   	   s*   € ð Œ;ÐK˜4œ8Ô/ÐKµC¸¼±M´MÅQÄVÐ4KÐKó    Úreturnc                 óÜ   — | t           j        u rdS | j        rdS | j        s| j        rt          d„ | j        D ¦   «         ¦  «        S t          | ¦  «        rt          | j	        ¦  «        dz   S dS )aÍ  Return the maximum depth of any square root argument of p.

    >>> from sympy.functions.elementary.miscellaneous import sqrt
    >>> from sympy.simplify.sqrtdenest import sqrt_depth

    Neither of these square roots contains any other square roots
    so the depth is 1:

    >>> sqrt_depth(1 + sqrt(2)*(1 + sqrt(3)))
    1

    The sqrt(3) is contained within a square root so the depth is
    2:

    >>> sqrt_depth(1 + sqrt(2)*sqrt(1 + sqrt(3)))
    2
    é   r   c              3   ó4   K  — | ]}t          |¦  «        V — Œd S ©N©Ú
sqrt_depth©Ú.0Úxs     r   ú	<genexpr>zsqrt_depth.<locals>.<genexpr>&   s(   è è € Ð1Ð1 Q•:˜a‘=”=Ð1Ð1Ð1Ð1Ð1Ð1r   )
r   ÚImaginaryUnitÚis_AtomÚis_AddÚis_MulÚmaxÚargsr   r"   Úbase©Úps    r   r"   r"      s   € ð$ 	�AŒOÐÐØˆqØ„yð ØˆqØ„xð 2�1”8ð 2ÝÐ1Ð1¨!¬&Ð1Ñ1Ô1Ñ1Ô1Ð1Ýˆq�z„zð &Ý˜!œ&Ñ!Ô! AÑ%Ð%Øˆ1r   c                 óî   — | j         rdS | j        rdS t          | ¦  «        s| j        r | j        j        rt          | j        ¦  «        S | j        s| j	        rt          d„ | j        D ¦   «         ¦  «        S dS )a´  Return True if p is comprised of only Rationals or square roots
    of Rationals and algebraic operations.

    Examples
    ========

    >>> from sympy.functions.elementary.miscellaneous import sqrt
    >>> from sympy.simplify.sqrtdenest import is_algebraic
    >>> from sympy import cos
    >>> is_algebraic(sqrt(2)*(3/(sqrt(7) + sqrt(5)*sqrt(2))))
    True
    >>> is_algebraic(sqrt(2)*(3/(sqrt(7) + sqrt(5)*cos(2))))
    False
    TFc              3   ó4   K  — | ]}t          |¦  «        V — Œd S r    )Úis_algebraicr#   s     r   r&   zis_algebraic.<locals>.<genexpr>C   s(   è è € Ð3Ð3 q•< ‘?”?Ð3Ð3Ð3Ð3Ð3Ð3r   )r   r(   r   r   r   Ú
is_Integerr2   r-   r)   r*   Úallr,   r.   s    r   r2   r2   ,   sŒ   € ð  	„}ð 	ØˆtØ	
Œð ØˆuÝ	�‰Œð �q”xð  A¤EÔ$4ð Ý˜AœFÑ#Ô#Ð#Ø	
Œð �Q”Xð ÝÐ3Ð3¨A¬FÐ3Ñ3Ô3Ñ3Ô3Ð3àˆur   c                 óø   — | dk    rdgg}nn| dk    rddgddgddgg}n\| dk    rg d¢g d¢g d¢g d¢g d	¢g d
¢g d¢g}n>t          | dz
  ¦  «        }d„ |D ¦   «         }d„ |D ¦   «         }|dg| dz
  z  dgz   gz   |z   }|S )ag  
    Returns all possible subsets of the set (0, 1, ..., n-1) except the
    empty set, listed in reversed lexicographical order according to binary
    representation, so that the case of the fourth root is treated last.

    Examples
    ========

    >>> from sympy.simplify.sqrtdenest import _subsets
    >>> _subsets(2)
    [[1, 0], [0, 1], [1, 1]]

    r   é   r   é   )r   r   r   )r   r   r   )r   r   r   )r   r   r   )r   r   r   )r   r   r   )r   r   r   c                 ó   — g | ]}|d gz   ‘Œ	S )r   © r#   s     r   ú
<listcomp>z_subsets.<locals>.<listcomp>_   ó   € Ð!Ð!Ð!˜!ˆa�1�#‰gÐ!Ð!Ð!r   c                 ó   — g | ]}|d gz   ‘Œ	S )r   r9   r#   s     r   r:   z_subsets.<locals>.<listcomp>`   r;   r   )Ú_subsets)ÚnÚaÚbÚa0Úa1s        r   r=   r=   H   sØ   € ð 	ˆA‚v€vØˆSˆEˆˆØ	
ˆaŠˆØ�ˆV�a˜�V˜a ˜VÐ$ˆˆØ	
ˆaŠˆØˆYˆY˜	˜	˜	 9 9 9ØˆYˆY˜	˜	˜	 9 9 9¨i¨i¨ið9ˆˆõ �Q˜‘U‰OŒOˆØ!Ð!˜qÐ!Ñ!Ô!ˆØ!Ð!˜qÐ!Ñ!Ô!ˆØ�1�#�q˜1‘u‘+  Ñ#Ð$Ñ$ rÑ)ˆØ€Hr   r7   c                 ó~   — t          | ¦  «        } t          |¦  «        D ]}t          | ¦  «        }| |k    r| c S |} Œ| S )aÜ  Denests sqrts in an expression that contain other square roots
    if possible, otherwise returns the expr unchanged. This is based on the
    algorithms of [1].

    Examples
    ========

    >>> from sympy.simplify.sqrtdenest import sqrtdenest
    >>> from sympy import sqrt
    >>> sqrtdenest(sqrt(5 + 2 * sqrt(6)))
    sqrt(2) + sqrt(3)

    See Also
    ========

    sympy.solvers.solvers.unrad

    References
    ==========

    .. [1] https://web.archive.org/web/20210806201615/https://researcher.watson.ibm.com/researcher/files/us-fagin/symb85.pdf

    .. [2] D. J. Jeffrey and A. D. Rich, 'Symplifying Square Roots of Square Roots
           by Denesting' (available at https://www.cybertester.com/data/denest.pdf)

    )r
   ÚrangeÚ_sqrtdenest0)r   Úmax_iterÚiÚzs       r   Ú
sqrtdenestrI   e   sQ   € õ6 �dÑÔ€DÝ�8‰_Œ_ð ð ˆÝ˜ÑÔˆØ�1Š9ˆ9ØˆKˆKˆKØˆˆØ€Kr   c                 ó¸  — ddl m} t          | ¦  «        } | j        r| t          j        t          j        f}�n•| j        �rRt          | j        t          ¬¦  «        }d„ |D ¦   «         }t          d„ |D ¦   «         ¦  «        r# || ¦  «        \  }}}|||f}t          |¦  «        S d„ t          |¦  «        D ¦   «         }t          |t          ¬¦  «        }	|	d         dk    rg }�në|	\  }
}}|                     |¦  «        }|                     |¦  «         t          j        }|j        rtg }g }|j        D ]@}t#          |¦  «        |
k     r|                     |¦  «         Œ+|                     |¦  «         ŒAt'          j        |¦  «        }t'          j        |¦  «        }g }|g}|D ]Ö}|d         |
k     r|                     |d         ¦  «         Œ*|d         }||k    r|                     d¦  «         ŒN|j        rft          |j        ¦  «        }||v r2|                     |¦  «         |                     t'          |Ž ¦  «         ŒŸ|                     |d         ¦  «         Œ»|                     |d         ¦  «         Œ×t-          |Ž }t-          |Ž }|||dz  f}n;|                      ¦   «         \  }}t1          |¦  «        rt          j        ||dz  f}ng }t          |¦  «        S )	a�  Return [a, b, r] for p.match(a + b*sqrt(r)) where, in addition to
    matching, sqrt(r) also has then maximal sqrt_depth among addends of p.

    Examples
    ========

    >>> from sympy.functions.elementary.miscellaneous import sqrt
    >>> from sympy.simplify.sqrtdenest import _sqrt_match
    >>> _sqrt_match(1 + sqrt(2) + sqrt(2)*sqrt(3) +  2*sqrt(1+sqrt(5)))
    [1 + sqrt(2) + sqrt(6), 2, 1 + sqrt(5)]
    r   )Úsplit_surds©Úkeyc                 ó   — g | ]}|d z  ‘ŒS )r6   r9   r#   s     r   r:   z_sqrt_match.<locals>.<listcomp>œ   s   € Ð&Ð&Ð&˜1�!�Q‘$Ð&Ð&Ð&r   c              3   ó2   K  — | ]}|j         o|j        V — Œd S r    )r   Úis_positive)r$   Úsqs     r   r&   z_sqrt_match.<locals>.<genexpr>�   s+   è è € ÐBÐB°RˆrŒ~Ð0 "¤.ÐBÐBÐBÐBÐBÐBr   c                 ó8   — g | ]\  }}t          |¦  «        ||f‘ŒS r9   r!   )r$   rG   r%   s      r   r:   z_sqrt_match.<locals>.<listcomp>¤   s)   € Ð@Ð@Ð@¡t q¨!�j˜‰mŒm˜Q Ð"Ð@Ð@Ð@r   r   r6   )Úsympy.simplify.radsimprK   r   Ú	is_Numberr   ÚZeror)   Úsortedr,   r   r4   ÚlistÚ	enumerater+   ÚpopÚOner*   r"   Úappendr   Ú
_from_argsÚremover   Úas_coeff_Mulr   )r/   rK   ÚresÚpargsÚsqargsÚrr@   r?   ÚvÚnmaxÚdepthÚ_rG   ÚbvÚrvr%   rB   Úb1Úx1Úx1argss                       r   Ú_sqrt_matchrl   ‰   sã  € ð 3Ð2Ð2Ð2Ð2Ð2å�‰Œ€AØ„{ð <Ø•!”&�!œ&Ð!ˆ‰Ø	
Œñ :Ý�q”vÕ#3Ð4Ñ4Ô4ˆØ&Ð& Ð&Ñ&Ô&ˆÝÐBÐB¸6ÐBÑBÔBÑBÔBð 	Ø!�k !‘n”n‰GˆAˆq�!Ø�Q˜�'ˆCÝ˜‘9”9Ðð AÐ@­y¸Ñ/?Ô/?Ð@Ñ@Ô@ˆÝ�1Õ*Ð+Ñ+Ô+ˆØ�Œ7�aŠ<ˆ<ØˆC‰Cð ‰KˆE�1�aØ—	’	˜!‘”ˆAØ�EŠE�!‰HŒHˆHÝ”ˆAØŒxð 	'Ø�Ø�Øœð %ð %�AÝ! !‘}”} uÒ,Ð,ØŸ	š	 !™œ˜˜àŸ	š	 !™œ˜˜Ý”N 2Ñ&Ô&�Ý”N 2Ñ&Ô&�àˆBØ�ˆBØð ,ð ,�Ø�Q”4˜%’<�<Ø—I’I˜a œd‘O”O�O�Oà˜1œ�BØ˜Q’w�wØŸ	š	 !™œ˜˜àœ9ð ,Ý%)¨"¬'¡]¤]˜FØ  F˜{˜{Ø &§¢¨aÑ 0Ô 0Ð 0Ø "§	¢	­#¨v¨,Ñ 7Ô 7Ð 7Ð 7à "§	¢	¨!¨A¬$¡¤  àŸIšI a¨¤d™OœO˜O˜OÝ�R�ˆAÝ�R�ˆAØ�a˜˜A™�,ˆCˆCà�~Š~ÑÔ‰ˆˆ1Ý�1‰:Œ:ð 	Ý”6˜1˜a ™dÐ#ˆCˆCàˆCÝ�‰9Œ9Ðr   c                   ó   — e Zd ZdS )ÚSqrtdenestStopIterationN)Ú__name__Ú
__module__Ú__qualname__r9   r   r   rn   rn   Ø   s   € € € € € Ø€Dr   rn   c                 ó²  — t          | ¦  «        rï|                      ¦   «         \  }}|t          j        u r´|j        j        r™t          |j        j        t          ¬¦  «        }t          |¦  «        dk    r9t          d„ |D ¦   «         ¦  «        r 	 t          |¦  «        S # t          $ r Y nw xY wt          t          t          d„ |D ¦   «         Ž ¦  «        ¦  «        } t!          | ¦  «        S d„ ||fD ¦   «         \  }}||z  S t#          | t          ¦  «        r‘g }g }| j        D ]C}|                     ¦   «         \  }}|                     |¦  «         |                     |¦  «         ŒDt          d„ |D ¦   «         ¦  «        r)t          d„ |D ¦   «         ¦  «        rt)          ||¦  «        S t#          | t*          ¦  «        r| j        }|r | j        d„ |D ¦   «         Ž S | S )	z+Returns expr after denesting its arguments.rL   r6   c              3   ó*   K  — | ]}|d z  j         V — ŒdS )r6   N)r3   r#   s     r   r&   z_sqrtdenest0.<locals>.<genexpr>ä   s)   è è € Ð(IÐ(I¸q¨!¨Q©$Ô):Ð(IÐ(IÐ(IÐ(IÐ(IÐ(Ir   c                 ó,   — g | ]}t          |¦  «        ‘ŒS r9   ©rE   r#   s     r   r:   z _sqrtdenest0.<locals>.<listcomp>é   s   € Ð*IÐ*IÐ*I¸q­<¸©?¬?Ð*IÐ*IÐ*Ir   c                 ó,   — g | ]}t          |¦  «        ‘ŒS r9   ru   )r$   rG   s     r   r:   z _sqrtdenest0.<locals>.<listcomp>ì   s   € Ð4Ð4Ð4¨•L ‘O”OÐ4Ð4Ð4r   c              3   ó$   K  — | ]}|j         V — Œd S r    )r   )r$   Úcs     r   r&   z_sqrtdenest0.<locals>.<genexpr>÷   s$   è è € Ð)Ð) ˆqŒ}Ð)Ð)Ð)Ð)Ð)Ð)r   c              3   ó4   K  — | ]}t          |¦  «        V — Œd S r    )r   )r$   Úargs     r   r&   z_sqrtdenest0.<locals>.<genexpr>÷   s(   è è € Ð1OÐ1OÀ3µ'¸#±,´,Ð1OÐ1OÐ1OÐ1OÐ1OÐ1Or   c                 ó,   — g | ]}t          |¦  «        ‘ŒS r9   ru   )r$   r?   s     r   r:   z _sqrtdenest0.<locals>.<listcomp>ý   s   € Ð=Ð=Ð=°1�|¨A™œÐ=Ð=Ð=r   )r   Úas_numer_denomr   rZ   r-   r)   rV   r,   r   Úlenr4   Ú_sqrtdenest_recrn   r   r   r   Ú_sqrtdenest1Ú
isinstancer^   r[   Ú_sqrt_ratcombr   Úfunc)r   r>   Údr,   Úcsrz   rx   r?   s           r   rE   rE   Ü   s  € õ ˆt�}„}ð Ø×"Ò"Ñ$Ô$‰ˆˆ1Ø•”ˆ:ˆ:ØŒvŒ}ð MÝ˜aœfœkÕ/?Ð@Ñ@Ô@�Ý�t‘9”9˜q’=�=¥SÐ(IÐ(IÀDÐ(IÑ(IÔ(IÑ%IÔ%I�=ðÝ.¨qÑ1Ô1Ð1øÝ2ð ð ð Ø˜ðøøøå�H¥SÐ*IÐ*IÀDÐ*IÑ*IÔ*IÐ%JÑKÔKÑLÔL�Ý Ñ%Ô%Ð%à4Ð4¨a°¨VÐ4Ñ4Ô4‰DˆAˆqØ�Q‘3ˆJå�$�ÑÔð 	+ØˆØˆØ”9ð 	ð 	ˆCØ×#Ò#Ñ%Ô%‰DˆAˆqØ�IŠI�a‰LŒLˆLØ�KŠK˜‰NŒNˆNˆNåÐ)Ð) bÐ)Ñ)Ô)Ñ)Ô)ð 	+­cÐ1OÐ1OÈ$Ð1OÑ1OÔ1OÑ.OÔ.Oð 	+Ý   TÑ*Ô*Ð*å�$�ÑÔð ?ØŒyˆØð 	?Ø�4”9Ð=Ð=¸Ð=Ñ=Ô=Ð>Ð>Ø€Ks   ÂB Â
B*Â)B*c                 ó2  — ddl m}m}m} | j        st          | ¦  «        S | j        dk     r2t          d¦  «        t          t          | j         ¦  «        ¦  «        z  S  || j        ¦  «        \  }}}|t          |¦  «        z  }||k     r||}}t          |dz  |dz  z
  ¦  «        }t          |j        ¦  «        dk    rÃ ||¦  «        \  }}}	|t          |¦  «        z  }||	k     r|	|}	}t          |dz  |	dz  z
  ¦  «        }
t          t          |
¦  «        ¦  «        }t          t          ||z   ¦  «        ¦  «        } ||	|¦  «        \  }}t          |t          d¦  «        z  ||t          d¦  «        z  z  z   ¦  «        }nt          t          |¦  «        ¦  «        }t          |¦  «        dk    rt          ‚||z   }t          |j        ¦  «        t          | j        ¦  «        k    r,t          |¦  «        t          | j        ¦  «        k    rt          ‚t          t          |¦  «        ¦  «        }t          |¦  «        dk    rt          ‚ |||¦  «        \  }}|t          d¦  «        z  ||t          d¦  «        z  z  z   } ||¦  «        }t          |¦  «        S )al  Helper that denests the square root of three or more surds.

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

    It returns the denested expression; if it cannot be denested it
    throws SqrtdenestStopIteration

    Algorithm: expr.base is in the extension Q_m = Q(sqrt(r_1),..,sqrt(r_k));
    split expr.base = a + b*sqrt(r_k), where `a` and `b` are on
    Q_(m-1) = Q(sqrt(r_1),..,sqrt(r_(k-1))); then a**2 - b**2*r_k is
    on Q_(m-1); denest sqrt(a**2 - b**2*r_k) and so on.
    See [1], section 6.

    Examples
    ========

    >>> from sympy import sqrt
    >>> from sympy.simplify.sqrtdenest import _sqrtdenest_rec
    >>> _sqrtdenest_rec(sqrt(-72*sqrt(2) + 158*sqrt(5) + 498))
    -sqrt(10) + sqrt(2) + 9 + 9*sqrt(5)
    >>> w=-6*sqrt(55)-6*sqrt(35)-2*sqrt(22)-2*sqrt(14)+2*sqrt(77)+6*sqrt(10)+65
    >>> _sqrtdenest_rec(sqrt(w))
    -sqrt(11) - sqrt(7) + sqrt(2) + 3*sqrt(5)
    r   )ÚradsimpÚrad_rationalizerK   éÿÿÿÿr6   r   )rS   r†   r‡   rK   r   rI   r-   r   r~   r   r}   r,   r   r"   rn   r	   )r   r†   r‡   rK   Úgr?   r@   Úc2rB   ri   Úc2_1Úc_1Úd_1ÚnumÚdenrx   Úacrƒ   rb   s                      r   r~   r~     sr  € ð4 MÐLÐLÐLÐLÐLÐLÐLÐLÐLØŒ;ð  Ý˜$ÑÔÐØ„y�1‚}€}Ý�B‰xŒx�­¨d¬i¨ZÑ(8Ô(8Ñ9Ô9Ñ9Ð9Øˆk˜$œ)Ñ$Ô$�G€A€qˆ!Ø	�$ˆq‰'Œ'‰	€AØˆ1‚u€uØ�!ˆ1ˆÝ	�!�Q‘$˜˜A™‘+Ñ	Ô	€BÝ
ˆ2Œ7�|„|�aÒÐØ�K ‘O”O‰	ˆˆ2ˆrØ•�Q‘”‰ZˆØ�Š7ˆ7Ø˜�ˆBÝ˜˜A™  A¡™Ñ&Ô&ˆÝ�d 4™jœjÑ)Ô)ˆÝ�d 2¨¡8™nœnÑ-Ô-ˆØ"�? 2 sÑ+Ô+‰ˆˆSÝ�S�˜a™œ‘[ 3¨­D°©G¬G©Ñ#4Ñ4Ñ5Ô5ˆˆå�˜b™œÑ"Ô"ˆå�!�}„}�qÒÐÝ%Ð%Ø	
ˆQ‰€BÝ
ˆ2Œ7�|„|•s˜4œ9‘~”~Ò%Ð%Ý�R‰=Œ=�I d¤iÑ0Ô0Ò0Ð0Ý)Ð)Ý•4˜‘8”8ÑÔ€AÝ�!�}„}�qÒÐÝ%Ð%Øˆ˜q !Ñ$Ô$�H€CˆØ	�$ˆq‰'Œ'‰	�C˜�T !™WœW™Ñ%Ñ%€AØˆ�‰
Œ
€AÝ�A‰;Œ;Ðr   Tc                 óV  — ddl m} t          | ¦  «        s| S | j        }|j        r| S t          |¦  «        }|s| S |\  }}}t          |dz  |dz  |z  z
  ¦  «        }|j        r|j        rt          ||||¦  «        }|�|S nvt          | |z  ¦  «        }	t          |	¦  «        }
|
j        r7t          t          ||z  ¦  «        |||	¦  «        }|�|t          |d¦  «        z  S nt          |||¦  «        }|�|S |rt          | ¦  «        s| S t          | ||||¦  «        }|r|S ||||g}t           || dz  ¦  «        g|dt!          | ¦  «        ¦  «        d         }|d         €| S |�Dt!          |¦  «        t!          | ¦  «        k    r"t#          |¦  «        t#          | ¦  «        k    r| S |S | S )zcReturn denested expr after denesting with simpler methods or, that
    failing, using the denester.r   ©r†   r6   Né   r   )Úsympy.simplify.simplifyr†   r   r-   r(   rl   r   r   rP   Ú_sqrt_numeric_denestr   r   Ú_sqrt_symbolic_denestr2   Úsqrt_biquadratic_denestÚ	_denesterr"   r	   )r   Údenesterr†   r?   Úvalr@   rb   Úd2rH   Údr2Údrr_   Úav0s                r   r   r   A  sþ  € ð 0Ð/Ð/Ð/Ð/Ð/å�4‰=Œ=ð ØˆàŒ	€AØ„yð ØˆÝ
�a‰.Œ.€CØð Øˆà�G€A€qˆ!å	�!�Q‘$˜˜A™˜a™‘-Ñ	 Ô	 €BØ	„~ð ØŒ>ð 	(Ý$ Q¨¨1¨bÑ1Ô1ˆAØˆ}Ø�ð õ ˜B˜3˜q™5‘/”/ˆCÝ�c‘”ˆBØŒ~ð (Ý(­°!°A±#©¬¸¸1¸cÑBÔB�Ø�=Ø�T ! Q™ZœZ™<Ð'øõ " ! Q¨Ñ*Ô*ˆØˆ=ØˆHàð �<¨Ñ-Ô-ð Øˆå
! $¨¨1¨a°Ñ
4Ô
4€CØ
ð Øˆ
ð ˆa��Bˆ-€CÝ�7�7˜4 ™7Ñ#Ô#Ð$ c¨1­j¸Ñ.>Ô.>Ñ?Ô?ÀÔB€AØ
ˆ1„v€~ØˆØ€}Ý�a‰=Œ=�J tÑ,Ô,Ò,Ð,µ¸1±´Å	È$ÁÄÒ1OÐ1OØˆKØˆØ€Kr   c                 óÎ  — t          t          | ||f¦  «        \  } }}t          |¦  «        }|sdS |\  }}}|�r(t          dd¬¦  «        }	 t	          |                      t          |¦  «        |dz  |z
  |z  ¦  «        |¦  «        }n# t          $ r Y dS w xY w|                     ¦   «         dk    r´| 	                    ¦   «         \  }	}
}|
|z  }
t          |
dz  d|	z  |z  z
  ¦  «                             d¦  «        rkt          |	t          |¦  «        |
d|	z  z  z   dz  z  ¦  «        }|j        r3t          t          j        |                     ¦   «         ¦  «        ¦  «        }|S dS dS dS )a4  Given an expression, sqrt(a + b*sqrt(b)), return the denested
    expression or None.

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

    If r = ra + rb*sqrt(rr), try replacing sqrt(rr) in ``a`` with
    (y**2 - ra)/rb, and if the result is a quadratic, ca*y**2 + cb*y + cc, and
    (cb + b)**2 - 4*ca*cc is 0, then sqrt(a + b*sqrt(r)) can be rewritten as
    sqrt(ca*(sqrt(r) + (cb + b)/(2*ca))**2).

    Examples
    ========

    >>> from sympy.simplify.sqrtdenest import _sqrt_symbolic_denest, sqrtdenest
    >>> from sympy import sqrt, Symbol
    >>> from sympy.abc import x

    >>> a, b, r = 16 - 2*sqrt(29), 2, -10*sqrt(29) + 55
    >>> _sqrt_symbolic_denest(a, b, r)
    sqrt(11 - 2*sqrt(29)) + sqrt(5)

    If the expression is numeric, it will be simplified:

    >>> w = sqrt(sqrt(sqrt(3) + 1) + 1) + 1 + sqrt(2)
    >>> sqrtdenest(sqrt((w**2).expand()))
    1 + sqrt(2) + sqrt(1 + sqrt(1 + sqrt(3)))

    Otherwise, it will only be simplified if assumptions allow:

    >>> w = w.subs(sqrt(3), sqrt(x + 3))
    >>> sqrtdenest(sqrt((w**2).expand()))
    sqrt((sqrt(sqrt(sqrt(x + 3) + 1) + 1) + 1 + sqrt(2))**2)

    Notice that the argument of the sqrt is a square. If x is made positive
    then the sqrt of the square is resolved:

    >>> _.subs(x, Symbol('x', positive=True))
    sqrt(sqrt(sqrt(x + 3) + 1) + 1) + 1 + sqrt(2)
    NÚyT)Úpositiver6   r“   r   )Úmapr   rl   r   r   Úsubsr   r   ÚdegreeÚ
all_coeffsr   ÚequalsÚ	is_numberr   r\   Úas_content_primitive)r?   r@   rb   ÚrvalÚraÚrbÚrrr    ÚnewaÚcaÚcbÚccrH   s                r   r–   r–   |  s�  € õT •'˜A˜q !˜9Ñ%Ô%�G€A€qˆ!Ý�q‰>Œ>€DØð ØˆtØ�J€BˆˆBØ	ñ Ý�# Ð%Ñ%Ô%ˆð	Ý˜Ÿš�t B™xœx¨!¨Q©$°©)°R©Ñ8Ô8¸!Ñ<Ô<ˆDˆDøÝð 	ð 	ð 	Ø�4�4ð	øøøà�;Š;‰=Œ=˜AÒÐØŸšÑ*Ô*‰JˆB��BØ�!‰GˆBÝ˜˜A™  "¡ R¡™Ñ(Ô(×/Ò/°Ñ2Ô2ð Ý˜�T !™WœW r¨1¨R©4¡yÑ0°1Ñ4Ñ4Ñ5Ô5�Ø”;ð KÝ ¥¤°×0FÒ0FÑ0HÔ0HÑ!IÔ!IÑJÔJ�AØ�ðð ð Ððð s   Á:B Â
BÂBc                 ó�  — t          |¦  «        }| |z   }t          |¦  «        t          |¦  «        dz   k     s
|dz  j        r„t          |¦  «        t          |¦  «        }}||cxk    rdk    rn ndx}}|t          | |z   ¦  «        z  |t          | |z
  ¦  «        z  z   t          d¦  «        z  dz  }|                     ¦   «         S dS )z~Helper that denest
    $\sqrt{a + b \sqrt{r}}, d^2 = a^2 - b^2 r > 0$

    If it cannot be denested, it returns ``None``.
    r   r6   rˆ   N)r   r"   r   r   Úexpand)	r?   r@   rb   r›   rƒ   ÚsÚs1Ús2r_   s	            r   r•   r•   »  sÇ   € õ 	ˆR‰Œ€AØ	ˆA‰€Aõ
 �!�}„}•z !‘}”} qÑ(Ò(Ð(¨Q°©TÔ,>Ð(Ý�a‘”�$˜q™'œ'ˆBˆØ�ˆ>ˆ>Š>ˆ>�rŠ>ˆ>ˆ>ˆ>ˆ>ØˆKˆB�Ø•D˜˜Q™‘K”KÑ "¥t¨A°©E¡{¤{Ñ"2Ñ2µd¸1±g´gÑ=ÀÑAˆØ�zŠz‰|Œ|Ðð )Ð(r   c           	      óŠ  — ddl m}m} |dk    s |dk     s|rt          | j        ¦  «        dk     rdS |||fD ]#}|j        D ]}|dz  }	|	j        r|	j        s  dS ŒŒ$t          t          t           ||¦  «        ¦  «        ¦  «        ¦  «        }
t          |
¦  «        dk    rdS |dz  |
dz  z   |dz  |
dz  z
  g\  }}||fD ]„}t          t          |¦  «        ¦  «        }t          |¦  «        dk    rŒ2 ||t          d|z  ¦  «        ¦  «        \  }}||z  }||t          |¦  «        z  z   }|dk     r| }t          |¦  «        c S dS )aÆ  denest expr = sqrt(a + b*sqrt(r))
    where a, b, r are linear combinations of square roots of
    positive rationals on the rationals (SQRR) and r > 0, b != 0,
    d2 = a**2 - b**2*r > 0

    If it cannot denest it returns None.

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

    Search for a solution A of type SQRR of the biquadratic equation
    4*A**4 - 4*a*A**2 + b**2*r = 0                               (1)
    sqd = sqrt(a**2 - b**2*r)
    Choosing the sqrt to be positive, the possible solutions are
    A = sqrt(a/2 +/- sqd/2)
    Since a, b, r are SQRR, then a**2 - b**2*r is a SQRR,
    so if sqd can be denested, it is done by
    _sqrtdenest_rec, and the result is a SQRR.
    Similarly for A.
    Examples of solutions (in both cases a and sqd are positive):

      Example of expr with solution sqrt(a/2 + sqd/2) but not
      solution sqrt(a/2 - sqd/2):
      expr = sqrt(-sqrt(15) - sqrt(2)*sqrt(-sqrt(5) + 5) - sqrt(3) + 8)
      a = -sqrt(15) - sqrt(3) + 8; sqd = -2*sqrt(5) - 2 + 4*sqrt(3)

      Example of expr with solution sqrt(a/2 - sqd/2) but not
      solution sqrt(a/2 + sqd/2):
      w = 2 + r2 + r3 + (1 + r3)*sqrt(2 + r2 + 5*r3)
      expr = sqrt((w**2).expand())
      a = 4*sqrt(6) + 8*sqrt(2) + 47 + 28*sqrt(3)
      sqd = 29 + 20*sqrt(3)

    Define B = b/2*A; eq.(1) implies a = A**2 + B**2*r; then
    expr**2 = a + b*sqrt(r) = (A + B*sqrt(r))**2

    Examples
    ========

    >>> from sympy import sqrt
    >>> from sympy.simplify.sqrtdenest import _sqrt_match, sqrt_biquadratic_denest
    >>> z = sqrt((2*sqrt(2) + 4)*sqrt(2 + sqrt(2)) + 5*sqrt(2) + 8)
    >>> a, b, r = _sqrt_match(z**2)
    >>> d2 = a**2 - b**2*r
    >>> sqrt_biquadratic_denest(z, a, b, r, d2)
    sqrt(2) + sqrt(sqrt(2) + 2) + 2
    r   )r†   r‡   r6   Nr   )rS   r†   r‡   r"   r-   r,   r3   rP   r   rI   r   )r   r?   r@   rb   r›   r†   r‡   r%   r    Úy2Úsqdrj   Úx2ÚAÚBnÚBdÚBrH   s                     r   r—   r—   Ï  s   € ð` @Ð?Ð?Ð?Ð?Ð?Ð?Ð?ØˆA‚v€v��a’�˜q�¥J¨t¬yÑ$9Ô$9¸AÒ$=Ð$=ØˆtØ��AˆYð ð ˆØ”ð 	ð 	ˆAØ�A‘ˆBØ”=ð ¨¬ð Ø�t�t�tðð	õ •:�d 7 7¨2¡;¤;Ñ/Ô/Ñ0Ô0Ñ
1Ô
1€CÝ�#�„˜ÒÐØˆtØ�‰c�C˜‘E‰k˜1˜Q™3  Q¡™;Ð'�F€Bˆà�"ˆXð 	ð 	ˆÝ•t˜A‘w”wÑÔˆÝ�a‰=Œ=˜1ÒÐØØ � ¥H¨Q¨q©S¡M¤MÑ2Ô2‰ˆˆBØˆr‰EˆØ�•$�q‘'”'‘	‰MˆØˆqŠ5ˆ5Ø�ˆAÝ˜‰{Œ{ÐÐÐØˆ4r   c                 óž	  ‡ ‡‡— ddl m} ||k    rdS |d         €dS |d         €Ýt          d„ ‰ D ¦   «         ¦  «        rÄt          t	          ‰ ¦  «        ¦  «        D ]Št          t          ˆˆ fd„t          t	          ‰¦  «        ¦  «        D ¦   «         Ž ¦  «        }‰                     d¦  «        dk    r‰d         r| }t          |¦  «        }|j
        r|‰fc S Œ€t          ‰ d         ¦  «        dgt	          ‰ ¦  «        z  fS dŠ|d         �#|dd	…         g}|d	         Š|d
         ‰g}d|d<   n�t          t          dd„ ‰ D ¦   «         ¦  «        ¦  «        }|D ])}	|	d	         r‰�‰|	d	         k    rd|d<    dS Œ!|	d	         ŠŒ*‰€(t          ‰ d         ¦  «        dgt	          ‰ ¦  «        z  fS ˆfd„|D ¦   «         ‰gz   }t          |||dz   |¦  «        \  }
Š‰sdS t          ˆfd„t          t	          ‰ ¦  «        ¦  «        D ¦   «         ¦  «        s8|d         }	t          |	d         t          |	d         |
z  ¦  «        z   ¦  «        ‰fS t          ˆˆ fd„t          t	          ‰ ¦  «        ¦  «        D ¦   «         Ž }t          |¦  «        }	d‰v rY‰                     d¦  «        t	          ‰ ¦  «        dz
  k     r0‰t	          ‰ ¦  «        dz
           r|	d          |	d<   |	d          |	d<   ‰t	          ‰ ¦  «                 �st          |	d         |
z   ¦  «        }|dk    r(t          ‰ d         ¦  «        dgt	          ‰ ¦  «        z  fS t#          |¦  «        t#          ‰¦  «        dz   k    s|d	z  j        sd|d<   dS t'          t          |¦  «        d¬¦  «        }t#          |¦  «        t#          ‰¦  «        dz   k    sd|d<   dS  |d|z  ¦  «        }t          |t          d	¦  «        z  |	d         t          ‰¦  «        z  |z  t          d	¦  «        z  z   ¦  «        }|‰fS t          |	d         ‰z  ¦  «        |
z   }|dk    r(t          ‰ d         ¦  «        dgt	          ‰ ¦  «        z  fS t)          t          ‰¦  «        d¦  «        t          |¦  «        }}t          |t          d	¦  «        |z  z  |	d         |z  t          d	¦  «        |z  z  z   ¦  «        ‰fS )a„  Denests a list of expressions that contain nested square roots.

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

    Algorithm based on <http://www.almaden.ibm.com/cs/people/fagin/symb85.pdf>.

    It is assumed that all of the elements of 'nested' share the same
    bottom-level radicand. (This is stated in the paper, on page 177, in
    the paragraph immediately preceding the algorithm.)

    When evaluating all of the arguments in parallel, the bottom-level
    radicand only needs to be denested once. This means that calling
    _denester with x arguments results in a recursive invocation with x+1
    arguments; hence _denester has polynomial complexity.

    However, if the arguments were evaluated separately, each call would
    result in two recursive invocations, and the algorithm would have
    exponential complexity.

    This is discussed in the paper in the middle paragraph of page 179.
    r   r’   )NNr   Nc              3   ó$   K  — | ]}|j         V — Œd S r    )rT   )r$   r>   s     r   r&   z_denester.<locals>.<genexpr>6  s$   è è € Ð,Ð, �”Ð,Ð,Ð,Ð,Ð,Ð,r   c                 ó0   •— g | ]}‰|         ¯
‰|         ‘ŒS r9   r9   ©r$   rG   ÚfÚnesteds     €€r   r:   z_denester.<locals>.<listcomp>8  s&   ø€ ÐHÐHÐH¨QÀ1ÀQÄ4ÐH˜v aœyÐHÐHÐHr   rˆ   r6   r7   c                 ó,   — g | ]}t          |¦  «        ‘ŒS r9   )rl   )r$   r   s     r   r:   z_denester.<locals>.<listcomp>H  s    € Ð'MÐ'MÐ'M¸d­°DÑ(9Ô(9Ð'MÐ'MÐ'Mr   c                 óx   •— g | ]6}t          |d          dz  ¦  «        t          ‰|d         dz  z  ¦  «        z
  ‘Œ7S )r   r6   r   )r   )r$   rc   ÚRs     €r   r:   z_denester.<locals>.<listcomp>T  sU   ø€ ð <ð <ð <Ø/0õ    !¤ a¡Ñ(Ô(Ý  ! A¤$¨¡'¡	Ñ*Ô*ñ+ð <ð <ð <r   c              3   ó(   •K  — | ]}‰|         V — Œd S r    r9   )r$   rG   rÂ   s     €r   r&   z_denester.<locals>.<genexpr>Y  s'   øè è € Ð4Ð4˜A�1�Q”4Ð4Ð4Ð4Ð4Ð4Ð4r   c                 ó0   •— g | ]}‰|         ¯
‰|         ‘ŒS r9   r9   rÁ   s     €€r   r:   z_denester.<locals>.<listcomp>]  s&   ø€ ÐDÐDÐD A¸qÀ¼tÐD�f˜Q”iÐDÐDÐDr   F)r™   r“   )r”   r†   r4   r=   r}   r   r   rD   Úcountr   r   rW   Úfilterr˜   Úanyrl   Úindexr"   rT   r   r   )rÃ   rž   ÚhÚmax_depth_levelr†   r/   ÚsqpÚvaluesÚnested2rc   rƒ   ÚvadÚsqvadÚsqvad1r_   rµ   ÚFRr³   rÆ   rÂ   s   `                 @@r   r˜   r˜     s  øøø€ ð. 0Ð/Ð/Ð/Ð/Ð/Øˆ?ÒÐØˆzØ
ˆ1„v€~ØˆzØˆAŒˆÝÐ,Ð, VÐ,Ñ,Ô,Ñ,Ô,ð 	å�#˜f™+œ+Ñ&Ô&ð 	ð 	ˆAÝ�ÐHÐHÐHÐHÐHµ%½¸A¹¼±-´-ÐHÑHÔHÐIÑJÔJˆAØ�wŠw�q‰zŒz˜AŠ~ˆ~ ! B¤%ˆ~Ø�B�Ý�q‘'”'ˆCØŒð Ø˜A�v���ðõ �F˜2”JÑÔ ! ¥S¨¡[¤[¡Ð0Ð0àˆØˆqŒ6ÐØ˜"˜1˜"”g�YˆFØ�A”ˆAØ˜1”v˜q�kˆGØˆC�‰FˆFå�& Ð'MÐ'MÀfÐ'MÑ'MÔ'MÑNÔNÑOÔOˆFØð !ð !�Ø�Q”4ð !Ø�}Ø  !¤š9˜9Ø%)˜C ™FØ#- : :ð %ð ˜aœD˜øØˆyå˜F 2œJÑ'Ô'¨!¨­S°©[¬[©Ð8Ð8ð<ð <ð <ð <Ø4:ð<ñ <ô <Ø?@¸cñBˆGå˜ # q¨1¡u¨oÑ>Ô>‰ˆˆ1Øð 	Ø�:ÝÐ4Ð4Ð4Ð4¥¥s¨6¡{¤{Ñ!3Ô!3Ð4Ñ4Ô4Ñ4Ô4ð !	IØ�r”
ˆAÝ˜˜!œ�x¨¨!¬¨Q©Ñ/Ô/Ñ/Ñ0Ô0°!Ð3Ð3åÐDÐDÐDÐDÐD­­s°6©{¬{Ñ);Ô);ÐDÑDÔDÐEˆAÝ˜A‘”ˆAØ�Aˆvˆv˜!Ÿ'š' !™*œ*¥s¨6¡{¤{°Q¡Ò6Ð6¸1½SÀ¹[¼[È1¹_Ô;MÐ6Ø˜!œ�u��!‘Ø˜!œ�u��!‘Ø•S˜‘[”[”>ñ IÝ˜q œt a™xÑ(Ô(�Ø˜!’8�8å  r¤
Ñ+Ô+¨a¨Sµ°V±´©_Ð<Ð<Ý! #‘”­*°Q©-¬-¸!Ñ*;Ò;Ð;Ø˜Q™Ô)ð <à!�C˜‘FØ%˜:å$¥T¨#¡Y¤Y¸Ð?Ñ?Ô?�Ý" 5Ñ)Ô)­Z¸©]¬]¸QÑ->Ò>Ð>Ø!�C˜‘FØ%˜:Ø ˜  5¡Ñ)Ô)�Ý˜u¥T¨!¡W¤W™}°°!´µT¸!±W´W±¸VÑ0CÅDÈÁGÄGÑ0KÑLÑMÔM�Ø˜A�v�õ ˜a œd 1™fÑ%Ô%¨Ñ)�Ø˜’7�7Ý  r¤
Ñ+Ô+¨a¨Sµ°V±´©_Ð<Ð<Ý�X a™[œ[¨!Ñ,Ô,­d°2©h¬h�A�Ý ¥4¨¡7¤7¨2¡:¡°°1´°b±½$¸q¹'¼'À!¹)Ñ1DÑ DÑEÔEÀqÐHÐHr   c                 óH  — ddl m} d„ } ||¦  «        }|€!t          d„ t          | |¦  «        D ¦   «         Ž S |\  }}}|                      |¦  «        }|                     |¦  «         ||         }	| |xx          |||z  |	j        z  ¦  «        z  cc<   t          | |¦  «        S )a#  Denest rational combinations of radicals.

    Based on section 5 of [1].

    Examples
    ========

    >>> from sympy import sqrt
    >>> from sympy.simplify.sqrtdenest import sqrtdenest
    >>> z = sqrt(1+sqrt(3)) + sqrt(3+3*sqrt(3)) - sqrt(10+6*sqrt(3))
    >>> sqrtdenest(z)
    0
    r   r’   c                 óB  — t          | ¦  «        }t          |dz
  ¦  «        D ]|}t          |dz   |¦  «        D ]f}| |         j        }| |         j        }t          ||z  ¦  «        }t	          t          |¦  «        ¦  «        }|t          |¦  «        k    r	|||fc c S ŒgŒ}d S )Nr   )r}   rD   r-   r   rI   r   )r?   r>   rG   Újr´   rµ   r/   r³   s           r   Úfindz_sqrt_ratcomb.<locals>.findŽ  s±   € Ý�‰FŒFˆÝ�q˜1‘u‘”ð 	#ð 	#ˆAÝ˜1˜q™5 !‘_”_ð #ð #�Ø�q”T”Y�Ø�q”T”Y�Ý˜R "™WÑ%Ô%�Ý�t A™wœwÑ'Ô'�Ø�˜Q™œ’<�<Ø˜a ˜7�N�N�N�N�Nð  ð#ð	#ð 	#r   Nc                 ó   — g | ]
\  }}||z  ‘ŒS r9   r9   )r$   rx   rz   s      r   r:   z!_sqrt_ratcomb.<locals>.<listcomp>›  s    € Ð9Ð9Ð9¡  C�Q˜‘WÐ9Ð9Ð9r   )rS   r†   r   ÚziprY   r-   r�   )
r„   r,   r†   rÙ   Úindicesr³   Úi1Úi2rŠ   rB   s
             r   r�   r�   }  sÊ   € ð /Ð.Ð.Ð.Ð.Ð.ð	#ð 	#ð 	#ð ˆd�4‰jŒj€GØ€ÝÐ9Ð9­3¨r°4©=¬=Ð9Ñ9Ô9Ð:Ð:à�I€A€rˆ2à	�Š�‰Œ€BØ‡H‚HˆR�L„L€LØ	ˆbŒ€Bð €r€F€F„Fˆgˆg�b˜1‘f˜rœwÑ&Ñ'Ô'Ñ'€F€F�Få˜˜TÑ"Ô"Ð"r   N)r7   )T)&Ú
sympy.corer   r   r   r   r   Úsympy.core.functionr   r	   r
   Úsympy.core.sortingr   Úsympy.core.symbolr   Úsympy.functionsr   r   r   Úsympy.polysr   r   r   Úintr"   r2   r=   rI   rl   ÚStopIterationrn   rE   r~   r   r–   r•   r—   r˜   r�   r9   r   r   ú<module>rç      sÚ  ðØ 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ø /Ð /Ð /Ð /Ð /Ð /Ø #Ð #Ð #Ð #Ð #Ð #Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø -Ð -Ð -Ð -Ð -Ð -Ð -Ð -ðLð Lð Lð�Sð ð ð ð ð:ð ð ð8ð ð ð:!ð !ð !ð !ðHLð Lð Lð^	ð 	ð 	ð 	ð 	˜mñ 	ô 	ð 	ð"ð "ð "ðJ=ð =ð =ð@8ð 8ð 8ð 8ðv<ð <ð <ð~ð ð ð(Gð Gð GðTaIð aIð aIðH)#ð )#ð )#ð )#ð )#r   