§
    OŠtjm,  ã                   óÀ   — d 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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„ Zd„ Zd„ Zd„ Zed„ ¦   «         ZdS )z0Tools for constructing domains for expressions. é    )Úprod)Úsympify)Úpure_complex)Úordered)ÚZZÚQQÚZZ_IÚQQ_IÚEX)ÚComplexField)Ú	RealField)Úbuild_options)Úparallel_dict_from_basic)Úpublicc                 óè  ‡— dx}x}x}}g }|j         du rd„ }nd„ }| D ]¾}|j        r
|j        sd}Œ|j        r|r dS d}|                     |¦  «         Œ7t          |¦  «        }	|	rad}|	\  }
}|
j        r|j        r|
j        r|j        sd}Œnd}|
j        r|                     |
¦  «         |j        r|                     |¦  «         Œ© ||¦  «        r|r dS d}Œ¼ dS |rt          d„ |D ¦   «         ¦  «        nd}|rt          | |¦  «        \  Š}n`|r|rt          |¬¦  «        Šn=|rt          |¬¦  «        Šn*|s|j
        r|rt          nt          Šn|rt          nt          Šˆfd	„| D ¦   «         }‰|fS )
z?Handle simple domains, e.g.: ZZ, QQ, RR and algebraic domains. FTc                 ó   — | j         o| j        S ©N©Ú	is_numberÚis_algebraic©Úcoeffs    úU/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/sympy/polys/constructor.pyú<lambda>z#_construct_simple.<locals>.<lambda>   s   €  U¤_Ð%K¸Ô9K€ ó    c                 ó   — dS )NF© r   s    r   r   z#_construct_simple.<locals>.<lambda>   s   €  U€ r   Nc              3   ó$   K  — | ]}|j         V — Œd S r   ©Ú_prec©Ú.0Úcs     r   ú	<genexpr>z$_construct_simple.<locals>.<genexpr>>   ó$   è è € Ð2Ð2˜q�1”7Ð2Ð2Ð2Ð2Ð2Ð2r   é5   ©Úprecc                 ó:   •— g | ]}‰                      |¦  «        ‘ŒS r   )Ú
from_sympy)r"   r   Údomains     €r   ú
<listcomp>z%_construct_simple.<locals>.<listcomp>L   s'   ø€ Ð?Ð?Ð?¨u�&×#Ò# EÑ*Ô*Ð?Ð?Ð?r   )Ú	extensionÚis_RationalÚ
is_IntegerÚis_FloatÚappendr   ÚmaxÚ_construct_algebraicr   r   Úfieldr
   r   r	   r   )ÚcoeffsÚoptÚ	rationalsÚfloatsÚ	complexesÚ
algebraicsÚfloat_numbersr   r   Ú
is_complexÚxÚyÚmax_precÚresultr+   s                 @r   Ú_construct_simplerA      s3  ø€ à27Ð7€IÐ7�Ð7˜ ZØ€Mà
„}˜ÐÐØKÐKˆˆà*Ð*ˆàð !ð !ˆØÔð  	ØÔ#ð !Ø �	øØŒ^ð 	Øð ,à�u�uà�Ø×$Ò$ UÑ+Ô+Ð+Ð+å% eÑ,Ô,ˆJØð Ø �	Ø!‘��1Ø”=ð 	0 Q¤]ð 	0ØœLð )¨Q¬\ð )Ø$(˜	Øà!�FØ”zð 0Ø%×,Ò,¨QÑ/Ô/Ð/Ø”zð 0Ø%×,Ò,¨QÑ/Ô/Ð/øØ�˜eÑ$Ô$ð Øð !à ˜5˜5Ø!�
�
ð �t�tð 7DÐK�sÐ2Ð2 MÐ2Ñ2Ô2Ñ2Ô2Ð2È€Hàð @Ý-¨f°cÑ:Ô:‰ˆ��àð 	/�ið 	/Ý! xÐ0Ñ0Ô0ˆFˆFØð 	/Ý HÐ-Ñ-Ô-ˆFˆFØð 	/˜#œ)ð 	/Ø&Ð.•T�T­BˆFˆFà&Ð.•T�T­BˆFà?Ð?Ð?Ð?¸Ð?Ñ?Ô?ˆà�6ˆ>Ðr   c                 óî  ‡	‡
‡‡‡‡— ddl m} t          ¦   «         Šˆ	ˆfd„Š	 ‰	| ¦  «        }t          t	          ‰¦  «        ¦  «        Š |‰dd¬¦  «        \  Š}}t          d„ t          |‰¦  «        D ¦   «         ¦  «        }t          j        ‰|f¦  «        ‰j	         
                    ¦   «         cŠŠˆˆfd„|D ¦   «         }t          t          ‰|¦  «        ¦  «        Šˆ
ˆˆˆfd„Š
ˆ
fd	„|D ¦   «         }‰|fS )
zDWe know that coefficients are algebraic so construct the extension. r   )Úprimitive_elementc                 ó  •— g }| D ]‚}|j         rdt          j        |¦  «        f}nM|j        rd ‰|j        ¦  «        f}n3|j        rd ‰|j        ¦  «        f}nd|f}‰                     |¦  «         |                     |¦  «         Œƒ|S )NÚQú+Ú*Úe)r.   r   r*   Úis_AddÚargsÚis_MulÚaddr1   )rJ   ÚtreesÚaÚtreeÚbuild_treesÚextss       €€r   rP   z)_construct_algebraic.<locals>.build_treesW   s­   ø€ ØˆØð 
	ð 
	ˆAØŒ}ð Ø�Rœ]¨1Ñ-Ô-Ð.��Ø”ð Ø˜[˜[¨¬Ñ0Ô0Ð1��Ø”ð Ø˜[˜[¨¬Ñ0Ô0Ð1��à˜Q�x�Ø—’˜‘”�Ø�LŠL˜ÑÔÐÐØˆr   T)ÚexÚpolysc              3   ó&   K  — | ]\  }}||z  V — Œd S r   r   )r"   ÚsÚexts      r   r$   z'_construct_algebraic.<locals>.<genexpr>j   s*   è è € Ð3Ð3™˜˜Cˆq�‰uÐ3Ð3Ð3Ð3Ð3Ð3r   c                 óR   •— g | ]#}‰j                              |‰t          ¦  «        ‘Œ$S r   )ÚdtypeÚ	from_listr   )r"   Úhr+   Úgs     €€r   r,   z(_construct_algebraic.<locals>.<listcomp>n   s-   ø€ Ð<Ð<Ð<°Q�”×&Ò& q¨!­RÑ0Ô0Ð<Ð<Ð<r   c                 ó  •— | \  }}|dk    r"‰j                              |g‰t          ¦  «        S |dk    r!t          ˆfd„|D ¦   «         ‰j        ¦  «        S |dk    rt          ˆfd„|D ¦   «         ¦  «        S |dk    r‰|         S t          ‚)NrE   rF   c              3   ó.   •K  — | ]} ‰|¦  «        V — Œd S r   r   ©r"   rN   Úconvert_trees     €r   r$   z=_construct_algebraic.<locals>.convert_tree.<locals>.<genexpr>v   ó+   øè è € Ð6Ð6¨A˜˜ Q™œÐ6Ð6Ð6Ð6Ð6Ð6r   rG   c              3   ó.   •K  — | ]} ‰|¦  «        V — Œd S r   r   r^   s     €r   r$   z=_construct_algebraic.<locals>.convert_tree.<locals>.<genexpr>x   r`   r   rH   )rX   rY   r   ÚsumÚzeror   ÚRuntimeError)rO   ÚoprJ   r_   r+   Úexts_mapr[   s      €€€€r   r_   z*_construct_algebraic.<locals>.convert_treeq   s¦   ø€ Ø‰ˆˆDØ�Š9ˆ9Ø”<×)Ò)¨4¨&°!µRÑ8Ô8Ð8Ø�3ŠYˆYÝÐ6Ð6Ð6Ð6°Ð6Ñ6Ô6¸¼ÑDÔDÐDØ�3ŠYˆYÝÐ6Ð6Ð6Ð6°Ð6Ñ6Ô6Ñ6Ô6Ð6Ø�3ŠYˆYØ˜D”>Ð!åÐr   c                 ó&   •— g | ]} ‰|¦  «        ‘ŒS r   r   )r"   rO   r_   s     €r   r,   z(_construct_algebraic.<locals>.<listcomp>~   s#   ø€ Ð3Ð3Ð3 Tˆlˆl˜4Ñ Ô Ð3Ð3Ð3r   )Úsympy.polys.numberfieldsrC   ÚsetÚlistr   rb   Úzipr   Úalgebraic_fieldÚrepÚto_listÚdict)r5   r6   rC   rM   ÚspanÚHÚrootÚexts_domr@   rP   r_   r+   rQ   rf   r[   s            @@@@@@r   r3   r3   Q   sJ  øøøøøø€ à:Ð:Ð:Ð:Ð:Ð:å‰5Œ5€Dðð ð ð ð ð ð ˆK˜ÑÔ€EÝ•˜‘”ÑÔ€Dà"Ð" 4¨D¸Ð=Ñ=Ô=�J€A€tˆQÝÐ3Ð3¥3 t¨T¡?¤?Ð3Ñ3Ô3Ñ3Ô3€DåÔ" A t 9Ñ-Ô-¨q¬u¯}ª}©¬€I€FˆAà<Ð<Ð<Ð<Ð<¸!Ð<Ñ<Ô<€HÝ•C˜˜hÑ'Ô'Ñ(Ô(€Hðð ð ð ð ð ð ð ð 4Ð3Ð3Ð3¨UÐ3Ñ3Ô3€Fà�6ˆ>Ðr   c                 ó:  — g g }}| D ]C}|                      ¦   «         \  }}|                     |¦  «         |                     |¦  «         ŒDt          ||z   ¦  «        \  }}|sdS |j        €Bt	          d„ |D ¦   «         ¦  «        rdS t          ¦   «         }	|D ]}
