a
    rhg                     @  s  d 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mZ ddlmZ erdd	lmZmZ dd
lmZ ddlmZ ddlmZmZ ddddddZG dd dZddddddZddddddZddddddZG d d! d!Zd"S )#z
Puiseux rings. These are used by the ring_series module to represented
truncated Puiseux series. Elements of a Puiseux ring are like polynomials
except that the exponents can be negative or rational rather than just
non-negative integers.
    )annotationsQQ)PolyRingPolyElement)Add)Mul)gcdlcm)TYPE_CHECKING)AnyUnpack)Expr)Domain)IterableIteratorstr | list[Expr]r   z3tuple[PuiseuxRing, Unpack[tuple[PuiseuxPoly, ...]]])symbolsdomainreturnc                 C  s   t | |}|f|j S )ac  Construct a Puiseux ring.

    This function constructs a Puiseux ring with the given symbols and domain.

    >>> from sympy.polys.domains import QQ
    >>> from sympy.polys.puiseux import puiseux_ring
    >>> R, x, y = puiseux_ring('x y', QQ)
    >>> R
    PuiseuxRing((x, y), QQ)
    >>> p = 5*x**QQ(1,2) + 7/y
    >>> p
    7*y**(-1) + 5*x**(1/2)
    )PuiseuxRinggens)r   r   ring r   O/var/www/html/assistant/venv/lib/python3.9/site-packages/sympy/polys/puiseux.pypuiseux_ring'   s    
r   c                   @  s   e Zd ZdZdddddZddd	d
ZdddddZdddddZdddddZdddddZ	dddddZ
dddd d!Zdddd"d#Zddd$d%d&Zd'S )(r   a  Ring of Puiseux polynomials.

    A Puiseux polynomial is a truncated Puiseux series. The exponents of the
    monomials can be negative or rational numbers. This ring is used by the
    ring_series module:

    >>> from sympy.polys.domains import QQ
    >>> from sympy.polys.puiseux import puiseux_ring
    >>> from sympy.polys.ring_series import rs_exp, rs_nth_root
    >>> ring, x, y = puiseux_ring('x y', QQ)
    >>> f = x**2 + y**3
    >>> f
    y**3 + x**2
    >>> f.diff(x)
    2*x
    >>> rs_exp(x, x, 5)
    1 + x + 1/2*x**2 + 1/6*x**3 + 1/24*x**4

    Importantly the Puiseux ring can represent truncated series with negative
    and fractional exponents:

    >>> f = 1/x + 1/y**2
    >>> f
    x**(-1) + y**(-2)
    >>> f.diff(x)
    -1*x**(-2)

    >>> rs_nth_root(8*x + x**2 + x**3, 3, x, 5)
    2*x**(1/3) + 1/12*x**(4/3) + 23/288*x**(7/3) + -139/20736*x**(10/3)

    See Also
    ========

    sympy.polys.ring_series.rs_series
    PuiseuxPoly
    r   r   r   r   c                   sz   t ||}|j}|j}| _| _|j _t fdd|jD  _| _ |j _ |j	 _	|j
 _
