U
    L?hR                     @  s  U d 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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( ddl)m*Z* ddl+m,Z, ddl-m.Z. ddl/m0Z0 ddl1m2Z2 ddl3m4Z4 ddl5m6Z6 e2e&fddZ7e2e&fddZ8e2e&fddZ9e2d d! Z:i Z;d"e<d#< G d$d% d%e0Z=G d&d' d'ee0eZ>d(S ))z!Sparse rational function fields.     )annotations)Any)reduce)addmulltlegtge)Expr)Mod)Exp1)S)Symbol)CantSympifysympify)ExpBase)DomainElementFractionField)PolynomialRing)construct_domain)lex)CoercionFailed)build_options)_parallel_dict_from_expr)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)   D/var/www/html/venv/lib/python3.8/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>.   s     zvfield.<locals>.<listcomp>)r"   r    r%   r#   r$   r)   r)   r*   vfield*   s    r1   c              	   O  s   d}t | s| gd } }ttt| } t||}g }| D ]}||  q8t||\}}|jdk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)r.   repr)   r)   r*   r0   Y   s     zsfield.<locals>.<listcomp>)optr      )r   r2   mapr   r   extendZas_numer_denomr   r&   sumr   r"   r#   r'   rangelenappendtuple)Zexprsr%   optionsZsingler5   ZnumdensexprZrepsZcoeffs_r(   Zfracsir)   r)   r*   sfield1   s&    

 rB   zdict[Any, Any]_field_cachec                   @  s   e Zd ZdZ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dZd$ddZdd Zdd Zdd ZeZdd Zdd Zdd  Zd!d" ZdS )%r"   z2Multivariate distributed rational function field. c                 C  s  ddl m} ||||}|j}|j}|j}|j}| j||||f}t|}|d krt	
| }||_t||_||_tdtfd|i|_||_||_||_||_||j|_||j|_| |_t|j|jD ].\}	}
t|	tr|	j}t||st|||
 q|t|< |S )Nr   PolyRingFracElementr+   )sympy.polys.ringsrE   r%   ngensr&   r'   __name__rC   getobject__new___hash_tuplehash_hashringtyperF   dtypezeroone_gensr#   zip
isinstancer   r-   hasattrsetattr)clsr%   r&   r'   rE   rP   rH   rM   objsymbol	generatorr-   r)   r)   r*   rL   k   s8    






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)   rR   r.   genselfr)   r*   r0      s     z#FracField._gens.<locals>.<listcomp>)r=   rP   r#   ra   r)   ra   r*   rU      s    zFracField._gensc                 C  s   | j | j| jfS N)r%   r&   r'   ra   r)   r)   r*   __getnewargs__   s    zFracField.__getnewargs__c                 C  s   | j S rc   )rO   ra   r)   r)   r*   __hash__   s    zFracField.__hash__c                 C  s2   t || jr| j| S td| j|f d S )Nzexpected a %s, got %s instead)rW   rR   rP   indexto_poly
ValueError)rb   r`   r)   r)   r*   rf      s    zFracField.indexc                 C  s2   t |to0| j| j| j| jf|j|j|j|jfkS rc   )rW   r"   r%   rH   r&   r'   rb   otherr)   r)   r*   __eq__   s
    
zFracField.__eq__c                 C  s
   | |k S rc   r)   ri   r)   r)   r*   __ne__   s    zFracField.__ne__Nc                 C  s   |  ||S rc   r^   rb   numerdenomr)   r)   r*   raw_new   s    zFracField.raw_newc                 C  s*   |d kr| j j}||\}}| ||S rc   )rP   rT   cancelrp   rm   r)   r)   r*   new   s     zFracField.newc                 C  s   | j |S rc   )r&   convert)rb   elementr)   r)   r*   
domain_new   s    zFracField.domain_newc                 C  s   z|  | j|W S  tk
r   | j}|js~|jr~| j}| }||}||	|}||
|}| || Y S  Y nX d S rc   )rr   rP   
ground_newr   r&   is_Fieldhas_assoc_Field	get_fieldrs   rn   ro   rp   )rb   rt   r&   rP   ground_fieldrn   ro   r)   r)   r*   rv      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
conversionr6   Zparsing)rW   rF   r+   r&   r   rv   r   rP   to_fieldNotImplementedErrorr   Zclear_denomsto_ringset_ringrp   r=   r;   r2   r7   Zring_newrr   strr   	from_expr)rb   rt   ro   rn   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 rc   )is_PowrW   r   as_base_expr_   r)   r)   r*   	<genexpr>   s     
z*FracField._rebuild_expr.<locals>.<genexpr>c                   sB   | }|d k	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k	r |t| S n$ d|  d k	rd d|   S z| W S  tk
r<   js6jr6 |  Y S  Y nX d S )Nr      )rJ   Zis_Addr   r   r2   r7   argsZis_Mulr   r   rW   r   r   r   r   intZ
is_Integerr   ZOners   r   rw   rx   ry   )r?   r]   ber`   bgeg_rebuildr&   mappingZpowersr)   r*   r      s,    
z)FracField._rebuild_expr.<locals>._rebuild)r&   r=   keys)rb   r?   r   r)   r   r*   _rebuild_expr   s    zFracField._rebuild_exprc                 C  s^   t tt| j| j}z| t||}W n$ tk
rN   td| |f Y nX | 	|S d S )NzGexpected an expression convertible to a rational function in %s, got %s)
dictr2   rV   r%   r#   r   r   r   rh   r   )rb   r?   r   fracr)   r)   r*   r     s    zFracField.from_exprc                 C  s   t | S rc   r   ra   r)   r)   r*   	to_domain  s    zFracField.to_domainc                 C  s   ddl m} || j| j| jS )Nr   rD   )rG   rE   r%   r&   r'   )rb   rE   r)   r)   r*   r~     s    zFracField.to_ring)N)N)rI   
__module____qualname____doc__r   rL   rU   rd   re   rf   rk   rl   rp   rr   ru   rv   r   __call__r   r   r   r~   r)   r)   r)   r*   r"   h   s$   &

