
    Ed	                     l    d Z ddlmZ ddlmZ ddlmZmZ ddlm	Z	 e	 G d dee                      Z
dS )	z1Implementation of :class:`PolynomialRing` class.     )Ring)CompositeDomain)CoercionFailedGeneratorsError)publicc                   &   e Zd ZdZdxZZdZdZd'dZd Z	e
d             Ze
d             Ze
d             Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d Z#d Z$d  Z%d! Z&d" Z'd# Z(d$ Z)d% Z*d& Z+dS )(PolynomialRingz8A class for representing multivariate polynomial rings. TNc                 `   ddl m} t          ||          r|||}n ||||          }|| _        |j        | _        |j        | _        |j        | _        |j        | _        |j        | _        |r2|j        j	        r&|j        j
        rt          |          dk    rd| _        | j        | _        d S )Nr   )PolyRing   T)sympy.polys.ringsr   
isinstanceringdtypegensngenssymbolsdomainis_Fieldis_Exactlenis_PIDdom)selfdomain_or_ringr   orderr   r   s         Blib/python3.11/site-packages/sympy/polys/domains/polynomialring.py__init__zPolynomialRing.__init__   s    ......nh// 	<G 	< 	<!DD8G^U;;D	Z
I	Z
|k  	#{# #(< #Wq #" ;    c                 6    | j                             |          S N)r   ring_new)r   elements     r   newzPolynomialRing.new+   s    y!!'***r   c                     | j         j        S r!   )r   zeror   s    r   r&   zPolynomialRing.zero.   s    y~r   c                     | j         j        S r!   )r   oner'   s    r   r)   zPolynomialRing.one2   s    y}r   c                     | j         j        S r!   )r   r   r'   s    r   r   zPolynomialRing.order6   s    yr   c                     t          | j                  dz   d                    t          t           | j                            z   dz   S )N[,])strr   joinmapr   r'   s    r   __str__zPolynomialRing.__str__:   s9    4;#%S$,1G1G(H(HH3NNr   c                 d    t          | j        j        | j        j        | j        | j        f          S r!   )hash	__class____name__r   r   r   r   r'   s    r   __hash__zPolynomialRing.__hash__=   s&    T^,djot{DLYZZZr   c                     t          |t                    o3| j        j        | j        | j        f|j        j        |j        |j        fk    S )z.Returns `True` if two domains are equivalent. )r   r	   r   r   r   r   )r   others     r   __eq__zPolynomialRing.__eq__@   sC    %00 <Z_dk4<8[u|U];<	<r   c                 t    |j         sdS | j        }|                    |                    ||                     S )z/Returns ``True`` if ``a`` is a unit of ``self``F)	is_groundr   is_unitconvert_from)r   aKs      r   r=   zPolynomialRing.is_unitF   s8    { 	5Kyy400111r   c                 t    | j                             |j                  }| j                            |          S r!   )r   canonical_unitLCr   
ground_new)r   r?   us      r   rB   zPolynomialRing.canonical_unitM   s/    K&&qt,,y##A&&&r   c                 *    |                                 S )zConvert `a` to a SymPy object. )as_exprr   r?   s     r   to_sympyzPolynomialRing.to_sympyQ   s    yy{{r   c                 6    | j                             |          S )z'Convert SymPy's expression to `dtype`. )r   	from_exprrH   s     r   
from_sympyzPolynomialRing.from_sympyU   s    y""1%%%r   c                 J     | | j                             ||                    S z*Convert a Python `int` object to `dtype`. r   convertK1r?   K0s      r   from_ZZzPolynomialRing.from_ZZY   $    r")##Ar**+++r   c                 J     | | j                             ||                    S rN   rO   rQ   s      r   from_ZZ_pythonzPolynomialRing.from_ZZ_python]   rU   r   c                 J     | | j                             ||                    S z/Convert a Python `Fraction` object to `dtype`. rO   rQ   s      r   from_QQzPolynomialRing.from_QQa   rU   r   c                 J     | | j                             ||                    S rY   rO   rQ   s      r   from_QQ_pythonzPolynomialRing.from_QQ_pythone   rU   r   c                 J     | | j                             ||                    S )z(Convert a GMPY `mpz` object to `dtype`. rO   rQ   s      r   from_ZZ_gmpyzPolynomialRing.from_ZZ_gmpyi   rU   r   c                 J     | | j                             ||                    S )z(Convert a GMPY `mpq` object to `dtype`. rO   rQ   s      r   from_QQ_gmpyzPolynomialRing.from_QQ_gmpym   rU   r   c                 J     | | j                             ||                    S )z/Convert a `GaussianInteger` object to `dtype`. rO   rQ   s      r   from_GaussianIntegerRingz'PolynomialRing.from_GaussianIntegerRingq   rU   r   c                 J     | | j                             ||                    S )z0Convert a `GaussianRational` object to `dtype`. rO   rQ   s      r   from_GaussianRationalFieldz)PolynomialRing.from_GaussianRationalFieldu   rU   r   c                 J     | | j                             ||                    S z*Convert a mpmath `mpf` object to `dtype`. rO   rQ   s      r   from_RealFieldzPolynomialRing.from_RealFieldy   rU   r   c                 J     | | j                             ||                    S rf   rO   rQ   s      r   from_ComplexFieldz PolynomialRing.from_ComplexField}   rU   r   c                     | j         |k    r| j                             ||          }||                     |          S dS )z*Convert an algebraic number to ``dtype``. N)r   r>   r$   rQ   s      r   from_AlgebraicFieldz"PolynomialRing.from_AlgebraicField   sI    9? 	.	&&q"--A 	66!99	 	r   c                 h    	 |                     | j                  S # t          t          f$ r Y dS w xY w)z#Convert a polynomial to ``dtype``. N)set_ringr   r   r   rQ   s      r   from_PolynomialRingz"PolynomialRing.from_PolynomialRing   sB    	::bg&&&0 	 	 	44	s    11c                 @   | j         |k    r| j                            |g          S |                    |                              |                    |                    \  }}|j        r2|                     ||j        j        	                                          S dS )z*Convert a rational function to ``dtype``. N)
r   r   	from_listnumerdivdenomis_zerorn   field	to_domain)rR   r?   rS   qrs        r   from_FractionFieldz!PolynomialRing.from_FractionField   s    9? 	*7$$aS)))xx{{rxx{{++19 	))!RX]-D-D-F-FGGG4r   c                 T     j         |j        k    rO|                                } j        |j        k    r  fd|                                D             }  |          S |j        r>|j         k    r5                     |                                d         |j                  S dS dS )z)Convert from old poly ring to ``dtype``. c                 L    i | ] \  }}|j                             |          !S  rO   ).0mcrR   s      r   
<dictcomp>z<PolynomialRing.from_GlobalPolynomialRing.<locals>.<dictcomp>   s/    EEE$!Qa**1--EEEr   r   N)r   r   to_dictr   itemsr<   r>   to_list)rR   r?   rS   ads   `   r   from_GlobalPolynomialRingz(PolynomialRing.from_GlobalPolynomialRing   s    :  	>ByBI% FEEEE"((**EEE2b66M[ 	>RY"_ 	>??199;;q>29===	> 	> 	> 	>r   c                 X    | j                                                                         S )z(Returns a field associated with `self`. )r   to_fieldrv   r'   s    r   	get_fieldzPolynomialRing.get_field   s"    y!!##--///r   c                 @    | j                             |j                  S )z%Returns True if `LC(a)` is positive. )r   is_positiverC   rH   s     r   r   zPolynomialRing.is_positive       {&&qt,,,r   c                 @    | j                             |j                  S )z%Returns True if `LC(a)` is negative. )r   is_negativerC   rH   s     r   r   zPolynomialRing.is_negative   r   r   c                 @    | j                             |j                  S )z)Returns True if `LC(a)` is non-positive. )r   is_nonpositiverC   rH   s     r   r   zPolynomialRing.is_nonpositive       {))!$///r   c                 @    | j                             |j                  S )z)Returns True if `LC(a)` is non-negative. )r   is_nonnegativerC   rH   s     r   r   zPolynomialRing.is_nonnegative   r   r   c                 ,    |                     |          S )zExtended GCD of `a` and `b`. )gcdexr   r?   bs      r   r   zPolynomialRing.gcdex   s    wwqzzr   c                 ,    |                     |          S )zReturns GCD of `a` and `b`. )gcdr   s      r   r   zPolynomialRing.gcd       uuQxxr   c                 ,    |                     |          S )zReturns LCM of `a` and `b`. )lcmr   s      r   r   zPolynomialRing.lcm   r   r   c                 \    |                      | j                            |                    S )zReturns factorial of `a`. )r   r   	factorialrH   s     r   r   zPolynomialRing.factorial   s$    zz$+//22333r   )NN),r6   
__module____qualname____doc__is_PolynomialRingis_Polyhas_assoc_Ringhas_assoc_Fieldr   r$   propertyr&   r)   r   r2   r7   r:   r=   rB   rI   rL   rT   rW   rZ   r\   r^   r`   rb   rd   rg   ri   rk   rn   ry   r   r   r   r   r   r   r   r   r   r   r|   r   r   r	   r	   
   sk       BB"&&NO   0+ + +   X   X   XO O O[ [ [< < <2 2 2' ' '  & & &, , ,, , ,, , ,, , ,, , ,, , ,, , ,, , ,, , ,, , ,    
 
 
> > >0 0 0- - -- - -0 0 00 0 0      4 4 4 4 4r   r	   N)r   sympy.polys.domains.ringr   #sympy.polys.domains.compositedomainr   sympy.polys.polyerrorsr   r   sympy.utilitiesr   r	   r|   r   r   <module>r      s    7 7 * ) ) ) ) ) ? ? ? ? ? ? B B B B B B B B " " " " " "|4 |4 |4 |4 |4T? |4 |4 |4 |4 |4r   