|j _d S )Nc                   s   g | ]}  |qS r   )	from_poly).0gselfr   r   
<listcomp>k       z(PuiseuxRing.__init__.<locals>.<listcomp>)r   r   ngens	poly_ringr   tupler   r   zerooneZ
zero_monommonomial_mul)r!   r   r   r%   r$   r   r    r   __init__`   s    
zPuiseuxRing.__init__strr   c                 C  s   d| j  d| j dS )NzPuiseuxRing(z, )r   r    r   r   r   __repr__t   s    zPuiseuxRing.__repr__r   boolotherr   c                 C  s&   t |tstS | j|jko$| j|jkS N)
isinstancer   NotImplementedr   r   r!   r1   r   r   r   __eq__w   s    
zPuiseuxRing.__eq__r   PuiseuxPoly)polyr   c                 C  s
   t || S )aJ  Create a Puiseux polynomial from a polynomial.

        >>> from sympy.polys.domains import QQ
        >>> from sympy.polys.rings import ring
        >>> from sympy.polys.puiseux import puiseux_ring
        >>> R1, x1 = ring('x', QQ)
        >>> R2, x2 = puiseux_ring('x', QQ)
        >>> R2.from_poly(x1**2)
        x**2
        )r7   )r!   r8   r   r   r   r   |   s    zPuiseuxRing.from_polydict[tuple[int, ...], Any])termsr   c                 C  s   t || S )a  Create a Puiseux polynomial from a dictionary of terms.

        >>> from sympy.polys.domains import QQ
        >>> from sympy.polys.puiseux import puiseux_ring
        >>> R, x = puiseux_ring('x', QQ)
        >>> R.from_dict({(QQ(1,2),): QQ(3)})
        3*x**(1/2)
        )r7   	from_dict)r!   r:   r   r   r   r;      s    	zPuiseuxRing.from_dictintnr   c                 C  s   |  | |S )zCreate a Puiseux polynomial from an integer.

        >>> from sympy.polys.domains import QQ
        >>> from sympy.polys.puiseux import puiseux_ring
        >>> R, x = puiseux_ring('x', QQ)
        >>> R.from_int(3)
        3
        )r   r%   r!   r>   r   r   r   from_int   s    	zPuiseuxRing.from_int)argr   c                 C  s   | j |S )a  Create a new element of the domain.

        >>> from sympy.polys.domains import QQ
        >>> from sympy.polys.puiseux import puiseux_ring
        >>> R, x = puiseux_ring('x', QQ)
        >>> R.domain_new(3)
        3
        >>> QQ.of_type(_)
        True
        )r%   
domain_newr!   rA   r   r   r   rB      s    zPuiseuxRing.domain_newc                 C  s   |  | j|S )a-  Create a new element from a ground element.

        >>> from sympy.polys.domains import QQ
        >>> from sympy.polys.puiseux import puiseux_ring, PuiseuxPoly
        >>> R, x = puiseux_ring('x', QQ)
        >>> R.ground_new(3)
        3
        >>> isinstance(_, PuiseuxPoly)
        True
        )r   r%   
ground_newrC   r   r   r   rD      s    zPuiseuxRing.ground_newc                 C  s(   t |tr| |S | | |S dS )a  Coerce an element into the ring.

        >>> from sympy.polys.domains import QQ
        >>> from sympy.polys.puiseux import puiseux_ring
        >>> R, x = puiseux_ring('x', QQ)
        >>> R(3)
        3
        >>> R({(QQ(1,2),): QQ(3)})
        3*x**(1/2)
        N)r3   dictr;   r   r%   rC   r   r   r   __call__   s    

zPuiseuxRing.__call__xr   c                 C  s   | j |S )a  Return the index of a generator.

        >>> from sympy.polys.domains import QQ
        >>> from sympy.polys.puiseux import puiseux_ring
        >>> R, x, y = puiseux_ring('x y', QQ)
        >>> R.index(x)
        0
        >>> R.index(y)
        1
        )r   index)r!   rH   r   r   r   rI      s    zPuiseuxRing.indexN)__name__
__module____qualname____doc__r*   r.   r6   r   r;   r@   rB   rD   rF   rI   r   r   r   r   r   ;   s   $r   r   zIterable[int])r8   monomr   c                   s*   | j }|j | fdd|  D S )Nc                   s   i | ]\}} ||qS r   r   r   mcdivrN   r   r   
<dictcomp>   r#   z#_div_poly_monom.<locals>.<dictcomp>)r   Zmonomial_divr;   r:   r8   rN   r   r   rR   r   _div_poly_monom   s    rV   c                   s*   | j }|j| fdd|  D S )Nc                   s   i | ]\}}| |qS r   r   rO   rN   mulr   r   rT      r#   z#_mul_poly_monom.<locals>.<dictcomp>)r   r)   r;   r:   rU   r   rW   r   _mul_poly_monom   s    rY   tuple[int, ...])rN   rS   r   c                 C  s   t dd t| |D S )Nc                 s  s   | ]\}}|| V  qd S r2   r   r   midir   r   r   	<genexpr>   r#   z_div_monom.<locals>.<genexpr>r&   zip)rN   rS   r   r   r   
_div_monom   s    ra   c                   @  s  e Zd ZU dZded< ded< ded< ded< ddd d	d
dZeddddd dddZeddddd dddZdddddZ	edddddddZ
edddddddZeddddddd Zd!d"d#d$Zd%d"d&d'Zd(d"d)d*Zddd+d,d-Zd.d"d/d0Zd(d"d1d2Zd3d"d4d5Zedd"d6d7Zd8d"d9d:Zed;dd d<d=d>Zd?d"d@dAZdBd"dCdDZd dEddFdGZd d"dHdIZd d"dJdKZdd ddLdMZdd ddNdOZdd ddPdQZdd ddRdSZ dd ddTdUZ!dd ddVdWZ"dd ddXdYZ#dd ddZd[Z$dd dd\d]Z%d d dd^d_Z&dd d`dadbZ'd d ddcddZ(dd d`dedfZ)dd d`dgdhZ*d d ddidjZ+dd d`dkdlZ,dd d`dmdnZ-d.d dodpdqZ.d.d dodrdsZ/dd dodtduZ0d d"dvdwZ1d d dxdydzZ2d{S )|r7   aR  Puiseux polynomial. Represents a truncated Puiseux series.

    See the :class:`PuiseuxRing` class for more information.

    >>> from sympy import QQ
    >>> from sympy.polys.puiseux import puiseux_ring
    >>> R, x, y = puiseux_ring('x, y', QQ)
    >>> p = 5*x**2 + 7*y**3
    >>> p
    7*y**3 + 5*x**2

    The internal representation of a Puiseux polynomial wraps a normal
    polynomial. To support negative powers the polynomial is considered to be
    divided by a monomial.

    >>> p2 = 1/x + 1/y**2
    >>> p2.monom # x*y**2
    (1, 2)
    >>> p2.poly
    x + y**2
    >>> (y**2 + x) / (x*y**2) == p2
    True

    To support fractional powers the polynomial is considered to be a function
    of ``x**(1/nx), y**(1/ny), ...``. The representation keeps track of a
    monomial and a list of exponent denominators so that the polynomial can be
    used to represent both negative and fractional powers.

    >>> p3 = x**QQ(1,2) + y**QQ(2,3)
    >>> p3.ns
    (2, 3)
    >>> p3.poly
    x + y**2

    See Also
    ========

    sympy.polys.puiseux.PuiseuxRing
    sympy.polys.rings.PolyElement
    r   r   r   r8   ztuple[int, ...] | NonerN   ns)r8   r   r   c                 C  s   |  ||d d S r2   )_new)clsr8   r   r   r   r   __new__  s    zPuiseuxPoly.__new__)r   r8   rN   rb   r   c                 C  s$   |  |||\}}}| ||||S r2   )
