o
    jg	                     @   sR   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 deeZ
dS )	z1Implementation of :class:`PolynomialRing` class.     )Ring)CompositeDomain)CoercionFailedGeneratorsError)publicc                   @   sF  e Zd ZdZd ZZdZdZdJddZdd Z	e
dd	 Ze
d
d Ze
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Z d4d5 Z!d6d7 Z"d8d9 Z#d:d; Z$d<d= Z%d>d? Z&d@dA Z'dBdC Z(dDdE Z)dFdG Z*dHdI Z+dS )KPolynomialRingz8A class for representing multivariate polynomial rings. TNc                 C   s   ddl m} t||r|d u r|d u r|}n||||}|| _|j| _|j| _|j| _|j| _|j| _|rF|jj	rF|jj
rFt|dkrFd| _| 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    r   Z/var/www/html/zoom/venv/lib/python3.10/site-packages/sympy/polys/domains/polynomialring.py__init__   s   zPolynomialRing.__init__c                 C      | j |S N)r   ring_new)r   elementr   r   r   new+   s   zPolynomialRing.newc                 C      | j jS r   )r   zeror   r   r   r   r#   .      zPolynomialRing.zeroc                 C   r"   r   )r   oner$   r   r   r   r&   2   r%   zPolynomialRing.onec                 C   r"   r   )r   r   r$   r   r   r   r   6   r%   zPolynomialRing.orderc                 C   s$   t | jd dtt | j d S )N[,])strr   joinmapr   r$   r   r   r   __str__:   s   $zPolynomialRing.__str__c                 C   s   t | jj| jj| j| jfS r   )hash	__class____name__r   r   r   r   r$   r   r   r   __hash__=   s   zPolynomialRing.__hash__c                 C   s.   t |to| 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   otherr   r   r   __eq__@   s
   
zPolynomialRing.__eq__c                 C   s"   |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Kr   r   r   r5   F   s   zPolynomialRing.is_unitc                 C   s   | j |j}| j|S r   )r   canonical_unitLCr   
ground_new)r   r7   ur   r   r   r9   M   s   zPolynomialRing.canonical_unitc                 C   s   |  S )zConvert `a` to a SymPy object. )as_exprr   r7   r   r   r   to_sympyQ   r%   zPolynomialRing.to_sympyc                 C   r   )z'Convert SymPy's expression to `dtype`. )r   	from_exprr>   r   r   r   
from_sympyU   s   zPolynomialRing.from_sympyc                 C      | | j ||S z*Convert a Python `int` object to `dtype`. r   convertK1r7   K0r   r   r   from_ZZY      zPolynomialRing.from_ZZc                 C   rB   rC   rD   rF   r   r   r   from_ZZ_python]   rJ   zPolynomialRing.from_ZZ_pythonc                 C   rB   z/Convert a Python `Fraction` object to `dtype`. rD   rF   r   r   r   from_QQa   rJ   zPolynomialRing.from_QQc                 C   rB   rL   rD   rF   r   r   r   from_QQ_pythone   rJ   zPolynomialRing.from_QQ_pythonc                 C   rB   )z(Convert a GMPY `mpz` object to `dtype`. rD   rF   r   r   r   from_ZZ_gmpyi   rJ   zPolynomialRing.from_ZZ_gmpyc                 C   rB   )z(Convert a GMPY `mpq` object to `dtype`. rD   rF   r   r   r   from_QQ_gmpym   rJ   zPolynomialRing.from_QQ_gmpyc                 C   rB   )z/Convert a `GaussianInteger` object to `dtype`. rD   rF   r   r   r   from_GaussianIntegerRingq   rJ   z'PolynomialRing.from_GaussianIntegerRingc                 C   rB   )z0Convert a `GaussianRational` object to `dtype`. rD   rF   r   r   r   from_GaussianRationalFieldu   rJ   z)PolynomialRing.from_GaussianRationalFieldc                 C   rB   z*Convert a mpmath `mpf` object to `dtype`. rD   rF   r   r   r   from_RealFieldy   rJ   zPolynomialRing.from_RealFieldc                 C   rB   rS   rD   rF   r   r   r   from_ComplexField}   rJ   z PolynomialRing.from_ComplexFieldc                 C   s.   | j |kr| j ||}|dur| |S dS )z*Convert an algebraic number to ``dtype``. N)r   r6   r!   rF   r   r   r   from_AlgebraicField   s
   

z"PolynomialRing.from_AlgebraicFieldc              	   C   s(   z| | jW S  ttfy   Y dS w )z#Convert a polynomial to ``dtype``. N)set_ringr   r   r   rF   r   r   r   from_PolynomialRing   s
   z"PolynomialRing.from_PolynomialRingc                 C   sP   | j |kr| j|gS ||||\}}|jr&| ||jj	 S dS )z*Convert a rational function to ``dtype``. N)
r   r   	from_listnumerdivdenomis_zerorX   field	to_domain)rG   r7   rH   qrr   r   r   from_FractionField   s   
z!PolynomialRing.from_FractionFieldc                    sl    j |jkr| } j|jkr fdd| D } |S |jr2|j kr4 | d |jS dS dS )z)Convert from old poly ring to ``dtype``. c                    s   i | ]\}}| j |qS r   rD   ).0mcrG   r   r   
<dictcomp>   s    z<PolynomialRing.from_GlobalPolynomialRing.<locals>.<dictcomp>r   N)r   r   to_dictr   itemsr4   r6   to_list)rG   r7   rH   adr   rf   r   from_GlobalPolynomialRing   s   z(PolynomialRing.from_GlobalPolynomialRingc                 C   s   | j   S )z(Returns a field associated with `self`. )r   to_fieldr_   r$   r   r   r   	get_field      zPolynomialRing.get_fieldc                 C      | j |jS )z%Returns True if `LC(a)` is positive. )r   is_positiver:   r>   r   r   r   rq      ro   zPolynomialRing.is_positivec                 C   rp   )z%Returns True if `LC(a)` is negative. )r   is_negativer:   r>   r   r   r   rr      ro   zPolynomialRing.is_negativec                 C   rp   )z)Returns True if `LC(a)` is non-positive. )r   is_nonpositiver:   r>   r   r   r   rs      ro   zPolynomialRing.is_nonpositivec                 C   rp   )z)Returns True if `LC(a)` is non-negative. )r   is_nonnegativer:   r>   r   r   r   rt      ro   zPolynomialRing.is_nonnegativec                 C   
   | |S )zExtended GCD of `a` and `b`. )gcdexr   r7   br   r   r   rv         
zPolynomialRing.gcdexc                 C   ru   )zReturns GCD of `a` and `b`. )gcdrw   r   r   r   rz      ry   zPolynomialRing.gcdc                 C   ru   )zReturns LCM of `a` and `b`. )lcmrw   r   r   r   r{      ry   zPolynomialRing.lcmc                 C   s   |  | j|S )zReturns factorial of `a`. )r   r   	factorialr>   r   r   r   r|      rJ   zPolynomialRing.factorial)NN),r0   
__module____qualname____doc__is_PolynomialRingis_Polyhas_assoc_Ringhas_assoc_Fieldr   r!   propertyr#   r&   r   r-   r1   r3   r5   r9   r?   rA   rI   rK   rM   rN   rO   rP   rQ   rR   rT   rU   rV   rX   rb   rl   rn   rq   rr   rs   rt   rv   rz   r{   r|   r   r   r   r   r   
   sV    




r   N)r   sympy.polys.domains.ringr   #sympy.polys.domains.compositedomainr   sympy.polys.polyerrorsr   r   sympy.utilitiesr   r   r   r   r   r   <module>   s    