|
j        }|	|z  r dS |	|z  }	Œt          |¦  «        }t          |¦  «        dz  }|d|…         }||d…         }|j        rd}n'dd|z  }}|D ]}t          |¦  «        dk    s||vrd} nŒt          ¦   «         } |sXt          ||¦  «        D ]F\  }}||         }| 
                    ¦   «         D ]$\  }}||z  }|                      |¦  «         |||<   Œ%ŒGn~t          ||¦  «        D ]m\  }}|                      t          |                     ¦   «         ¦  «        ¦  «         |                      t          |                     ¦   «         ¦  «        ¦  «         Œndx}x}}g }| D ]£}|j        r
|j        sd}Œ|j        rd}|                     |¦  «         Œ2t%          |¦  «        }|�`d}|\  }}|j        r|j        r|j        r|j        sd}Œid}|j        r|                     |¦  «         |j        r|                     |¦  «         Œ¤|rt'          d„ |D ¦   «         ¦  «        nd	}|r|rt)          |¬
¦  «        }n8|rt+          |¬
¦  «        }n%|r|rt,          }nt.          }n|rt0          }nt2          }g }|s` |j        |Ž }|D ]R}| 
                    ¦   «         D ]\  }}|                     |¦  «        ||<   Œ|                      ||¦  «        ¦  «         ŒSn¤ |j        |Ž }t          ||¦  «        D ]‰\  }}| 
                    ¦   «         D ]\  }}|                     |¦  «        ||<   Œ| 
                    ¦   «         D ]\  }}|                     |¦  «        ||<   Œ|                      |||f¦  «        ¦  «         ŒŠ||fS )z<Handle composite domains, e.g.: ZZ[X], QQ[X], ZZ(X), QQ(X). Nc              3   ó2   K  — | ]}|j         o|j        V — Œd S r   r   )r"   Úgens     r   r$   z'_construct_composite.<locals>.<genexpr>’   s,   è è € ÐBÐB°cˆsŒ}Ð1 Ô!1ÐBÐBÐBÐBÐBÐBr   é   TF)r   é   c              3   ó$   K  — | ]}|j         V — Œd S r   r   r!   s     r   r$   z'_construct_composite.<locals>.<genexpr>×   r%   r   r&   r'   )Úas_numer_denomr1   r   Ú	compositeÚanyri   Úfree_symbolsÚlenr4   rk   ÚitemsrL   Úupdaterj   Úvaluesr.   r/   r0   r   r2   r   r   r
   r	   r   r   Ú	poly_ringr*   Ú
