a
    khg                     @  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   A/var/www/auris/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   Z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!   r0   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
        )r6   )r!   r7   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)
        )r6   	from_dict)r!   r9   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!   r@   r   r   r   rA      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_newrB   r   r   r   rC      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)r2   dictr:   r   r%   rB   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!   rG   r   r   r   rH      s    zPuiseuxRing.indexN)__name__
__module____qualname____doc__r)   r-   r5   r   r:   r?   rA   rC   rE   rH   r   r   r   r   r   ;   s   $r   r   zIterable[int])r7   monomr   c                   s*   | j }|j | fdd|  D S )Nc                   s   i | ]\}} ||qS r   r   r   mcdivrM   r   r   
<dictcomp>   r#   z#_div_poly_monom.<locals>.<dictcomp>)r   Zmonomial_divr:   r9   r7   rM   r   r   rQ   r   _div_poly_monom   s    rU   c                   s*   | j }|j| fdd|  D S )Nc                   s   i | ]\}}| |qS r   r   rN   rM   mulr   r   rS      r#   z#_mul_poly_monom.<locals>.<dictcomp>)r   r(   r:   r9   rT   r   rV   r   _mul_poly_monom   s    rX   tuple[int, ...])rM   rR   r   c                 C  s   t dd t| |D S )Nc                 s  s   | ]\}}|| V  qd S r1   r   r   midir   r   r   	<genexpr>   r#   z_div_monom.<locals>.<genexpr>r&   zip)rM   rR   r   r   r   
_div_monom   s    r`   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 )|r6   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   r7   ztuple[int, ...] | NonerM   ns)r7   r   r   c                 C  s   |  ||d d S r1   )_new)clsr7   r   r   r   r   __new__  s    zPuiseuxPoly.__new__)r   r7   rM   ra   r   c                 C  s$   |  |||\}}}| ||||S r1   )
_normalize_new_raw)rc   r   r7   rM   ra   r   r   r   rb     s    zPuiseuxPoly._newc                 C  s&   t | }||_||_||_||_|S r1   )objectrd   r   r7   rM   ra   )rc   r   r7   rM   ra   objr   r   r   rf   $  s    
zPuiseuxPoly._new_rawr   r.   r/   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 r1   )r2   r6   r7   rM   ra   r5   r3   r4   r   r   r   r5   3  s    


zPuiseuxPoly.__eq__zBtuple[PolyElement, tuple[int, ...] | None, tuple[int, ...] | None])r7   rM   ra   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 r1   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 rl   r   r   r=   r   r   r   r]   j  r#   )Ztail_degreesallr_   rU   anyr`   deflatedegreeslenr	   appendinflater&   )rc   r7   rM   ra   ZdegsZ	factors_dZpoly_drr   Zmonom_dZns_newZ	monom_newZ
inflationsfinir\   r[   r   r   r   r   re   ?  sB    






zPuiseuxPoly._normalizerY   ztuple[Any, ...])rM   dmonomra   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 r1   r   r   r[   r\   rw   r   r   r   r]   y  r#   z-PuiseuxPoly._monom_fromint.<locals>.<genexpr>c                 s  s   | ]\}}t || V  qd S r1   r   rZ   r   r   r   r]   {  r#   c                 s  s   | ]\}}t ||V  qd S r1   r   r   r[   rw   r   r   r   r]   }  r#   c                 s  s   | ]}t |V  qd S r1   r   r   r[   r   r   r   r]     r#   r^   rc   rM   rx   ra   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 r1   r;   	numeratorry   r   r   r   r]     s   z+PuiseuxPoly._monom_toint.<locals>.<genexpr>c                 s  s    | ]\}}t |j| V  qd S r1   r~   rZ   r   r   r   r]     r#   c                 s  s    | ]\}}t || jV  qd S r1   r~   rz   r   r   r   r]     r#   c                 s  s   | ]}t |jV  qd S r1   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)rM   ra   r7   
itermonomsr}   )r!   rM   ra   rO   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 r1   )r   r    r   r   r   __iter__  s    zPuiseuxPoly.__iter__)rM   r   c                 C  s   |  || j| j}| j| S r1   )r   rM   ra   r7   )r!   rM   r   r   r   __getitem__  s    zPuiseuxPoly.__getitem__r;   c                 C  s
   t | jS r1   )rs   r7   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)rM   ra   r7   	itertermsr}   )r!   rM   ra   rO   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   r9     s    zPuiseuxPoly.termsc                 C  s   | j jS )z7Return True if the Puiseux polynomial is a single term.)r7   is_termr    r   r   r   r     s    zPuiseuxPoly.is_termr8   c                 C  s   t |  S )z;Return a dictionary representation of a Puiseux polynomial.)rD   r   r    r   r   r   to_dict  s    zPuiseuxPoly.to_dictzdict[tuple[Any, ...], Any])r9   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)
        rm   r   c                 S  s   g | ]\}}t ||jqS r   )r
   denominator)r   r=   rO   r   r   r   r"     r#   z)PuiseuxPoly.from_dict.<locals>.<listcomp>c                 S  s   g | ]\}}t ||qS r   )minr   rO   r=   r   r   r   r"     r#   Nc                 s  s"   | ]\}}t || j V  qd S r1   r~   r   r   r   r   r]     r#   z(PuiseuxPoly.from_dict.<locals>.<genexpr>c                 s  s   | ]}|d kV  qdS rl   r   rn   r   r   r   r]     r#   c                   s    i | ]\}}  ||qS r   )r   )r   rO   r   rc   rM   Zns_finalr   r   rS     r#   z)PuiseuxPoly.from_dict.<locals>.<dictcomp>)	r$   r_   rp   r&   ro   itemsr%   r:   rb   )rc   r9   r   ra   monmoZterms_pr7   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	enumeratert   r   r   )r!   r   domr   r9   rM   r   Z
