Ë
    7^(hm,  ã                   ó¸   — 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y)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                 ó2  — dx}x}x}}g }|j                   du rd„ }nd„ }| D ]×  }|j                  r|j                  rŒd}Œ|j                  r|r yd}|j	                  |«       ŒCt        |«      }	|	rxd}|	\  }
}|
j                  r'|j                  r|
j                  r|j                  sd}ŒŠd}|
j                  r|j	                  |
«       |j                  sŒ¶|j	                  |«       ŒÈ ||«      r|r yd}Œ× y |rt        d„ |D «       «      nd}|rt        | |«      \  }}||fS |r|rt        |¬«      }n:|rt        |¬«      }n+|s|j                  r|rt        nt        }n|rt        nt        }| D �cg c]  }|j                  |«      ‘Œ }}||fS c c}w )	z?Handle simple domains, e.g.: ZZ, QQ, RR and algebraic domains. FTc                 ó6   — | j                   xr | j                  S ©N©Ú	is_numberÚis_algebraic©Úcoeffs    úU/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/sympy/polys/constructor.pyú<lambda>z#_construct_simple.<locals>.<lambda>   s   €  U§_¡_Ò%K¸×9KÑ9K€ ó    c                  ó   — y)NF© r   s    r   r   z#_construct_simple.<locals>.<lambda>   s   � r   Nc              3   ó4   K  — | ]  }|j                   –— Œ y ­wr   ©Ú_prec©Ú.0Úcs     r   ú	<genexpr>z$_construct_simple.<locals>.<genexpr>>   ó   è ø€ Ò2˜q�1—7•7Ñ2ùó   ‚é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_simpler@      sš  € à27Ð7€IÐ7�Ð7˜ ZØ€Mà
‡}�}˜ÑÙK‰á*ˆàò !ˆØ×ÒØ×#Ó#Ø ‘	Ø�^Š^Ùáà�Ø×$Ñ$ UÕ+ä% eÓ,ˆJÙØ �	Ø!‘��1Ø—=’= Q§]¢]ØŸLšL¨Q¯\ª\Ø$(˜	Øà!�FØ—z’zØ%×,Ñ,¨QÔ/Ø—z“zØ%×,Ñ,¨QÕ/Ù˜eÔ$Ùá Ø!‘
ñ ðC!ñJ 7DŒsÑ2 MÔ2Ô2È€HáÜ-¨f°cÓ:‰ˆ�ð �6ˆ>Ðñ ‘iÜ! xÔ0‰FÙÜ HÔ-‰FÙ˜#Ÿ)š)Ù&•T¬B‰Fá&•T¬BˆFà8>Ö?¨u�&×#Ñ# EÕ*Ð?ˆÐ?à�6ˆ>Ðùò @s   Å6Fc                 ó  ‡‡‡‡‡‡— ddl m} t        «       Šˆˆfd„Š ‰| «      }t        t	        ‰«      «      Š |‰dd¬«      \  Š}}t        d„ t        |‰«      D «       «      }t        j                  ‰|f«      ‰j                  j                  «       cŠŠ|D �cg c]#  }‰j                  j                  |‰t        «      ‘Œ% }}t        t        ‰|«      «      Šˆˆˆˆfd„Š|D �	cg c]
  }	 ‰|	«      ‘Œ }
}	‰|
fS c c}w c c}	w )zDWe know that coefficients are algebraic so construct the extension. r   )Úprimitive_elementc                 ó2  •— g }| D ]Ž  }|j                   rdt        j                  |«      f}nW|j                  rd ‰|j                  «      f}n6|j
                  rd ‰|j                  «      f}nd|f}‰j                  |«       |j                  |«       Œ� |S )NÚQú+Ú*Úe)r+   r   r2   Úis_AddÚargsÚis_MulÚaddr.   )rI   ÚtreesÚaÚtreeÚbuild_treesÚextss       €€r   rO   z)_construct_algebraic.<locals>.build_treesW   sŒ   ø€ ØˆØò 
	ˆAØ�}Š}ØœRŸ]™]¨1Ó-Ð.‘Ø—’Ø™[¨¯©Ó0Ð1‘Ø—’Ø™[¨¯©Ó0Ð1‘à˜Q�x�Ø—‘˜”Ø�L‰L˜Õð
	ð ˆr   T)ÚexÚpolysc              3   ó,   K  — | ]  \  }}||z  –— Œ y ­wr   r   )r"   ÚsÚexts      r   r$   z'_construct_algebraic.<locals>.<genexpr>j   s   è ø€ Ò3™˜˜Cˆq��uÑ3ùs   ‚c                 óö   •— | \  }}|dk(  r"‰j                   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        ‚)NrD   rE   c              3   ó.   •K  — | ]  } ‰|«      –— Œ y ­wr   r   ©r"   rM   Úconvert_trees     €r   r$   z=_construct_algebraic.<locals>.convert_tree.<locals>.<genexpr>v   ó   øè ø€ Ò6¨A™ QŸÑ6ùó   ƒrF   c              3   ó.   •K  — | ]  } ‰|«      –— Œ y ­wr   r   rX   s     €r   r$   z=_construct_algebraic.<locals>.convert_tree.<locals>.<genexpr>x   rZ   r[   rG   )ÚdtypeÚ	from_listr   ÚsumÚzeror   ÚRuntimeError)rN   ÚoprI   rY   r>   Úexts_mapÚgs      €€€€r   rY   z*_construct_algebraic.<locals>.convert_treeq   s{   ø€ Ø‰ˆˆDØ�Š9Ø—<‘<×)Ñ)¨4¨&°!´RÓ8Ð8Ø�3ŠYÜÓ6°Ô6¸¿¹ÓDÐDØ�3ŠYÜÓ6°Ô6Ó6Ð6Ø�3ŠYØ˜D‘>Ð!äÐr   )Úsympy.polys.numberfieldsrB   ÚsetÚlistr   r_   Úzipr   Úalgebraic_fieldÚrepÚto_listr]   r^   Údict)r3   r4   rB   rL   ÚspanÚHÚrootÚhÚexts_domrN   r?   rO   rY   r>   rP   rc   rd   s              @@@@@@r   r0   r0   Q   sä   ý€ å:ä‹5€Dõñ ˜Ó€EÜ”˜“Ó€Dá" 4¨D¸Ô=�J€A€tˆQÜÑ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 T‰l˜4Õ Ð3€FÐ3à�6ˆ>Ðùò% =ùò  4s   Â(C:Ã%C?c                 ó¢  — g g }}| D ]7  }|j                  «       \  }}|j                  |«       |j                  |«       Œ9 t        ||z   «      \  }}|sy|j                  €<t	        d„ |D «       «      ryt        «       }	|D ]  }