%#
r"   c                   @  s<  e Zd ZdZdKddZd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%dLdEdFZ&dMdGdHZ'dNdIdJZ(dS )OrF   z=Element of multivariate distributed rational function field. Nc                 C  s0   |d kr| j jj}n|s td|| _|| _d S )Nzzero denominator)r+   rP   rT   ZeroDivisionErrorrn   ro   rm   r)   r)   r*   __init__!  s    zFracElement.__init__c                 C  s   |  ||S rc   )	__class__frn   ro   r)   r)   r*   rp   *  s    zFracElement.raw_newc                 C  s   | j || S rc   )rp   rq   r   r)   r)   r*   rr   ,  s    zFracElement.newc                 C  s   | j dkrtd| jS )Nr   zf.denom should be 1)ro   rh   rn   r   r)   r)   r*   rg   /  s    
zFracElement.to_polyc                 C  s
   | j  S rc   )r+   r   ra   r)   r)   r*   parent4  s    zFracElement.parentc                 C  s   | j | j| jfS rc   )r+   rn   ro   ra   r)   r)   r*   rd   7  s    zFracElement.__getnewargs__c                 C  s,   | j }|d kr(t| j| j| jf | _ }|S rc   )rO   rN   r+   rn   ro   )rb   rO   r)   r)   r*   re   <  s    zFracElement.__hash__c                 C  s   |  | j | j S rc   )rp   rn   copyro   ra   r)   r)   r*   r   B  s    zFracElement.copyc                 C  s<   | j |kr| S |j}| j|}| j|}|||S d S rc   )r+   rP   rn   r   ro   rr   )rb   Z	new_fieldZnew_ringrn   ro   r)   r)   r*   	set_fieldE  s    
