o
    8VaR                     @   s  d Z ddlmZ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 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l0m1Z1 ddl2m3Z3 ddl4m5Z5 e3e'fddZ6e3e'fddZ7e3e'fddZ8e3dd  Z9i Z:G d!d" d"e1Z;G d#d$ d$ee1eZ<d%S )&z!Sparse rational function fields.     )AnyDict)reduce)addmulltlegtge)is_sequence)Expr)Mod)Exp1)S)Symbol)CantSympifysympify)ExpBase)DomainElementFractionField)PolynomialRing)construct_domain)lex)CoercionFailed)build_options)_parallel_dict_from_expr)PolyElement)DefaultPrinting)public)pollutec                 C   s   t | ||}|f|j S )zFConstruct new rational function field returning (field, x1, ..., xn). 	FracFieldgenssymbolsdomainorder_field r)   4/usr/lib/python3/dist-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).0Zsymr)   r)   r*   
<listcomp>.   s    zvfield.<locals>.<listcomp>)r"   r    r%   r#   r$   r)   r)   r*   vfield*   s   r0   c              	   O   s   d}t | s| gd} }ttt| } t||}g }| D ]	}||  qt||\}}|jdu rEt	dd |D g }t
||d\|_}	t|j|j|j}
g }tdt|dD ]}||
t|||d   qX|rr|
|d fS |
|f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.core import symbols
    >>> from sympy.functions import exp, log
    >>> from sympy.polys.fields import 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.   Zrepr)   r)   r*   r/   Y   s    zsfield.<locals>.<listcomp>)optr      )r   r1   mapr   r   extendZas_numer_denomr   r&   sumr   r"   r#   r'   rangelenappendtuple)Zexprsr%   optionsZsingler3   ZnumdensexprZrepsZcoeffs_r(   Zfracsir)   r)   r*   sfield1   s&   

 r@   c                   @   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 u rt	
| }||_t||_||_tdtfd|i|_||_||_||_||_||j|_||j|_| |_t|j|jD ]\}	}
t|	tr|	j}t||st|||
 qi|t|< |S )Nr   PolyRingFracElementr+   )sympy.polys.ringsrB   r%   ngensr&   r'   __name___field_cachegetobject__new___hash_tuplehash_hashringtyperC   dtypezeroone_gensr#   zip
isinstancer   r-   hasattrsetattr)clsr%   r&   r'   rB   rN   rE   rK   objsymbol	generatorr-   r)   r)   r*   rJ   k   s:   





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)   rP   r.   genselfr)   r*   r/      s    z#FracField._gens.<locals>.<listcomp>)r;   rN   r#   r_   r)   r_   r*   rS      s   zFracField._gensc                 C      | j | j| jfS N)r%   r&   r'   r_   r)   r)   r*   __getnewargs__      zFracField.__getnewargs__c                 C   s   | j S rb   )rM   r_   r)   r)   r*   __hash__   s   zFracField.__hash__c                 C   s.   t || jr| j| S td| j|f )Nzexpected a %s, got %s instead)rU   rP   rN   indexto_poly
ValueError)r`   r^   r)   r)   r*   rf      s   zFracField.indexc                 C   s2   t |to| j| j| j| jf|j|j|j|jfkS rb   )rU   r"   r%   rE   r&   r'   r`   otherr)   r)   r*   __eq__   s
   
zFracField.__eq__c                 C   
   | |k S rb   r)   ri   r)   r)   r*   __ne__      
zFracField.__ne__Nc                 C      |  ||S rb   r\   r`   numerdenomr)   r)   r*   raw_new      zFracField.raw_newc                 C   s*   |d u r| j j}||\}}| ||S rb   )rN   rR   cancelrs   rp   r)   r)   r*   new   s   zFracField.newc                 C   s   | j |S rb   )r&   convert)r`   elementr)   r)   r*   
domain_new   rt   zFracField.domain_newc                 C   s   z
|  | j|W S  ty?   | j}|js>|jr>| j}| }||}||	|}||
|}| || Y S  w rb   )rv   rN   
ground_newr   r&   is_Fieldhas_assoc_Field	get_fieldrw   rq   rr   rs   )r`   rx   r&   rN   ground_fieldrq   rr   r)   r)   r*   rz      s   
zFracField.ground_newc                 C   sb  t |tr6| |jkr|S t | jtr| jj|jkr| |S t | jtr2| jj |jkr2| |S t	dt |t
r}| \}}t | jtrU|j| jjkrU| j|}nt | jtrk|j| jj krk| j|}n|| j}| j|}| ||S t |trt|dkrtt| jj|\}}| ||S t |trt	dt |tr| |S | |S )N
conversionr4   Zparsing)rU   rC   r+   r&   r   rz   r   rN   to_fieldNotImplementedErrorr   Zclear_denomsto_ringset_ringrs   r;   r9   r1   r5   Zring_newrv   strr   	from_expr)r`   rx   rr   rq   r)   r)   r*   	field_new   sB   