|
j                  }|	|z  r y|	|z  }	Œ t        |«      }t        |«      dz  }|d| }||d }|j                  rd}n$dd|z  }}|D ]  }t        |«      dkD  s||vsŒd} n t        «       } |sMt        ||«      D ]=  \  }}|   }|j                  «       D ]   \  }}||z  }| j                  |«       |||<   Œ" Œ? ndt        ||«      D ]U  \  }}| j                  t        |j                  «       «      «       | j                  t        |j                  «       «      «       ŒW dx}x}}g }| D ]Ä  }|j                  r|j                   rŒd}Œ|j"                  rd}|j                  |«       Œ?t%        |«      }|€ŒMd}|\  }}|j                  r(|j                  r|j                   r|j                   rŒ…d}Œˆd}|j"                  r|j                  |«       |j"                  sŒ´|j                  |«       ŒÆ |rt'        d„ |D «       «      nd	}|r|rt)        |¬
«      }n0|rt+        |¬
«      }n!|r|rt,        }nt.        }n|rt0        }nt2        }g }|s] |j4                  |Ž }|D ]E  }|j                  «       D ]  \  }}|j7                  |«      ||<   Œ |j                   ||«      «       ŒG ||fS  |j8                  |Ž }t        ||«      D ]v  \  }}|j                  «       D ]  \  }}|j7                  |«      ||<   Œ |j                  «       D ]  \  }}|j7                  |«      ||<   Œ |j                   |||f«      «       Œx ||fS )z<Handle composite domains, e.g.: ZZ[X], QQ[X], ZZ(X), QQ(X). Nc              3   óP   K  — | ]  }|j                   xr |j                  –— Œ  y ­wr   r   )r"   Úgens     r   r$   z'_construct_composite.<locals>.<genexpr>’   s"   è ø€ ÒB°cˆs�}‰}Ò1 ×!1Ñ!1Ó1ÑBùs   ‚$&é   TF)r   é   c              3   ó4   K  — | ]  }|j                   –— Œ y ­wr   r   r!   s     r   r$   z'_construct_composite.<locals>.<genexpr>×   r%   r&   r'   r(   )Úas_numer_denomr.   r   Ú	compositeÚanyrf   Úfree_symbolsÚlenr1   rh   ÚitemsrK   Úupdaterg   Úvaluesr+   r,   r-   r   r/   r   r   r
   r	   r   r   Ú	poly_ringr2   Ú