frac_field)r5   r6   ÚnumersÚdenomsr   ÚnumerÚdenomrS   ÚgensÚall_symbolsrv   ÚsymbolsÚnÚkÚ	fractionsÚzerosÚmonomr7   r8   r9   r;   r<   r=   r>   r?   Úgroundr@   r+   s                               r   Ú_construct_compositer‘   ƒ   s"  € à˜ˆF€Fàð ð ˆØ×+Ò+Ñ-Ô-‰ˆˆuà�Š�eÑÔÐØ�Š�eÑÔÐÐå*¨6°F©?Ñ;Ô;�K€Eˆ4Øð Øˆtà
„}ÐÝÐBÐB¸TÐBÑBÔBÑBÔBð 	Ø�4å‘e”eˆàð 	'ð 	'ˆCØÔ&ˆGà˜WÑ$ð 'Ø�t�tà˜wÑ&��åˆD‰	Œ	€AÝˆE‰
Œ
�A‰€Aà�2�A�2ŒY€FØ�1�2�2ŒY€Fà
„yð Øˆ	ˆ	à  $ q¡&�5ˆ	àð 	ð 	ˆEÝ�5‰zŒz˜AŠ~ˆ~ ¨eÐ!3Ð!3Ø �	Ø�ð "4õ ‰UŒU€Fàð 0Ý ¨Ñ/Ô/ð 	%ð 	%‰LˆE�5Ø˜%”LˆEà %§¢¡¤ð %ð %‘��uØ˜‘�Ø—
’
˜5Ñ!Ô!Ð!Ø$��e‘�ð%ð	%õ   ¨Ñ/Ô/ð 	0ð 	0‰LˆE�5Ø�MŠM�$˜uŸ|š|™~œ~Ñ.Ô.Ñ/Ô/Ð/Ø�MŠM�$˜uŸ|š|™~œ~Ñ.Ô.Ñ/Ô/Ð/Ð/à%*Ð*€IÐ*�˜Ø€Màð 0ð 0ˆØÔð 	0ØÔ#ð !Ø �	øØŒ^ð 	0ØˆFØ× Ò  Ñ'Ô'Ð'Ð'å% eÑ,Ô,ˆJØÐ%Ø �	Ø!‘��1Ø”=ð 0 Q¤]ð 0ØœLð )¨Q¬\ð )Ø$(˜	øà!�FØ”zð 0Ø%×,Ò,¨QÑ/Ô/Ð/Ø”zð 0Ø%×,Ò,¨QÑ/Ô/Ð/øà6CÐK�sÐ2Ð2 MÐ2Ñ2Ô2Ñ2Ô2Ð2È€Hàð �)ð Ý 8Ð,Ñ,Ô,ˆˆØ	ð 
Ý Ð)Ñ)Ô)ˆˆØ	ð Øð 	ÝˆFˆFåˆFˆFØ	ð Ýˆˆåˆà€Fàð 2Ø!�Ô! 4Ð(ˆàð 	)ð 	)ˆEØ %§¢¡¤ð 8ð 8‘��uØ%×0Ò0°Ñ7Ô7��e‘�à�MŠM˜&˜& ™-œ-Ñ(Ô(Ð(Ð(ð		)ð #�Ô" DÐ)ˆå ¨Ñ/Ô/ð 	2ð 	2‰LˆE�5Ø %§¢¡¤ð 8ð 8‘��uØ%×0Ò0°Ñ7Ô7��e‘�à %§¢¡¤ð 8ð 8‘��uØ%×0Ò0°Ñ7Ô7��e‘�à�MŠM˜&˜& %¨ Ñ0Ô0Ñ1Ô1Ð1Ð1à�6ˆ>Ðr   c                 óv   — t           g }}| D ]*}|                     |                     |¦  «        ¦  «         Œ+||fS )z6The last resort case, i.e. use the expression domain. )r   r1   r*   )r5   r6   r+   r@   r   s        r   Ú_construct_expressionr“      sG   € å˜ˆF€Fàð 0ð 0ˆØ�Š�f×'Ò'¨Ñ.Ô.Ñ/Ô/Ð/Ð/à�6ˆ>Ðr   c           	      óÆ  — t          |¦  «        }t          | d¦  «        rXt          | t          ¦  «        r@| sg g }}n?t	          t          t	          |                      ¦   «         ¦  «        Ž ¦  «        \  }}n| }n| g}t	          t          t          |¦  «        ¦  «        }t          ||¦  «        }|�|dur|\  }}nKt          ||¦  «        \  }}n7|j        du rd}nt          ||¦  «        }|�|\  }}nt          ||¦  «        \  }}t          | d¦  «        rEt          | t          ¦  «        r,|t          t	          t          ||¦  «        ¦  «        ¦  «        fS ||fS ||d         fS )aT	  Construct a minimal domain for a list of expressions.

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

    Given a list of normal SymPy expressions (of type :py:class:`~.Expr`)
    ``construct_domain`` will find a minimal :py:class:`~.Domain` that can
    represent those expressions. The expressions will be converted to elements
    of the domain and both the domain and the domain elements are returned.

    Parameters
    ==========

    obj: list or dict
        The expressions to build a domain for.

    **args: keyword arguments
        Options that affect the choice of domain.

    Returns
    =======

    (K, elements): Domain and list of domain elements
        The domain K that can represent the expressions and the list or dict
        of domain elements representing the same expressions as elements of K.

    Examples
    ========

    Given a list of :py:class:`~.Integer` ``construct_domain`` will return the
    domain :ref:`ZZ` and a list of integers as elements of :ref:`ZZ`.

    >>> from sympy import construct_domain, S
    >>> expressions = [S(2), S(3), S(4)]
    >>> K, elements = construct_domain(expressions)
    >>> K
    ZZ
    >>> elements
    [2, 3, 4]
    >>> type(elements[0])  # doctest: +SKIP
    <class 'int'>
    >>> type(expressions[0])
    <class 'sympy.core.numbers.Integer'>

    If there are any :py:class:`~.Rational` then :ref:`QQ` is returned
    instead.

    >>> construct_domain([S(1)/2, S(3)/4])
    (QQ, [1/2, 3/4])

    If there are symbols then a polynomial ring :ref:`K[x]` is returned.

    >>> from sympy import symbols
    >>> x, y = symbols('x, y')
    >>> construct_domain([2*x + 1, S(3)/4])
    (QQ[x], [2*x + 1, 3/4])
    >>> construct_domain([2*x + 1, y])
    (ZZ[x,y], [2*x + 1, y])

    If any symbols appear with negative powers then a rational function field
    :ref:`K(x)` will be returned.

    >>> construct_domain([y/x, x/(1 - y)])
    (ZZ(x,y), [y/x, -x/(y - 1)])

    Irrational algebraic numbers will result in the :ref:`EX` domain by
    default. The keyword argument ``extension=True`` leads to the construction
    of an algebraic number field :ref:`QQ(a)`.

    >>> from sympy import sqrt
    >>> construct_domain([sqrt(2)])
    (EX, [EX(sqrt(2))])
    >>> construct_domain([sqrt(2)], extension=True)  # doctest: +SKIP
    (QQ<sqrt(2)>, [ANP([1, 0], [1, 0, -2], QQ)])

    See also
    ========

    Domain
    Expr
    Ú__iter__NFr   )r   ÚhasattrÚ
isinstancero   rj   rk   r   Úmapr   rA   r“   r{   r‘   )ÚobjrJ   r6   Úmonomsr5   r@   r+   s          r   Úconstruct_domainr›   
  s  € õf ˜Ñ
Ô
€Cåˆs�JÑÔð 	Ý�c�4Ñ Ô ð 	Øð ?Ø!# R˜��å!%¥c­4°·	²	±´Ñ+<Ô+<Ð&=Ñ!>Ô!>‘�˜˜àˆFˆFà�ˆå•#•g˜vÑ&Ô&Ñ'Ô'€FÝ˜v sÑ+Ô+€FàÐØ˜ÐÐØ#‰NˆF�F�Få2°6¸3Ñ?Ô?‰NˆF�F�FàŒ=˜EÐ!Ð!ØˆFˆFå)¨&°#Ñ6Ô6ˆFàÐØ#‰NˆF�F�Få2°6¸3Ñ?Ô?‰NˆF�Fåˆs�JÑÔð !Ý�c�4Ñ Ô ð 	"Ø�4¥¥S¨°Ñ%8Ô%8Ñ 9Ô 9Ñ:Ô:Ð:Ð:à˜6�>Ð!à�v˜a”yÐ Ð r   N)Ú__doc__Úmathr   Ú
sympy.corer   Úsympy.core.evalfr   Úsympy.core.sortingr   Úsympy.polys.domainsr   r   r	   r
   r   Ú sympy.polys.domains.complexfieldr   Úsympy.polys.domains.realfieldr   Úsympy.polys.polyoptionsr   Úsympy.polys.polyutilsr   Úsympy.utilitiesr   rA   r3   r‘   r“   r›   r   r   r   ú<module>r§      sC  ðØ 6Ð 6Ø Ð Ð Ð Ð Ð à Ð Ð Ð Ð Ð Ø )Ð )Ð )Ð )Ð )Ð )Ø &Ð &Ð &Ð &Ð &Ð &Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø :Ð :Ð :Ð :Ð :Ð :Ø "Ð "Ð "Ð "Ð "Ð "ð?ð ?ð ?ðD/ð /ð /ðdzð zð zðzð ð ð ðx!ð x!ñ „ðx!ð x!ð x!r   