coeff_exprZmonoms_exprirO   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 )Nrm   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 r1   r   )r   r   er   r   r   r]     r#   z'PuiseuxPoly.__repr__.<locals>.<genexpr>1z + )
r   r   r   sortedr9   joinr_   r'   rt   r*   )r!   r   r   ZsymsZ	terms_strrM   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 r1   )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 r1   r   r   rO   fr   r   r   r]   ;  r#   c                 s  s   | ]\}}|| V  qd S r1   r   r   r   r   r   r]   =  r#   c                 s  s   | ]\}}|| V  qd S r1   r   r   r   r   r   r]   B  r#   c                 s  s   | ]\}}|| V  qd S r1   r   r   r   r   r   r]   G  r#   Fc                 s  s   | ]\}}t ||V  qd S r1   ri   )r   m1m2r   r   r   r]   N  r#   )r7   rM   ra   r&   r_   ru   rX   r`   )r!   r0   poly1Zmonom1Zns1poly2Zmonom2Zns2ra   f1f2rM   r   r   r   _unify&  sR    












zPuiseuxPoly._unifyc                 C  s   | S r1   r   r    r   r   r   __pos__\  s    zPuiseuxPoly.__pos__c                 C  s   |  | j| j | j| jS r1   rf   r   r7   rM   ra   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)r2   r6   r   
ValueError_addr   r;   _add_groundconvert_fromr   of_typer3   r!   r0   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 r1   )	r   r   r2   r;   r   r   r   r   r3   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)r2   r6   r   r   _subr   r;   _sub_groundr   r   r   r3   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 r1   )	r   r   r2   r;   _rsub_groundr   r   r   r3   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)r2   r6   r   r   _mulr   r;   _mul_groundr   r   r   r3   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 r1   )	r   r   r2   r;   r   r   r   r   r3   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   )r2   r;   	_pow_pint	_pow_nintr   r   _pow_rationalr3   r4   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 ringsrm   )r2   r6   r   r   r   _invr   r;   r   r   r   r   _div_groundr3   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 r1   )
r2   r;   r   r   r   r   r   r   r   r3   r4   r   r   r   __rtruediv__  s
    
zPuiseuxPoly.__rtruediv__c                 C  s(   |  |\}}}}| | j|| ||S r1   r   rb   r   r!   r0   r   r   rM   ra   r   r   r   r     s    zPuiseuxPoly._add)groundr   c                 C  s   |  | j|S r1   )r   r   rC   r!   r   r   r   r   r     s    zPuiseuxPoly._add_groundc                 C  s(   |  |\}}}}| | j|| ||S r1   r   r   r   r   r   r     s    zPuiseuxPoly._subc                 C  s   |  | j|S r1   )r   r   rC   r   r   r   r   r     s    zPuiseuxPoly._sub_groundc                 C  s   | j || S r1   )r   rC   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&   rb   r   r   r   r   r   r     s    zPuiseuxPoly._mulc                 C  s   |  | j| j| | j| jS r1   r   r   r   r   r   r     s    zPuiseuxPoly._mul_groundc                 C  s   |  | j| j| | j| jS r1   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 r1   r   r   rO   r=   r   r   r]     r#   z(PuiseuxPoly._pow_pint.<locals>.<genexpr>)rM   r&   rb   r   r7   ra   )r!   r=   rM   r   r   r   r     s
    zPuiseuxPoly._pow_pintc                 C  s   |   |S r1   )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 r1   r   r   r   r   r   r]     r#   z,PuiseuxPoly._pow_rational.<locals>.<genexpr>)	r   r   r9   r   r   is_oner&   r:   r'   )r!   r=   rM   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 r1   r   r   r   r   r   r]     r#   z#PuiseuxPoly._inv.<locals>.<genexpr>rm   )	r   r   r9   r   r   Zis_Fieldr   r&   r:   )r!   rM   r   r   r   r   r   r     s    zPuiseuxPoly._invrF   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
        rm   )r   rH   r   r   r&   )	r!   rG   r   r   r   Zexpvr   r=   r   r   r   r   diff  s    
zPuiseuxPoly.diffN)3rI   rJ   rK   rL   __annotations__rd   classmethodrb   rf   r5   re   r}   r   r   r   r   r   r   r   r9   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   r6      sp   
)
1#6			
r6   N)rL   
__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   rU   rX   r`   r6   r   r   r   r   <module>   s&    