_normalize_new_raw)rd   r   r8   rN   rb   r   r   r   rc     s    zPuiseuxPoly._newc                 C  s&   t | }||_||_||_||_|S r2   )objectre   r   r8   rN   rb   )rd   r   r8   rN   rb   objr   r   r   rg   $  s    
zPuiseuxPoly._new_rawr   r/   r0   c                 C  sV   t |tr.| j|jko,| j|jko,| j|jkS | jd u rN| jd u rN| j|S tS d S r2   )r3   r7   r8   rN   rb   r6   r4   r5   r   r   r   r6   3  s    


zPuiseuxPoly.__eq__zBtuple[PolyElement, tuple[int, ...] | None, tuple[int, ...] | None])r8   rN   rb   r   c                 C  s  |d u r|d u r|d d fS |d urxdd |  D }tdd t||D r\t||}d }nt|rxt||}t||}|d urz| \}\}| }|d ur|ndgt| }g }	g }
g }t||||D ]V\}}}}|dkrt	||}nt	|||}|	
||  |

||  |
||  qtdd |D rB||}|}|d urXt|
}tdd |	D rrd }nt|	}|||fS )Nc                 S  s   g | ]}t |d qS )r   max)r   dr   r   r   r"   J  r#   z*PuiseuxPoly._normalize.<locals>.<listcomp>c                 s  s   | ]\}}||kV  qd S r2   r   )r   r]   r\   r   r   r   r^   K  r#   z)PuiseuxPoly._normalize.<locals>.<genexpr>r   c                 s  s   | ]}|d kV  qdS    Nr   )r   Zinflr   r   r   r^   b  r#   c                 s  s   | ]}|d kV  qdS rm   r   r   r>   r   r   r   r^   j  r#   )Ztail_degreesallr`   rV   anyra   deflatedegreeslenr	   appendinflater&   )rd   r8   rN   rb   ZdegsZ	factors_dZpoly_drs   Zmonom_dZns_newZ	monom_newZ
inflationsfinir]   r\   r   r   r   r   rf   ?  sB    






