a
    khS                     @  s  d Z ddlmZ ddlmZ ddlmZ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d
l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dl#m$Z$ ddl%m&Z&m'Z' ddl(m)Z) ddl*m+Z+ ddl,m-Z- ddl.m/Z/m0Z0 ddl1m2Z2 ddl3m4Z4 ddl5m6Z6 ddl7m8Z8 e4e&fddZ9e4e&fddZ:e4e&fddZ;e4d d! Z<G d"d# d#e2Z=G d$d% d%ee2eZ>d&S )'z!Sparse rational function fields.     )annotations)reduce)addmulltlegtge)Expr)Mod)Exp1)S)Symbol)CantSympifysympify)ExpBase)Domain)DomainElementFractionField)PolynomialRing)construct_domain)lexMonomialOrder)CoercionFailed)build_options)_parallel_dict_from_expr)PolyRingPolyElement)DefaultPrinting)public)is_sequence)pollutec                 C  s   t | ||}|f|j S )zFConstruct new rational function field returning (field, x1, ..., xn). 	FracFieldgenssymbolsdomainorder_field r+   @/var/www/auris/lib/python3.9/site-packages/sympy/polys/fields.pyfield   s    r-   c                 C  s   t | ||}||jfS )zHConstruct new rational function field returning (field, (x1, ..., xn)). r#   r&   r+   r+   r,   xfield$   s    r.   c                 C  s(   t | ||}tdd |jD |j |S )zSConstruct new rational function field and inject generators into global namespace. c                 S  s   g | ]
}|j qS r+   )name).0symr+   r+   r,   
<listcomp>.       zvfield.<locals>.<listcomp>)r$   r"   r'   r%   r&   r+   r+   r,   vfield*   s    r4   c              	   O  s   d}t | s| gd } }ttt| } t||}g }| D ]}||  q8t||\}}|jdu rt	dd |D g }t
||d\|_}	t|j|j|j}
g }tdt|dD ]"}||
t|||d   q|r|
|d fS |
|fS dS )	a  Construct a field deriving generators and domain
    from options and input expressions.

    Parameters
    ==========

    exprs   : py:class:`~.Expr` or sequence of :py:class:`~.Expr` (sympifiable)

    symbols : sequence of :py:class:`~.Symbol`/:py:class:`~.Expr`

    options : keyword arguments understood by :py:class:`~.Options`

    Examples
    ========

    >>> from sympy import exp, log, symbols, sfield

    >>> x = symbols("x")
    >>> K, f = sfield((x*log(x) + 4*x**2)*exp(1/x + log(x)/3)/x**2)
    >>> K
    Rational function field in x, exp(1/x), log(x), x**(1/3) over ZZ with lex order
    >>> f
    (4*x**2*(exp(1/x)) + x*(exp(1/x))*(log(x)))/((x**(1/3))**5)
    FTNc                 S  s   g | ]}t | qS r+   )listvalues)r0   repr+   r+   r,   r2   Y   r3   zsfield.<locals>.<listcomp>)optr      )r!   r5   mapr   r   extendZas_numer_denomr   r(   sumr   r$   r%   r)   rangelenappendtuple)exprsr'   optionssingler8   ZnumdensexprZrepsZcoeffs_r*   Zfracsir+   r+   r,   sfield1   s&    

 rG   c                   @  s   e Zd ZU dZded< ded< ded< ded	< d
ed< ded< efddZdd Zdd Zdd Z	dd Z
dd Zdd Zdd Zd1dd Zd2d!d"Zd#d$ Zd%d& Zd'd( ZeZd)d* Zd+d, Zd-d. Zd/d0 ZdS )3r$   z2Multivariate distributed rational function field. r   ringztuple[FracElement, ...]r%   ztuple[Expr, ...]r'   intngensr   r(   r   r)   c                 C  s   t |||}|j}|j}|j}|j}| j||||f}t| }||_t	||_
||_||_||_||_||_t||jj|_||j|_||j|_| |_t|j|jD ].\}}	t|tr|j}
t||
st||
|	 q|S N)r   r'   rJ   r(   r)   __name__object__new___hash_tuplehash_hashrH   FracElementzeroraw_newdtypeone_gensr%   zip
isinstancer   r/   hasattrsetattr)clsr'   r(   r)   rH   rJ   rO   objsymbol	generatorr/   r+   r+   r,   rN   q   s0    




