
    \hm,                         S r SSKJr  SSKJr  SSKJr  SSKJr  SSK	J
r
JrJrJrJr  SSKJr  SSKJr  SS	KJr  SS
KJr  SSKJr  S rS rS rS r\S 5       rg)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                    S=n=n=pE/ nUR                   SL a  S nOS nU  GH!  nUR                  (       a  UR                  (       d  SnM*  M,  UR                  (       a  U(       a    gSnUR	                  U5        M[  [        U5      n	U	(       a  SnU	u  pU
R                  (       a7  UR                  (       a&  U
R                  (       a  UR                  (       d  SnM  SnU
R                  (       a  UR	                  U
5        UR                  (       a  UR	                  U5        GM  GM  U" U5      (       a  U(       a    gSnGM"    g   U(       a  [        S U 5       5      OSnU(       a  [        X5      u  pX4$ U(       a  U(       a
  [        US9nOPU(       a
  [        US9nO?U(       d  UR                  (       a  U(       a  [        O[        nOU(       a  [        O[        nU  Vs/ s H  oR                  U5      PM     nnX4$ s  snf )	z?Handle simple domains, e.g.: ZZ, QQ, RR and algebraic domains. FTc                 @    U R                   =(       a    U R                  $ N	is_numberis_algebraiccoeffs    O/var/www/auris/envauris/lib/python3.13/site-packages/sympy/polys/constructor.py<lambda>#_construct_simple.<locals>.<lambda>   s    U__%K9K9K%K    c                     g)NF r   s    r   r   r      s    Ur   Nc              3   8   #    U  H  oR                   v   M     g 7fr   _prec.0cs     r   	<genexpr>$_construct_simple.<locals>.<genexpr>>        2Mq77M   5   prec)	extensionis_Rational
is_Integeris_Floatappendr   max_construct_algebraicr   r   fieldr
   r   r	   r   
from_sympy)coeffsopt	rationalsfloats	complexes
algebraicsfloat_numbersr   r   
is_complexxymax_precdomainresults                  r   _construct_simplerB      s   277I77M
}}K*## 	 $^^$$U+%e,J 	!==Q]]LLQ\\$(	!Fzz%,,Q/zz%,,Q/ "e$$ !
 C J 7Ds2M22H-f: > i!x0FH-F#))&TBF&TBF8>?u##E*?> @s   &Hc                   ^^^^^^ SSK Jn  [        5       mUU4S jmT" U 5      n[        [	        T5      5      mU" TSSS9u  mpE[        S [        UT5       5       5      n[        R                  " TU45      TR                  R                  5       smmU Vs/ s H$  nTR                  R                  UT[        5      PM&     nn[        [        TU5      5      mUUUU4S jmU V	s/ s H  n	T" U	5      PM     n
n	TU
4$ s  snf s  sn	f )zDWe know that coefficients are algebraic so construct the extension. r   )primitive_elementc                 V  > / nU  H  nUR                   (       a  S[        R                  " U5      4nOaUR                  (       a  ST" UR                  5      4nO;UR
                  (       a  ST" UR                  5      4nOSU4nTR                  U5        UR                  U5        M     U$ )NQ+*e)r-   r   r4   is_Addargsis_Muladdr0   )rK   treesatreebuild_treesextss       r   rQ   )_construct_algebraic.<locals>.build_treesW   s    A}}R]]1-.[01[01QxLL  r   T)expolysc              3   .   #    U  H  u  pX-  v   M     g 7fr   r   )r#   sexts      r   r%   '_construct_algebraic.<locals>.<genexpr>j   s     3?qu?s   c                    > U u  pUS:X  a"  TR                   R                  U/T[        5      $ US:X  a   [        U4S jU 5       TR                  5      $ US:X  a  [        U4S jU 5       5      $ US:X  a  TU   $ [        e)NrF   rG   c              3   4   >#    U  H  nT" U5      v   M     g 7fr   r   r#   rO   convert_trees     r   r%   =_construct_algebraic.<locals>.convert_tree.<locals>.<genexpr>v        6AQ   rH   c              3   4   >#    U  H  nT" U5      v   M     g 7fr   r   r\   s     r   r%   r^   x   r_   r`   rI   )dtype	from_listr   sumzeror   RuntimeError)rP   oprK   r]   r@   exts_mapgs      r   r]   *_construct_algebraic.<locals>.convert_treeq   sy    9<<))4&!R883Y66DD3Y66663YD>!r   )sympy.polys.numberfieldsrD   setlistr   rd   zipr   algebraic_fieldrepto_listrb   rc   dict)r5   r6   rD   rN   spanHroothexts_domrP   rA   rQ   r]   r@   rR   rh   ri   s              @@@@@@r   r2   r2   Q   s    :5D ED"4D=JAt33tT?33D""At9-quu}}IFA:;<!Q&&q!R0!H<Ch'(H  .33UTl4 UF36>% =  4s   +C?'Dc                    / / p2U  H7  nUR                  5       u  pVUR                  U5        UR                  U5        M9     [        X#-   5      u  pxU(       d  gUR                  cF  [	        S U 5       5      (       a  g[        5       n	U H  n
U
R                  nX-  (       a    gX-  n	M      [        U5      n[        U5      S-  nUSU nX}S nUR                  (       a  SnO'SSU-  pU H  n[        U5      S:  d  X;  d  M  Sn  O   [        5       n U(       dM  [        X#5       H=  u  pVUW   nUR                  5        H  u  nnXF-  nU R                  U5        XEU'   M!     M?     Od[        X#5       HU  u  pVU R                  [        UR                  5       5      5        U R                  [        UR                  5       5      5        MW     S=n=nn/ nU  H  nUR                  (       a  UR                   (       d  SnM)  M+  UR"                  (       a  SnUR                  U5        MQ  [%        U5      nUc  Ma  SnUu  nnUR                  (       a9  UR                  (       a(  UR                   (       a  UR                   (       d  SnM  M  SnUR"                  (       a  UR                  U5        UR"                  (       d  M  UR                  U5        M     U(       a  ['        S U 5       5      OS	nU(       a  U(       a
  [)        US
9nOAU(       a
  [+        US
9nO0U(       a  U(       a  [,        nO[.        nOU(       a  [0        nO[2        n/ nU(       da  UR4                  " U6 nU HH  nUR                  5        H  u  nnUR7                  U5      UU'   M     UR                  U" U5      5        MJ     UU4$ UR8                  " U6 n[        X#5       Hy  u  pVUR                  5        H  u  nnUR7                  U5      UU'   M     UR                  5        H  u  nnUR7                  U5      UU'   M     UR                  U" XV45      5        M{     UU4$ )z<Handle composite domains, e.g.: ZZ[X], QQ[X], ZZ(X), QQ(X). Nc              3   ^   #    U  H#  oR                   =(       a    UR                  v   M%     g 7fr   r   )r#   gens     r   r%   '_construct_composite.<locals>.<genexpr>   s      BTc}}1!1!11Ts   +-   TF)r      c              3   8   #    U  H  oR                   v   M     g 7fr   r    r"   s     r   r%   r{      r'   r(   r)   r*   )as_numer_denomr0   r   	compositeanyrl   free_symbolslenr3   rn   itemsrM   updaterm   valuesr-   r.   r/   r   r1   r   r   r
   r	   r   r   	poly_ringr4   
frac_field)r5   r6   numersdenomsr   numerdenomrU   gensall_symbolsrz   symbolsnk	fractionszerosmonomr7   r8   r9   r;   r<   r=   r>   r?   groundrA   r@   s                               r   _construct_compositer      s   F++-ee	  +6?;KE
}}BTBBBeC&&G$&  	D	AE
AA2AYF2YF
yy	 $q&5E5zA~!3 	 
 UF/LE%LE %u

5!$e !. 0  /LEMM$u||~./MM$u||~./ 0 &+*I*M## 	 $^^F  '%e,J% 	!1==Q]]LLQ\\$(	 .: "Fzz%,,Q/zzz%,,Q/) , 7Ds2M22H)8,	)	FF	F!!4(E %u%007e !. MM&-(	 " 6> ""D)/LE %u%007e !. !&u%007e !. MM&%01 0 6>r   c                 h    [         / p2U  H#  nUR                  UR                  U5      5        M%     X#4$ )z6The last resort case, i.e. use the expression domain. )r   r0   r4   )r5   r6   r@   rA   r   s        r   _construct_expressionr      s4    Ff''./  >r   c           	      \   [        U5      n[        U S5      (       aN  [        U [        5      (       a6  U (       d  / / pCO1[	        [        [	        U R                  5       5      6 5      u  p4OU nOU /n[	        [        [        U5      5      n[        XB5      nUb  USLa  Uu  pdO@[        XB5      u  pdO2UR                  SL a  SnO[        XB5      nUb  Uu  pdO[        XB5      u  pd[        U S5      (       a8  [        U [        5      (       a   U[        [	        [        WU5      5      5      4$ Xd4$ XdS   4$ )ad  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
isinstancerr   rm   rn   r   mapr   rB   r   r   r   )objrK   r6   monomsr5   rA   r@   s          r   construct_domainr   
  s   f 
CsJc4  !#R!%c4		+<&=!>F#gv&'Fv+F#NFF26?NFF==E!F)&6F#NFF26?NFsJc4  4S%8 9:::>!ay  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   rB   r2   r   r   r   r   r   r   <module>r      sW    6   ) & 6 6 9 3 1 : "?D/dzz x! x!r   