zPuiseuxPoly._normalizerZ   ztuple[Any, ...])rN   dmonomrb   r   c                 C  s   |d ur*|d ur*t dd t|||D S |d urJt dd t||D S |d urjt dd t||D S t dd |D S d S )Nc                 s  s"   | ]\}}}t || |V  qd S r2   r   r   r\   r]   rx   r   r   r   r^   y  r#   z-PuiseuxPoly._monom_fromint.<locals>.<genexpr>c                 s  s   | ]\}}t || V  qd S r2   r   r[   r   r   r   r^   {  r#   c                 s  s   | ]\}}t ||V  qd S r2   r   r   r\   rx   r   r   r   r^   }  r#   c                 s  s   | ]}t |V  qd S r2   r   r   r\   r   r   r   r^     r#   r_   rd   rN   ry   rb   r   r   r   _monom_fromintq  s    zPuiseuxPoly._monom_fromintc                 C  s   |d ur*|d ur*t dd t|||D S |d urJt dd t||D S |d urjt dd t||D S t dd |D S d S )Nc                 s  s&   | ]\}}}t || j| V  qd S r2   r<   	numeratorrz   r   r   r   r^     s   z+PuiseuxPoly._monom_toint.<locals>.<genexpr>c                 s  s    | ]\}}t |j| V  qd S r2   r   r[   r   r   r   r^     r#   c                 s  s    | ]\}}t || jV  qd S r2   r   r{   r   r   r   r^     r#   c                 s  s   | ]}t |jV  qd S r2   r   r|   r   r   r   r^     r#   r_   r}   r   r   r   _monom_toint  s    
zPuiseuxPoly._monom_tointzIterator[tuple[Any, ...]]r,   c                 c  s2   | j | j }}| j D ]}| |||V  qdS )a@  Iterate over the monomials of a Puiseux polynomial.

        >>> from sympy import QQ
        >>> from sympy.polys.puiseux import puiseux_ring
        >>> R, x, y = puiseux_ring('x, y', QQ)
        >>> p = 5*x**2 + 7*y**3
        >>> list(p.itermonoms())
        [(2, 0), (0, 3)]
        >>> p[(2, 0)]
        5
        N)rN   rb   r8   
itermonomsr~   )r!   rN   rb   rP   r   r   r   r     s    zPuiseuxPoly.itermonomszlist[tuple[Any, ...]]c                 C  s   t |  S )z7Return a list of the monomials of a Puiseux polynomial.)listr   r    r   r   r   monoms  s    zPuiseuxPoly.monomsz%Iterator[tuple[tuple[Any, ...], Any]]c                 C  s   |   S r2   )r   r    r   r   r   __iter__  s    zPuiseuxPoly.__iter__)rN   r   c                 C  s   |  || j| j}| j| S r2   )r   rN   rb   r8   )r!   rN   r   r   r   __getitem__  s    zPuiseuxPoly.__getitem__r<   c                 C  s
   t | jS r2   )rt   r8   r    r   r   r   __len__  s    zPuiseuxPoly.__len__c                 c  s>   | j | j }}| j D ] \}}| |||}||fV  qdS )a%  Iterate over the terms of a Puiseux polynomial.

        >>> from sympy import QQ
        >>> from sympy.polys.puiseux import puiseux_ring
        >>> R, x, y = puiseux_ring('x, y', QQ)
        >>> p = 5*x**2 + 7*y**3
        >>> list(p.iterterms())
        [((2, 0), 5), ((0, 3), 7)]
        N)rN   rb   r8   	itertermsr~   )r!   rN   rb   rP   coeffZmqr   r   r   r     s    