zFracField.__new__c                   s   t  fdd jjD S )z(Return a list of polynomial generators. c                   s   g | ]}  |qS r+   rU   r0   genselfr+   r,   r2      r3   z#FracField._gens.<locals>.<listcomp>)r@   rH   r%   rc   r+   rc   r,   rW      s    zFracField._gensc                 C  s   | j | j| jfS rK   )r'   r(   r)   rc   r+   r+   r,   __getnewargs__   s    zFracField.__getnewargs__c                 C  s   | j S rK   )rQ   rc   r+   r+   r,   __hash__   s    zFracField.__hash__c                 C  s0   |  |r| j| S td| j|f d S )Nzexpected a %s, got %s instead)
is_elementrH   indexto_poly
ValueErrorrU   )rd   rb   r+   r+   r,   rh      s    
zFracField.indexc                 C  s2   t |to0| j| j| j| jf|j|j|j|jfkS rK   )rY   r$   r'   rJ   r(   r)   rd   otherr+   r+   r,   __eq__   s
    
zFracField.__eq__c                 C  s
   | |k S rK   r+   rk   r+   r+   r,   __ne__   s    zFracField.__ne__c                 C  s   t |to|j| kS )zBTrue if ``element`` is an element of this field. False otherwise. )rY   rR   r-   rd   elementr+   r+   r,   rg      s    zFracField.is_elementNc                 C  s   |  ||S rK   r`   rd   numerdenomr+   r+   r,   rT      s    zFracField.raw_newc                 C  s*   |d u r| j j}||\}}| ||S rK   )rH   rV   cancelrT   rq   r+   r+   r,   new   s    zFracField.newc                 C  s   | j |S rK   )r(   convertro   r+   r+   r,   
domain_new   s    zFracField.domain_newc                 C  s   z|  | j|W S  ty   | j}|js||jr|| j}| }||}||	|}||
|}| || Y S  Y n0 d S rK   )ru   rH   
ground_newr   r(   is_Fieldhas_assoc_Field	get_fieldrv   rr   rs   rT   )rd   rp   r(   rH   ground_fieldrr   rs   r+   r+   r,   rx      s    
zFracField.ground_newc                 C  sv  t |trp| |jkr|S t | jtr<| jj|jkr<| |S t | jtrd| jj |jkrd| |S t	dnt |t
r | \}}t | jtr|j| jjkr| j|}n8t | jtr|j| jj kr| j|}n|| j}| j|}| ||S t |tr<t|dkr<tt| jj|\}}| ||S t |trRt	dn t |trh| |S | |S d S )N
conversionr9   Zparsing)rY   rR   r-   r(   r   rx   r   rH   to_fieldNotImplementedErrorr   Zclear_denomsto_ringset_ringrT   r@   r>   r5   r:   Zring_newru   strr
   	from_expr)rd   rp   rs   rr   r+   r+   r,   	field_new   sB    





zFracField.field_newc                   s6   | j tdd  D  fdd  |S )Nc                 s  s*   | ]"}|j st|tr|| fV  qd S rK   )is_PowrY   r   as_base_expra   r+   r+   r,   	<genexpr>   s   z*FracField._rebuild_expr.<locals>.<genexpr>c                   s@   | }|d ur|S | jr2tttt | jS | jrNtttt | jS | j	sbt
| ttfr|  \}}D ]<\}\}}||krrt||dkrr |t||    S qr|jr|tjur |t| S n$ d|  d urd d|   S z| W S  ty:   js4jr4 |  Y S  Y n0 d S )Nr      )getZis_Addr   r   r5   r:   argsZis_Mulr   r   rY   r   r   r   r   rI   Z
is_Integerr   ZOnerv   r   ry   rz   r{   )rD   r_   berb   bgZeg_rebuildr(   mappingZpowersr+   r,   r      s,    
z)FracField._rebuild_expr.<locals>._rebuild)r(   r@   keys)rd   rD   r   r+   r   r,   _rebuild_expr   s    zFracField._rebuild_exprc                 C  s\   t tt| j| j}z| t||}W n" tyL   td| |f Y n0 | 	|S d S )NzGexpected an expression convertible to a rational function in %s, got %s)
dictr5   rX   r'   r%   r   r   r   rj   r   )rd   rD   r   fracr+   r+   r,   r     s    zFracField.from_exprc                 C  s   t | S rK   r   rc   r+   r+   r,   	to_domain  s    zFracField.to_domainc                 C  s   t | j| j| jS rK   )r   r'   r(   r)   rc   r+   r+   r,   r   !  s    zFracField.to_ring)N)N)rL   
__module____qualname____doc____annotations__r   rN   rW   re   rf   rh   rm   rn   rg   rT   ru   rw   rx   r   __call__r   r   r   r   r+   r+   r+   r,   r$   g   s2   
"

%#
r$   c                   @  s>  e Zd ZdZdKddZdLddZdd Zd	d
 Zdd Zdd Z	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/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Z d;d< Z!d=d> Z"d?d@ Z#dAdB Z$dCdD Z%dMdEdFZ&dNdGdHZ'dOdIdJZ(dS )PrR   z=Element of multivariate distributed rational function field. Nc                 C  s4   |d u r|j j}n|std|| _|| _|| _d S )Nzzero denominator)rH   rV   ZeroDivisionErrorr-   rr   rs   )rd   r-   rr   rs   r+   r+   r,   __init__'  s    
zFracElement.__init__c                 C  s   |  | j||S rK   )	__class__r-   frr   rs   r+   r+   r,   rT   1  s    zFracElement.raw_newc                 C  s   | j || S rK   )rT   rt   r   r+   r+   r,   ru   4  s    zFracElement.newc                 C  s   | j dkrtd| jS )Nr   zf.denom should be 1)rs   rj   rr   r   r+   r+   r,   ri   7  s    
zFracElement.to_polyc                 C  s
   | j  S rK   )r-   r   rc   r+   r+   r,   parent<  s    zFracElement.parentc                 C  s   | j | j| jfS rK   )r-   rr   rs   rc   r+   r+   r,   re   ?  s    zFracElement.__getnewargs__c                 C  s,   | j }|d u r(t| j| j| jf | _ }|S rK   )rQ   rP   r-   rr   rs   )rd   rQ   r+   r+   r,   rf   D  s    zFracElement.__hash__c                 C  s   |  | j | j S rK   )rT   rr   copyrs   rc   r+   r+   r,   r   J  s    zFracElement.copyc                 C  s<   | j |kr| S |j}| j|}| j|}|||S d S rK   )r-   rH   rr   r   rs   ru   )rd   Z	new_fieldZnew_ringrr   rs   r+   r+   r,   	set_fieldM  s    
zFracElement.set_fieldc                 G  s   | j j| | jj|  S rK   )rr   as_exprrs   )rd   r'   r+   r+   r,   r   V  s    zFracElement.as_exprc                 C  sL   t |tr.| j|jkr.| j|jko,| j|jkS | j|koF| j| jjjkS d S rK   )rY   rR   r-   rr   rs   rH   rV   r   gr+   r+   r,   rm   Y  s    zFracElement.__eq__c                 C  s
   | |k S rK   r+   r   r+   r+   r,   rn   _  s    zFracElement.__ne__c                 C  s
   t | jS rK   )boolrr   r   r+   r+   r,   __bool__b  s    zFracElement.__bool__c                 C  s   | j  | j fS rK   )rs   sort_keyrr   rc   r+   r+   r,   r   e  s    zFracElement.sort_keyc                 C  s&   | j |r||  | S tS d S rK   )r-   rg   r   NotImplemented)f1f2opr+   r+   r,   _cmph  s    zFracElement._cmpc                 C  s   |  |tS rK   )r   r   r   r   r+   r+   r,   __lt__n  s    zFracElement.__lt__c                 C  s   |  |tS rK   )r   r   r   r+   r+   r,   __le__p  s    zFracElement.__le__c                 C  s   |  |tS rK   )r   r   r   r+   r+   r,   __gt__r  s    zFracElement.__gt__c                 C  s   |  |tS rK   )r   r	   r   r+   r+   r,   __ge__t  s    zFracElement.__ge__c                 C  s   |  | j| jS z"Negate all coefficients in ``f``. rT   rr   rs   r   r+   r+   r,   __pos__w  s    zFracElement.__pos__c                 C  s   |  | j | jS r   r   r   r+   r+   r,   __neg__{  s    zFracElement.__neg__c                 C  s   | j j}z||}W nd tyz   |jst|jrt| }z||}W n tyX   Y n0 d||||f Y S Y dS 0 d|d fS d S )N)r   NNr   )	r-   r(   rv   r   ry   rz   r{   rr   rs   )rd   rp   r(   r|   r+   r+   r,   _extract_ground  s    zFracElement._extract_groundc                 C  s$  | j }|s| S | s|S ||rl| j|jkrB| | j|j | jS | | j|j | j|j  | j|j S n|j|r| | j| j|  | jS t|trt|jt	r|jj |j krn*t|j jt	r|j jj |kr|
| S tS n6t|trt|jtr|jj|jkrn
|
| S | 
|S )z(Add rational functions ``f`` and ``g``. )r-   rg   rs   ru   rr   rH   rY   rR   r(   r   __radd__r   r   r   r   r   r-   r+   r+   r,   __add__  s,    
*


zFracElement.__add__c                 C  s   | j j|r(| | j| j|  | jS | |\}}}|dkrZ| | j| j|  | jS |sbtS | | j| | j|  | j| S d S Nr   r-   rH   rg   ru   rr   rs   r   r   r   cr   g_numerg_denomr+   r+   r,   r     s    zFracElement.__radd__c                 C  s  | j }|s| S | s| S ||rn| j|jkrD| | j|j | jS | | j|j | j|j  | j|j S n|j|r| | j| j|  | jS t|trt|jt	r|jj |j krn*t|j jt	r|j jj |kr|
| S tS n6t|trt|jtr|jj|jkrn
|
| S | |\}}}|dkrP| | j| j|  | jS |sZtS | | j| | j|  | j| S dS )z-Subtract rational functions ``f`` and ``g``. r   N)r-   rg   rs   ru   rr   rH   rY   rR   r(   r   __rsub__r   r   r   r   r   r   r-   r   r   r   r+   r+   r,   __sub__  s6    
*



zFracElement.__sub__c                 C  s   | j j|r*| | j | j|  | jS | |\}}}|dkr^| | j | j|  | jS |sftS | | j | | j|  | j| S d S r   r   r   r+   r+   r,   r     s    zFracElement.__rsub__c                 C  s   | j }| r|s|jS ||r:| | j|j | j|j S |j|rZ| | j| | jS t|trt|j	t
r|j	j |j krqt|j j	t
r|j j	j |kr|| S tS n0t|trt|j	tr|j	j|jkrn
|| S | |S )z-Multiply rational functions ``f`` and ``g``. )r-   rS   rg   ru   rr   rs   rH   rY   rR   r(   r   __rmul__r   r   r   r   r+   r+   r,   __mul__  s$    




zFracElement.__mul__c                 C  sr   | j j|r"| | j| | jS | |\}}}|dkrN| | j| | jS |sVtS | | j| | j| S d S r   r   r   r+   r+   r,   r     s    zFracElement.__rmul__c                 C  s,  | j }|stn||r6| | j|j | j|j S |j|rV| | j| j| S t|trt|j	t
r||j	j |j kr|qt|j j	t
r|j j	j |kr|| S tS n0t|trt|j	tr|j	j|jkrn
|| S | |\}}}|dkr| | j| j| S |stS | | j| | j| S dS )z0Computes quotient of fractions ``f`` and ``g``. r   N)r-   r   rg   ru   rr   rs   rH   rY   rR   r(   r   __rtruediv__r   r   r   r   r   r+   r+   r,   __truediv__  s.    





zFracElement.__truediv__c                 C  s|   | s
t n"| jj|r,| | j| | jS | |\}}}|dkrX| | j| | jS |s`tS | | j| | j| S d S r   )	r   r-   rH   rg   ru   rs   rr   r   r   r   r+   r+   r,   r   :  s    zFracElement.__rtruediv__c                 C  sJ   |dkr |  | j| | j| S | s*tn|  | j|  | j|  S dS )z+Raise ``f`` to a non-negative power ``n``. r   N)rT   rr   rs   r   )r   nr+   r+   r,   __pow__I  s
    zFracElement.__pow__c                 C  s:   |  }| | j|| j | j| j|  | jd S )a  Computes partial derivative in ``x``.

        Examples
        ========

        >>> from sympy.polys.fields import field
        >>> from sympy.polys.domains import ZZ

        >>> _, x, y, z = field("x,y,z", ZZ)
        >>> ((x**2 + y)/(z + 1)).diff(x)
        2*x/(z + 1)

        r9   )ri   ru   rr   diffrs   )r   xr+   r+   r,   r   R  s    zFracElement.diffc                 G  sT   dt |  k r| jjkr8n n| tt| jj|S td| jjt |f d S )Nr   z1expected at least 1 and at most %s values, got %s)r>   r-   rJ   evaluater5   rX   r%   rj   )r   r6   r+   r+   r,   r   c  s     zFracElement.__call__c                 C  sx   t |tr<|d u r<dd |D }| j|| j| }}n&| }| j||| j|| }}|j }|||S )Nc                 S  s   g | ]\}}|  |fqS r+   ri   r0   Xar+   r+   r,   r2   k  r3   z(FracElement.evaluate.<locals>.<listcomp>)	rY   r5   rr   r   rs   ri   rH   r~   ru   )r   r   r   rr   rs   r-   r+   r+   r,   r   i  s    