zFracField.field_newc                    s:   | j tdd  D  fdd  t|S )Nc                 s   s,    | ]}|j st|tr|| fV  qd S rb   )is_PowrU   r   as_base_expr]   r)   r)   r*   	<genexpr>   s    z*FracField._rebuild_expr.<locals>.<genexpr>c                    s   | }|d ur|S | jrtttt | jS | jr'tttt | jS | j	s1t
| ttfrh|  \}}D ]\}\}}||krWt||dkrW |t||    S q9|jrh|tjurh |t| S z| W S  ty   jsjr |  Y S  w )Nr   )rH   Zis_Addr   r   r1   r5   argsZis_Mulr   r   rU   r   r   r   r   intZ
is_Integerr   ZOnerw   r   r{   r|   r}   )r=   r[   ber^   bgZeg_rebuildr&   mappingZpowersr)   r*   r      s,   
z)FracField._rebuild_expr.<locals>._rebuild)r&   r;   keysr   )r`   r=   r   r)   r   r*   _rebuild_expr   s   zFracField._rebuild_exprc                 C   sP   t tt| j| j}z| ||}W n ty"   td| |f w | |S )NzGexpected an expression convertible to a rational function in %s, got %s)	dictr1   rT   r%   r#   r   r   rh   r   )r`   r=   r   Zfracr)   r)   r*   r     s   
zFracField.from_exprc                 C   s   t | S rb   r   r_   r)   r)   r*   	to_domain  s   zFracField.to_domainc                 C   s   ddl m} || j| j| jS )Nr   rA   )rD   rB   r%   r&   r'   )r`   rB   r)   r)   r*   r     s   zFracField.to_ringrb   )rF   
__module____qualname____doc__r   rJ   rS   rc   re   rf   rk   rm   rs   rv   ry   rz   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%dKdEdFZ&dKdGdHZ'dKdIdJZ(dS )LrC   z=Element of multivariate distributed rational function field. Nc                 C   s0   |d u r
| j jj}n|std|| _|| _d S )Nzzero denominator)r+   rN   rR   ZeroDivisionErrorrq   rr   rp   r)   r)   r*   __init__  s   
zFracElement.__init__c                 C   ro   rb   )	__class__frq   rr   r)   r)   r*   rs   (  rt   zFracElement.raw_newc                 C   s   | j || S rb   )rs   ru   r   r)   r)   r*   rv   *  rd   zFracElement.newc                 C   s   | j dkr	td| jS )N   zf.denom should be 1)rr   rh   rq   r   r)   r)   r*   rg   -  s   
zFracElement.to_polyc                 C   s
   | j  S rb   )r+   r   r_   r)   r)   r*   parent2  rn   zFracElement.parentc                 C   ra   rb   )r+   rq   rr   r_   r)   r)   r*   rc   5  rd   zFracElement.__getnewargs__c                 C   s,   | j }|d u rt| j| j| jf | _ }|S rb   )rM   rL   r+   rq   rr   )r`   rM   r)   r)   r*   re   :  s   zFracElement.__hash__c                 C   s   |  | j | j S rb   )rs   rq   copyrr   r_   r)   r)   r*   r   @     zFracElement.copyc                 C   s8   | j |kr| S |j}| j|}| j|}|||S rb   )r+   rN   rq   r   rr   rv   )r`   Z	new_fieldZnew_ringrq   rr   r)   r)   r*   	set_fieldC  s   
zFracElement.set_fieldc                 G   s   | j j| | jj|  S rb   )rq   as_exprrr   )r`   r%   r)   r)   r*   r   L  r   zFracElement.as_exprc                 C   sH   t |tr| j|jkr| j|jko| j|jkS | j|ko#| j| jjjkS rb   )rU   rC   r+   rq   rr   rN   rR   r   gr)   r)   r*   rk   O  s   zFracElement.__eq__c                 C   rl   rb   r)   r   r)   r)   r*   rm   U  rn   zFracElement.__ne__c                 C   s
   t | jS rb   )boolrq   r   r)   r)   r*   __bool__X  rn   zFracElement.__bool__c                 C   s   | j  | j fS rb   )rr   sort_keyrq   r_   r)   r)   r*   r   [  s   zFracElement.sort_keyc                 C   s$   t || jjr||  | S tS rb   )rU   r+   rP   r   NotImplemented)f1f2opr)   r)   r*   _cmp^  s   zFracElement._cmpc                 C      |  |tS rb   )r   r   r   r   r)   r)   r*   __lt__d  rt   zFracElement.__lt__c                 C   r   rb   )r   r   r   r)   r)   r*   __le__f  rt   zFracElement.__le__c                 C   r   rb   )r   r	   r   r)   r)   r*   __gt__h  rt   zFracElement.__gt__c                 C   r   rb   )r   r
   r   r)   r)   r*   __ge__j  rt   zFracElement.__ge__c                 C   s   |  | j| jS z"Negate all coefficients in ``f``. rs   rq   rr   r   r)   r)   r*   __pos__m  s   zFracElement.__pos__c                 C   s   |  | j | jS r   r   r   r)   r)   r*   __neg__q  s   zFracElement.__neg__c                 C   s   | j j}z||}W n4 ty?   |js<|jr<| }z||}W n ty.   Y Y dS w d||||f Y S Y dS w d|d fS )N)r   NNr   )	r+   r&   rw   r   r{   r|   r}   rq   rr   )r`   rx   r&   r~   r)   r)   r*   _extract_groundu  s    