zPuiseuxPoly.itertermsz!list[tuple[tuple[Any, ...], Any]]c                 C  s   t |  S )z3Return a list of the terms of a Puiseux polynomial.)r   r   r    r   r   r   r:     s    zPuiseuxPoly.termsc                 C  s   | j jS )z7Return True if the Puiseux polynomial is a single term.)r8   is_termr    r   r   r   r     s    zPuiseuxPoly.is_termr9   c                 C  s   t |  S )z;Return a dictionary representation of a Puiseux polynomial.)rE   r   r    r   r   r   to_dict  s    zPuiseuxPoly.to_dictzdict[tuple[Any, ...], Any])r:   r   r   c                   s   dg|j  }dg|j  }|D ],}dd t||D }dd t||D }qt|sXdntdd t||D td	d |D rdnt| fd
d| D }|j|} ||S )a^  Create a Puiseux polynomial from a dictionary of terms.

        >>> from sympy import QQ
        >>> from sympy.polys.puiseux import puiseux_ring, PuiseuxPoly
        >>> R, x = puiseux_ring('x', QQ)
        >>> PuiseuxPoly.from_dict({(QQ(1,2),): QQ(3)}, R)
        3*x**(1/2)
        >>> R.from_dict({(QQ(1,2),): QQ(3)})
        3*x**(1/2)
        rn   r   c                 S  s   g | ]\}}t ||jqS r   )r
   denominator)r   r>   rP   r   r   r   r"     r#   z)PuiseuxPoly.from_dict.<locals>.<listcomp>c                 S  s   g | ]\}}t ||qS r   )minr   rP   r>   r   r   r   r"     r#   Nc                 s  s"   | ]\}}t || j V  qd S r2   r   r   r   r   r   r^     r#   z(PuiseuxPoly.from_dict.<locals>.<genexpr>c                 s  s   | ]}|d kV  qdS rm   r   ro   r   r   r   r^     r#   c                   s    i | ]\}}  ||qS r   )r   )r   rP   r   rd   rN   Zns_finalr   r   rT     r#   z)PuiseuxPoly.from_dict.<locals>.<dictcomp>)	r$   r`   rq   r&   rp   itemsr%   r;   rc   )rd   r:   r   rb   monmoZterms_pr8   r   r   r   r;     s    zPuiseuxPoly.from_dictr   c                 C  sx   | j }|j}|j}g }|  D ]P\}}||}g }t|D ]\}	}
|||	 |
  q<|t|g|R   qt| S )aO  Convert a Puiseux polynomial to :class:`~sympy.core.expr.Expr`.

        >>> from sympy import QQ, Expr
        >>> from sympy.polys.puiseux import puiseux_ring
        >>> R, x = puiseux_ring('x', QQ)
        >>> p = 5*x**2 + 7*x**3
        >>> p.as_expr()
        7*x**3 + 5*x**2
        >>> isinstance(_, Expr)
        True
        )	r   r   r   r   Zto_sympy	enumerateru   r   r   )r!   r   domr   r:   rN   r   Z
coeff_exprZmonoms_exprirP   r   r   r   as_expr  s    
zPuiseuxPoly.as_exprr+   c                   s   dddddd | j }|j}dd |jD }g }t|  D ]t\}}d fd	d
t||D }||jkr|r~|| q|d q>|s|t	| q>|| d|  q>d|S )Nr+   r<   )baseexpr   c                 S  sB   |dkr| S |dkr.t ||kr.|  d| S |  d| dS d S )Nrn   r   z**z**(r-   )r<   )r   r   r   r   r   format_power  s
    z*PuiseuxPoly.__repr__.<locals>.format_powerc                 S  s   g | ]}t |qS r   )r+   )r   sr   r   r   r"     r#   z(PuiseuxPoly.__repr__.<locals>.<listcomp>*c                 3  s    | ]\}}|r ||V  qd S r2   r   )r   r   er   r   r   r^     r#   z'PuiseuxPoly.__repr__.<locals>.<genexpr>1z + )
