ó
    Š*£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  p«U
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  pÞXÞ4$ 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  o�R                  U5      PM     nnXÞ4$ 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    ÚT/home/mande/repo/quber/.venv/lib/python3.13/site-packages/sympy/polys/constructor.pyÚ<lambda>Ú#_construct_simple.<locals>.<lambda>   s   €  U§_¡_×%K¸×9KÑ9KÐ%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>>   ó   é € Ð2¢M˜q—7–7¢Mùó   ‚é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Ð7€IÐ7�Ð7˜Ø€Mà
‡}�}˜ÒÙK‰á*ˆäˆØ××Ø×#×#Ø ’	ñ $à�^�^Þáà�Ø×$Ñ$ UÖ+ä% eÓ,ˆJÞØ �	Ø!‘�Ø—=—= Q§]§]ØŸLŸL¨Q¯\¯\Ø$(˜	Ùà!�FØ—z—zØ%×,Ñ,¨QÔ/Ø—z—zØ%×,Ñ,¨Q×/ò "á˜e×$Ñ$Þá Ø!“
ñ ñC öJ 7DŒsÑ2¡MÓ2Ô2È€HæÜ-¨fÓ:‰ˆð ˆ>Ðö –iÜ! xÑ0‰FÞÜ HÑ-‰FÞ˜#Ÿ)Ÿ)Þ&•T¬B‰Fæ&•T¬BˆFá8>Ó?º¨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‘à˜Q�x�Ø—‘˜”Ø�L‰L˜Öñ ð ˆ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¢?™˜ˆqŽu¢?ù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Ø�3‹YÜÔ6±Ó6¸¿¹ÓDÐDØ�3‹YÜÔ6±Ó6Ó6Ð6Ø�3‹YØ˜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é   ý€ å:ä‹5€Döñ ˜Ó€EÜ”˜“Ó€Dá" 4¨D¸Ñ=�J€A€tÜÑ3¤3 t¨T¤?Ó3Ó3€Dä×"Ò" A t 9Ó-¨q¯u©u¯}©}«€I€FˆAá:;Ó<º!°Q�—‘×&Ñ& q¨!¬RÖ0¹!€HÐ<Ü”C˜˜hÓ'Ó(€H÷ð ñ .3Ó3ªU T‰l˜4Ö ©U€FÐ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-  pþU 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    é € ÐBºT°c�}‰}×1 ×!1Ñ!1Ô1ºTùs   ‚+-é   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©?Ó;�K€EÞØà
‡}�}ÑÜÑB¹TÓB×BÑBØä“eˆãˆCØ×&Ñ&ˆGà×$ÙàÑ&’ñ ô 	ˆD‹	€AÜˆE‹
�A‰€Aà�2�AˆY€FØ�2ˆY€Fà
‡y‡yØ‰	à  $ q¡&�5ãˆEÜ�5‹z˜A‹~ Õ!3Ø �	Ùñ ô
 ‹U€FæÜ Ö/‰LˆEØ˜%‘LˆEà %§¡¦‘��uØ‘�Ø—
‘
˜5Ô!Ø$�e“ó !.ò 0ô   Ö/‰LˆEØ�M‰Mœ$˜uŸ|™|›~Ó.Ô/Ø�M‰Mœ$˜uŸ|™|›~Ó.Ö/ñ 0ð &+Ð*€IÐ*�˜Ø€MãˆØ××Ø×#×#Ø ’	ñ $à�^�^ØˆFØ× Ñ  Ö'ä% eÓ,ˆJØÓ%Ø �	Ø!‘��1Ø—=—= Q§]§]ØŸLŸL¨Q¯\¯\Ø$(š	ñ .:ð "�FØ—z—zØ%×,Ñ,¨QÔ/Ø—z—z‘zØ%×,Ñ,¨QÖ/ñ) ö, 7DŒsÑ2¡MÓ2Ô2È€Hæ–)Ü 8Ñ,‰Þ	Ü Ñ)‰Þ	ÞÜ‰Fä‰FÞ	Ü‰äˆà€FæØ×!Ò! 4Ð(ˆãˆEØ %§¡¦‘��uØ%×0Ñ0°Ó7��e“ñ !.ð �M‰M™& ›-Ö(ñ	 ð" �6ˆ>Ðð ×"Ò" DÐ)ˆä Ö/‰LˆEØ %§¡¦‘��uØ%×0Ñ0°Ó7��e“ñ !.ð !&§¡¦‘��uØ%×0Ñ0°Ó7��e“ñ !.ð �M‰M™& % Ó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äˆs�J×ÑÜ�cœ4× Ñ ÞØ!# R™ä!%¤c¬4°·	±	³Ó+<Ð&=Ó!>‘�˜à‰Fà�ˆä”#”g˜vÓ&Ó'€FÜ˜vÓ+€FàÑØ˜ÒØ#‰NˆF�Fä2°6Ó?‰NˆF�Fà�=‰=˜EÒ!Ø‰Fä)¨&Ó6ˆFàÑØ#‰NˆF�Fä2°6Ó?‰NˆFäˆs�J×ÑÜ�cœ4× Ñ Øœ4¤¤S¨°Ó%8Ó 9Ó:Ð:Ð:à�>Ð!à˜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   rB   r2   r–   r˜   r    r   r   r   Ú<module>r¬      sW   ðÙ 6Ý å Ý )Ý &ß 6Õ 6Ý 9Ý 3Ý 1Ý :Ý "ò?òD/òdzòzð ñx!ó ñx!r   