frac_field)r3   r4   ÚnumersÚdenomsr   ÚnumerÚdenomrR   ÚgensÚall_symbolsrt   ÚsymbolsÚnÚkÚ	fractionsÚzerosÚmonomr5   r6   r7   r9   r:   r;   r<   r=   Úgroundr?   r>   s                               r   Ú_construct_compositer�   ƒ   s  € à˜ˆF€Fàò ˆØ×+Ñ+Ó-‰ˆˆuà�‰�eÔØ�‰�eÕð	ô +¨6°F©?Ó;�K€Eˆ4ÙØà
‡}�}ÐÜÑB¸TÔBÔBØä“eˆàò 	'ˆCØ×&Ñ&ˆGà˜WÒ$Ùà˜wÑ&‘ð	'ô 	ˆD‹	€AÜˆE‹
�A‰€Aà�2�AˆY€FØ�1�2ˆY€Fà
‡y‚yØ‰	à  $ q¡&�5ˆ	àò 	ˆEÜ�5‹z˜AŠ~ ¨eÒ!3Ø �	Ùð	ô
 ‹U€FáÜ ¨Ó/ò 	%‰LˆE�5Ø˜%‘LˆEà %§¡£ò %‘��uØ˜‘�Ø—
‘
˜5Ô!Ø$��e’ñ%ñ	%ô   ¨Ó/ò 	0‰LˆE�5Ø�M‰Mœ$˜uŸ|™|›~Ó.Ô/Ø�M‰Mœ$˜uŸ|™|›~Ó.Õ/ð	0ð &+Ð*€IÐ*�˜Ø€Màò 0ˆØ×ÒØ×#Ó#Ø ‘	Ø�^Š^ØˆFØ× Ñ  Õ'ä% eÓ,ˆJØÑ%Ø �	Ø!‘��1Ø—=’= Q§]¢]ØŸLšL¨Q¯\«\Ø$(™	à!�FØ—z’zØ%×,Ñ,¨QÔ/Ø—z“zØ%×,Ñ,¨QÕ/ð)0ñ, 7DŒsÑ2 MÔ2Ô2È€Há‘)Ü 8Ô,‰Ù	Ü Ô)‰Ù	ÙÜ‰Fä‰FÙ	Ü‰äˆà€FáØ!�×!Ñ! 4Ð(ˆàò 	)ˆEØ %§¡£ò 8‘��uØ%×0Ñ0°Ó7��e’ð8ð �M‰M™& ›-Õ(ð		)ð" �6ˆ>Ðð #�×"Ñ" DÐ)ˆä ¨Ó/ò 	2‰LˆE�5Ø %§¡£ò 8‘��uØ%×0Ñ0°Ó7��e’ð8ð !&§¡£ò 8‘��uØ%×0Ñ0°Ó7��e’ð8ð �M‰M™& %¨ Ó0Õ1ð	2ð �6ˆ>Ðr   c                 óh   — t         g }}| D ]"  }|j                  |j                  |«      «       Œ$ ||fS )z6The last resort case, i.e. use the expression domain. )r   r.   r2   )r3   r4   r>   r?   r   s        r   Ú_construct_expressionr‘      s=   € ä˜ˆF€Fàò 0ˆØ�‰�f×'Ñ'¨Ó.Õ/ð0ð �6ˆ>Ðr   c           	      ó:  — t        |«      }t        | d«      rFt        | t        «      r3| sg g }}n2t	        t        t	        | j                  «       «      Ž «      \  }}n| }n| g}t	        t        t        |«      «      }t        ||«      }|�|dur|\  }}nDt        ||«      \  }}n4|j                  du rd}nt        ||«      }|�|\  }}nt        ||«      \  }}t        | d«      r4t        | 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Ú
isinstancerl   rg   rh   r}   Úmapr   r@   r‘   ry   r�   )ÚobjrI   r4   Úmonomsr3   r?   r>   s          r   Úconstruct_domainr™   
  s"  € ôf ˜Ó
€Cäˆs�JÔÜ�cœ4Ô ÙØ!# R˜‘ä!%¤c¬4°·	±	³Ó+<Ð&=Ó!>‘�™à‰Fà�ˆä”#”g˜vÓ&Ó'€FÜ˜v sÓ+€FàÐØ˜ÑØ#‰NˆF‘Fä2°6¸3Ó?‰NˆF‘Fà�=‰=˜EÑ!Ø‰Fä)¨&°#Ó6ˆFàÐØ#‰NˆF‘Fä2°6¸3Ó?‰NˆF�Fäˆs�JÔÜ�cœ4Ô Øœ4¤¤S¨°Ó%8Ó 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   r@   r0   r�   r‘   r™   r   r   r   ú<module>r¥      sW   ðÙ 6Ý å Ý )Ý &ß 6Õ 6Ý 9Ý 3Ý 1Ý :Ý "ò?òD/òdzòzð ñx!ó ñx!r   