r   r   r   sortedr:   joinr`   r(   ru   r+   )r!   r   r   ZsymsZ	terms_strrN   r   Z	monom_strr   r   r   r.   	  s    
zPuiseuxPoly.__repr__zOtuple[PolyElement, PolyElement, tuple[int, ...] | None, tuple[int, ...] | None]c                 C  s(  | j | j| j  }}}|j |j|j  }}}||krH||krH||||fS ||krX|}n(|dur|durtdd t||D }dd t||D }	dd t||D }
||	}||
}|durtdd t||	D }|durtdd t||
D }n|dur:|}||}|durtd	d t||D }nF|durv|}||}|durtd
d t||D }n
dsJ ||kr|}n|dur|durtdd t||D }t|t||}t|t||}n>|dur|}t||}n$|dur|}t||}n
dsJ ||||fS )z7Bring two Puiseux polynomials to a common monom and ns.Nc                 s  s   | ]\}}t ||V  qd S r2   )r
   )r   n1n2r   r   r   r^   5  r#   z%PuiseuxPoly._unify.<locals>.<genexpr>c                 S  s   g | ]\}}|| qS r   r   )r   r>   r   r   r   r   r"   6  r#   z&PuiseuxPoly._unify.<locals>.<listcomp>c                 S  s   g | ]\}}|| qS r   r   )r   r>   r   r   r   r   r"   7  r#   c                 s  s   | ]\}}|| V  qd S r2   r   r   rP   fr   r   r   r^   ;  r#   c                 s  s   | ]\}}|| V  qd S r2   r   r   r   r   r   r^   =  r#   c                 s  s   | ]\}}|| V  qd S r2   r   r   r   r   r   r^   B  r#   c                 s  s   | ]\}}|| V  qd S r2   r   r   r   r   r   r^   G  r#   Fc                 s  s   | ]\}}t ||V  qd S r2   rj   )r   m1m2r   r   r   r^   N  r#   )r8   rN   rb   r&   r`   rv   rY   ra   )r!   r1   poly1Zmonom1Zns1poly2Zmonom2Zns2rb   f1f2rN   r   r   r   _unify&  sR    












zPuiseuxPoly._unifyc                 C  s   | S r2   r   r    r   r   r   __pos__\  s    zPuiseuxPoly.__pos__c                 C  s   |  | j| j | j| jS r2   rg   r   r8   rN   rb   r    r   r   r   __neg___  s    zPuiseuxPoly.__neg__c                 C  sl   t |tr(| j|jkrtd| |S | jj}t |trP| |t	|t	S |
|rd| |S tS d S )Nz3Cannot add Puiseux polynomials from different rings)r3   r7   r   
ValueError_addr   r<   _add_groundconvert_fromr   of_typer4   r!   r1   r   r   r   r   __add__b  s    




zPuiseuxPoly.__add__c                 C  sD   | j j}t|tr(| |t|tS ||r<| |S tS d S r2   )	r   r   r3   r<   r   r   r   r   r4   r   r   r   r   __radd__o  s    


zPuiseuxPoly.__radd__c                 C  sl   t |tr(| j|jkrtd| |S | jj}t |trP| |t	|t	S |
|rd| |S tS d S )Nz8Cannot subtract Puiseux polynomials from different rings)r3   r7   r   r   _subr   r<   _sub_groundr   r   r   r4   r   r   r   r   __sub__x  s    




zPuiseuxPoly.__sub__c                 C  sD   | j j}t|tr(| |t|tS ||r<| |S tS d S r2   )	r   r   r3   r<   _rsub_groundr   r   r   r4   r   r   r   r   __rsub__  s    


zPuiseuxPoly.__rsub__c                 C  sl   t |tr(| j|jkrtd| |S | jj}t |trP| |t	|t	S |
|rd| |S tS d S )Nz8Cannot multiply Puiseux polynomials from different rings)r3   r7   r   r   _mulr   r<   _mul_groundr   r   r   r4   r   r   r   r   __mul__  s    




zPuiseuxPoly.__mul__c                 C  sD   | j j}t|tr(| |t|tS ||r<| |S tS d S r2   )	r   r   r3   r<   r   r   r   r   r4   r   r   r   r   __rmul__  s    


zPuiseuxPoly.__rmul__c                 C  sF   t |tr*|dkr| |S | | S nt|r>| |S tS d S )Nr   )r3   r<   	_pow_pint	_pow_nintr   r   _pow_rationalr4   r5   r   r   r   __pow__  s    



zPuiseuxPoly.__pow__c                 C  sr   t |tr,| j|jkrtd| | S | jj}t |trV| |	t
d|t
S ||rj| |S tS d S )Nz6Cannot divide Puiseux polynomials from different ringsrn   )r3   r7   r   r   r   _invr   r<   r   r   r   r   _div_groundr4   r   r   r   r   __truediv__  s    



zPuiseuxPoly.__truediv__c                 C  sL   t |tr(|  | jjt|tS | jj|rD|  |S t	S d S r2   )
r3   r<   r   r   r   r   r   r   r   r4   r5   r   r   r   __rtruediv__  s
    