zFracElement.set_fieldc                 G  s   | j j| | jj|  S rc   )rn   as_exprro   )rb   r%   r)   r)   r*   r   N  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 rc   )rW   rF   r+   rn   ro   rP   rT   r   gr)   r)   r*   rk   Q  s    zFracElement.__eq__c                 C  s
   | |k S rc   r)   r   r)   r)   r*   rl   W  s    zFracElement.__ne__c                 C  s
   t | jS rc   )boolrn   r   r)   r)   r*   __bool__Z  s    zFracElement.__bool__c                 C  s   | j  | j fS rc   )ro   sort_keyrn   ra   r)   r)   r*   r   ]  s    zFracElement.sort_keyc                 C  s(   t || jjr ||  | S tS d S rc   )rW   r+   rR   r   NotImplemented)f1f2opr)   r)   r*   _cmp`  s    zFracElement._cmpc                 C  s   |  |tS rc   )r   r   r   r   r)   r)   r*   __lt__f  s    zFracElement.__lt__c                 C  s   |  |tS rc   )r   r   r   r)   r)   r*   __le__h  s    zFracElement.__le__c                 C  s   |  |tS rc   )r   r	   r   r)   r)   r*   __gt__j  s    zFracElement.__gt__c                 C  s   |  |tS rc   )r   r
   r   r)   r)   r*   __ge__l  s    zFracElement.__ge__c                 C  s   |  | j| jS z"Negate all coefficients in ``f``. rp   rn   ro   r   r)   r)   r*   __pos__o  s    zFracElement.__pos__c                 C  s   |  | j | jS r   r   r   r)   r)   r*   __neg__s  s    zFracElement.__neg__c                 C  s   | j j}z||}W nh tk
r~   |jsx|jrx| }z||}W n tk
r\   Y nX d||||f Y S Y dS X d|d fS d S )N)r   NNr   )	r+   r&   rs   r   rw   rx   ry   rn   ro   )rb   rt   r&   rz   r)   r)   r*   _extract_groundw  s    zFracElement._extract_groundc                 C  s(  | j }|s| S | s|S t||jrn| j|jkrD| | j|j | jS | | j|j | j|j  | j|j S nt||j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+   rW   rR   ro   rr   rn   rP   rF   r&   r   __radd__r   r   r   r   r   r+   r)   r)   r*   __add__  s,    *


zFracElement.__add__c                 C  s   t || jjjr*| | j| j|  | jS | |\}}}|dkr\| | j| j|  | jS |sdtS | | j| | j|  | j| S d S Nr   	rW   r+   rP   rR   rr   rn   ro   r   r   r   cr   g_numerg_denomr)   r)   r*   r     s    zFracElement.__radd__c                 C  s  | j }|s| S | s| S t||jrp| j|jkrF| | j|j | jS | | j|j | j|j  | j|j S nt||j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rT| | j| j|  | jS |s^tS | | j| | j|  | j| S dS )z-Subtract rational functions ``f`` and ``g``. r   N)r+   rW   rR   ro   rr   rn   rP   rF   r&   r   __rsub__r   r   r   r   r   r   r+   r   r   r   r)   r)   r*   __sub__  s6    *



zFracElement.__sub__c                 C  s   t || jjjr,| | j | j|  | jS | |\}}}|dkr`| | j | j|  | jS |sht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 t||jr<| | j|j | j|j S t||jjr^| | 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   rW   rR   rr   rn   ro   rP   rF   r&   r   __rmul__r   r   r   r   r)   r)   r*   __mul__  s$    



zFracElement.__mul__c                 C  st   t || jjjr$| | j| | jS | |\}}}|dkrP| | j| | jS |sXtS | | j| | j| S d S r   r   r   r)   r)   r*   r     s    zFracElement.__rmul__c                 C  s0  | j }|stnt||jr8| | j|j | j|j S t||j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 | |\}}}|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   rW   rR   rr   rn   ro   rP   rF   r&   r   __rtruediv__r   r   r   r   r   r)   r)   r*   __truediv__  s.    




zFracElement.__truediv__c                 C  s~   | s
t n$t|| jjjr.| | j| | jS | |\}}}|dkrZ| | j| | jS |sbt	S | | j| | j| S d S r   )
r   rW   r+   rP   rR   rr   ro   rn   r   r   r   r)   r)   r*   r   2  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)rp   rn   ro   r   )r   nr)   r)   r*   __pow__A  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)

        r6   )rg   rr   rn   diffro   )r   xr)   r)   r*   r   J  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+   rH   evaluater2   rV   r#   rh   )r   r3   r)   r)   r*   r   [  s     zFracElement.__call__c                 C  sx   t |tr<|d kr<dd |D }| j|| j| }}n&| }| j||| j|| }}|j }|||S )Nc                 S  s   g | ]\}}|  |fqS r)   rg   r.   Xar)   r)   r*   r0   c  s     z(FracElement.evaluate.<locals>.<listcomp>)	rW   r2   rn   r   ro   rg   rP   r|   rr   )r   r   r   rn   ro   r+   r)   r)   r*   r   a  s    
zFracElement.evaluatec                 C  sn   t |tr<|d kr<dd |D }| j|| j| }}n&| }| j||| j|| }}| ||S )Nc                 S  s   g | ]\}}|  |fqS r)   r   r   r)   r)   r*   r0   n  s     z$FracElement.subs.<locals>.<listcomp>)rW   r2   rn   subsro   rg   rr   )r   r   r   rn   ro   r)   r)   r*   r   l  s    zFracElement.subsc                 C  s   t d S rc   )r}   )r   r   r   r)   r)   r*   composev  s    zFracElement.compose)N)N)N)N))rI   r   r   r   r   rp   rr   rg   r   rd   rO   re   r   r   r   rk   rl   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*   rF     sL   
		&!	


rF   N)?r   
__future__r   typingr   	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.domainelementr   Z!sympy.polys.domains.fractionfieldr   Z"sympy.polys.domains.polynomialringr   Zsympy.polys.constructorr   Zsympy.polys.orderingsr   Zsympy.polys.polyerrorsr   Zsympy.polys.polyoptionsr   Zsympy.polys.polyutilsr   rG   r   Zsympy.printing.defaultsr   Zsympy.utilitiesr   Zsympy.utilities.iterablesr   Zsympy.utilities.magicr    r+   r,   r1   rB   rC   __annotations__r"   rF   r)   r)   r)   r*   <module>   sH    
4 7