zFracElement._extract_groundc                 C   s  | j }|s| S | s|S t||jr6| j|jkr"| | j|j | jS | | j|j | j|j  | j|j S t||jjrJ| | j| j|  | jS t|trrt|jt	r]|jj |j kr]n-t|j jt	rp|j jj |krp|
| S tS t|trt|jtr|jj|jkrn|
| S | 
|S )z(Add rational functions ``f`` and ``g``. )r+   rU   rP   rr   rv   rq   rN   rC   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 |s2tS | | j| | j|  | j| S Nr   	rU   r+   rN   rP   rv   rq   rr   r   r   r   cr   g_numerg_denomr)   r)   r*   r     s   "zFracElement.__radd__c                 C   sr  | j }|s| S | s| S t||jr7| j|jkr#| | j|j | jS | | j|j | j|j  | j|j S t||jjrK| | j| j|  | jS t|trst|jt	r^|jj |j kr^n-t|j jt	rq|j jj |krq|
| S tS t|trt|jtr|jj|jkrn|
| S | |\}}}|dkr| | j| j|  | jS |stS | | j| | j|  | j| S )z-Subtract rational functions ``f`` and ``g``. r   )r+   rU   rP   rr   rv   rq   rN   rC   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r0| | j | j|  | jS |s4tS | | j | | j|  | j| 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rWt|j	t
rB|j	j |j krBn-t|j j	t
rU|j j	j |krU|| S tS t|trot|j	trj|j	j|jkrjn|| S | |S )z-Multiply rational functions ``f`` and ``g``. )r+   rQ   rU   rP   rv   rq   rr   rN   rC   r&   r   __rmul__r   r   r   r   r)   r)   r*   __mul__  s$   




zFracElement.__mul__c                 C   sp   t || jjjr| | j| | jS | |\}}}|dkr(| | j| | jS |s,tS | | j| | j| S r   r   r   r)   r)   r*   r     s   zFracElement.__rmul__c                 C   s$  | j }|stt||jr| | j|j | j|j S t||jjr,| | j| j| S t|trTt|j	t
r?|j	j |j kr?n-t|j j	t
rR|j j	j |krR|| S tS t|trlt|j	trg|j	j|jkrgn|| S | |\}}}|dkr| | j| j| S |stS | | j| | j| S )z0Computes quotient of fractions ``f`` and ``g``. r   )r+   r   rU   rP   rv   rq   rr   rN   rC   r&   r   __rtruediv__r   r   r   r   r   r)   r)   r*   __truediv__  s.   



zFracElement.__truediv__c                 C   sx   | st t|| jjjr| | j| | jS | |\}}}|dkr,| | j| | jS |s0t	S | | j| | j| S r   )
r   rU   r+   rN   rP   rv   rr   rq   r   r   r   r)   r)   r*   r   0  s   zFracElement.__rtruediv__c                 C   sD   |dkr|  | j| | j| S | st|  | j|  | j|  S )z+Raise ``f`` to a non-negative power ``n``. r   )rs   rq   rr   r   )r   nr)   r)   r*   __pow__?  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)

        r4   )rg   rv   rq   diffrr   )r   xr)   r)   r*   r   H  s   2zFracElement.diffc                 G   sP   dt |  k r| jjkrn n| tt| jj|S td| jjt |f )Nr   z1expected at least 1 and at most %s values, got %s)r9   r+   rE   evaluater1   rT   r#   rh   )r   r2   r)   r)   r*   r   Y  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      g | ]
\}}|  |fqS r)   rg   r.   Xar)   r)   r*   r/   a      z(FracElement.evaluate.<locals>.<listcomp>)	rU   r1   rq   r   rr   rg   rN   r   rv   )r   r   r   rq   rr   r+   r)   r)   r*   r   _  s   
zFracElement.evaluatec                 C   sn   t |tr|d u rdd |D }| j|| j|}}n| }| j||| j||}}| ||S )Nc                 S   r   r)   r   r   r)   r)   r*   r/   l  r   z$FracElement.subs.<locals>.<listcomp>)rU   r1   rq   subsrr   rg   rv   )r   r   r   rq   rr   r)   r)   r*   r   j  s   zFracElement.subsc                 C   s   t rb   )r   )r   r   r   r)   r)   r*   composet  s   zFracElement.composerb   ))rF   r   r   r   r   rs   rv   rg   r   rc   rM   re   r   r   r   rk   rm   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*   rC     sN    
		&!	


rC   N)=r   typingr   r   	functoolsr   operatorr   r   r   r   r	   r
   Zsympy.core.compatibilityr   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   rD   r   Zsympy.printing.defaultsr   Zsympy.utilitiesr   Zsympy.utilities.magicr    r+   r,   r0   r@   rG   r"   rC   r)   r)   r)   r*   <module>   sH     
4 5