zPuiseuxPoly.__rtruediv__c                 C  s(   |  |\}}}}| | j|| ||S r2   r   rc   r   r!   r1   r   r   rN   rb   r   r   r   r     s    zPuiseuxPoly._add)groundr   c                 C  s   |  | j|S r2   )r   r   rD   r!   r   r   r   r   r     s    zPuiseuxPoly._add_groundc                 C  s(   |  |\}}}}| | j|| ||S r2   r   r   r   r   r   r     s    zPuiseuxPoly._subc                 C  s   |  | j|S r2   )r   r   rD   r   r   r   r   r     s    zPuiseuxPoly._sub_groundc                 C  s   | j || S r2   )r   rD   r   r   r   r   r   r     s    zPuiseuxPoly._rsub_groundc                 C  sB   |  |\}}}}|d ur,tdd |D }| | j|| ||S )Nc                 s  s   | ]}d | V  qdS )   Nr   )r   r   r   r   r   r^     r#   z#PuiseuxPoly._mul.<locals>.<genexpr>)r   r&   rc   r   r   r   r   r   r     s    zPuiseuxPoly._mulc                 C  s   |  | j| j| | j| jS r2   r   r   r   r   r   r     s    zPuiseuxPoly._mul_groundc                 C  s   |  | j| j| | j| jS r2   r   r   r   r   r   r     s    zPuiseuxPoly._div_groundr=   c                   sJ    dksJ | j }|d ur0t fdd|D }| | j| j  || jS )Nr   c                 3  s   | ]}|  V  qd S r2   r   r   rP   r>   r   r   r^     r#   z(PuiseuxPoly._pow_pint.<locals>.<genexpr>)rN   r&   rc   r   r8   rb   )r!   r>   rN   r   r   r   r     s
    zPuiseuxPoly._pow_pintc                 C  s   |   |S r2   )r   r   r?   r   r   r   r     s    zPuiseuxPoly._pow_nintc                   s^   | j std|  \\}}| jj}||s6tdt fdd|D }| j||jiS )Nz0Only monomials can be raised to a rational powerc                 3  s   | ]}|  V  qd S r2   r   r   r   r   r   r^     r#   z,PuiseuxPoly._pow_rational.<locals>.<genexpr>)	r   r   r:   r   r   is_oner&   r;   r(   )r!   r>   rN   r   r   r   r   r   r     s    
zPuiseuxPoly._pow_rationalc                 C  sf   | j std|  \\}}| jj}|js<||s<tdtdd |D }d| }| j||iS )NzOnly terms can be invertedz"Cannot invert non-unit coefficientc                 s  s   | ]}| V  qd S r2   r   r   r   r   r   r^     r#   z#PuiseuxPoly._inv.<locals>.<genexpr>rn   )	r   r   r:   r   r   Zis_Fieldr   r&   r;   )r!   rN   r   r   r   r   r   r     s    zPuiseuxPoly._invrG   c           	      C  sb   | j }||}i }|  D ]<\}}|| }|rt|}||  d8  < || |t|< q||S )a:  Differentiate a Puiseux polynomial with respect to a variable.

        >>> from sympy import QQ
        >>> from sympy.polys.puiseux import puiseux_ring
        >>> R, x, y = puiseux_ring('x, y', QQ)
        >>> p = 5*x**2 + 7*y**3
        >>> p.diff(x)
        10*x
        >>> p.diff(y)
        21*y**2
        rn   )r   rI   r   r   r&   )	r!   rH   r   r   r   Zexpvr   r>   r   r   r   r   diff  s    
zPuiseuxPoly.diffN)3rJ   rK   rL   rM   __annotations__re   classmethodrc   rg   r6   rf   r~   r   r   r   r   r   r   r   r:   propertyr   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   r   r   r   r   r   r7      sp   
)
1#6			
r7   N)rM   
__future__r   Zsympy.polys.domainsr   Zsympy.polys.ringsr   r   Zsympy.core.addr   Zsympy.core.mulr   Zsympy.external.gmpyr	   r
   typingr   r   r   Zsympy.core.exprr   r   collections.abcr   r   r   r   rV   rY   ra   r7   r   r   r   r   <module>   s&    