zFracElement.evaluatec                 C  sn   t |tr<|d u r<dd |D }| j|| j| }}n&| }| j||| j|| }}| ||S )Nc                 S  s   g | ]\}}|  |fqS r+   r   r   r+   r+   r,   r2   v  r3   z$FracElement.subs.<locals>.<listcomp>)rY   r5   rr   subsrs   ri   ru   )r   r   r   rr   rs   r+   r+   r,   r   t  s    zFracElement.subsc                 C  s   t d S rK   )r   )r   r   r   r+   r+   r,   compose~  s    zFracElement.compose)N)N)N)N)N))rL   r   r   r   r   rT   ru   ri   r   re   rQ   rf   r   r   r   rm   rn   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r+   r+   r+   r,   rR   $  sL   


	&!	


rR   N)?r   
__future__r   	functoolsr   operatorr   r   r   r   r   r	   Zsympy.core.exprr
   Zsympy.core.modr   Zsympy.core.numbersr   Zsympy.core.singletonr   Zsympy.core.symbolr   Zsympy.core.sympifyr   r   Z&sympy.functions.elementary.exponentialr   Zsympy.polys.domains.domainr   Z!sympy.polys.domains.domainelementr   Z!sympy.polys.domains.fractionfieldr   Z"sympy.polys.domains.polynomialringr   Zsympy.polys.constructorr   Zsympy.polys.orderingsr   r   Zsympy.polys.polyerrorsr   Zsympy.polys.polyoptionsr   Zsympy.polys.polyutilsr   Zsympy.polys.ringsr   r   Zsympy.printing.defaultsr   Zsympy.utilitiesr    Zsympy.utilities.iterablesr!   Zsympy.utilities.magicr"   r-   r.   r4   rG   r$   rR   r+   r+   r+   r,   <module>   sF    
5 >