U
    ZÊ¹jýR  ã                   @  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)   úQ/var/www/html/bwave/python/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rŠt	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||ƒsÔt|||
ƒ 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	rödˆ  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 n°t||jjƒr–|  | j| j|  | j¡S t|tƒrèt|jt	ƒr¼|jj |j kr¼n*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 n°t||jjƒr˜|  | j| j|  | j¡S t|tƒrêt|jt	ƒr¾|jj |j kr¾n*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ƒr°t|j	t
ƒr„|j	j |j kr„qàt|j j	t
ƒrª|j j	j |krª| | ¡S tS n0t|tƒràt|j	tƒrÖ|j	j|jkrÖn
| | ¡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‚nÌt||jƒr8|  | j|j | j|j ¡S t||jjƒrZ|  | j| j| ¡S t|tƒr¬t|j	t
ƒr€|j	j |j kr€qÜt|j j	t
ƒr¦|j j	j |kr¦| | ¡S tS n0t|tƒrÜt|j	tƒrÒ|j	j|jkrÒn
| | ¡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